我遍历该计划的全球变量,并对他们的类型感兴趣。
对于测试,例如:
#include <stdio.h>
int i=0;
int main(){
printf("lala %d \n",i);
return 0;
}
我得到的输出是:
Globals:
i Type: 14 //14 ==> POINTER TYPE ID !
StackLock: Stack1
Function Argument: i32* @i
我的代码:
for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) {
std::cout << I->getName().str() << " Type: "<< I->getType()->getTypeID() << std::endl;
if (I->getType()->isPointerTy() ) {
std::string o1;
{
raw_string_ostream os1(o1);
I->printAsOperand(os1, true);
}
char* stackLoc = new char[50];
sprintf(stackLoc, "Stack%d", StackCounter++);
errs() << "StackLock: " << stackLoc << "\n";
errs() << "Function Argument: " << o1 << "\n";
}
}
将所有内容设置为指针的含义是什么? 有没有办法采取'真实'类型?例如,在我的例子中:获取i变量的Integer Type。
答案 0 :(得分:2)
根据LLVM IR Reference,全局变量定义在编译时而不是运行时分配的内存区域,并且必须对它们进行初始化。
作为SSA值,全局变量定义其中的指针值 范围(即它们占主导地位)程序中的所有基本块。全球 变量总是定义指向其“内容”类型的指针,因为它们 描述一个内存区域,LLVM中的所有内存对象都是 通过指针访问。
要获取全局变量的实际类型,因为全局变量的LLVM IR内部类型是指针,Type::getContainedType(int)
或Type::getPointerElementType()
可用于获取指针的指针类型,因为指针type是派生类型。