在LLVM IR中一切都是指针吗?

Is everything a pointer in LLVM IR?

本文关键字:指针 LLVM IR      更新时间:2023-10-16

我遍历了程序的全局变量,对它们的类型很感兴趣。

用于测试,如:

#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变量的整数类型。

根据LLVM IR Reference,全局变量定义了在编译时而不是运行时分配的内存区域,并且必须对它们进行初始化。

作为SSA值,全局变量定义的指针值在作用域(即它们主导)程序中的所有基本块。全球变量总是定义指向其"内容"类型的指针,因为它们描述一个内存区域,LLVM中的所有内存对象都是通过指针访问。

要获得全局变量的实际类型,由于全局变量的LLVM IR内部类型是指针,因此可以使用Type::getContainedType(int)Type::getPointerElementType()来获取指针的指针类型,因为指针类型是派生类型。