LLVM中的非指针全局变量

Non pointer global variables in LLVM

本文关键字:指针 全局变量 LLVM      更新时间:2023-10-16

我正在编写一个函数pass,并希望在初始化阶段添加一个int类型的全局变量,用于pass的实际工作。

到目前为止,我有

bool doInitialization(Module &M) {
    LLVMContext &c = M.getContext();
    Type *intTy = TypeBuilder<int,false>::get(c);
    Value *p = M.getOrInsertGlobal("var1",intTy);
    return true
}

无论出于何种原因,var1的类型都是int*。例如,在声明之后添加

Type *pt = p->getType();
if (isa<PointerType>(pt)) {
    errs().write_escaped("Is a pointer ty") << 'n';
}

当编译的代码运行时,将以打印结束,并且

if ((intTy->getPointerTo()) == (p->getType())) {
  errs().write_escaped("This is confusing") << 'n';
}

将再次打印字符串。

是否可以使用此方法添加int类型的全局变量?如果可以,哪里出错了?

你做得对。全局变量总是存储在内存中——您插入了一个类型为i32的全局变量,并返回了一个指向该内存位置的指针。在C术语中,您得到的是&var1而不是var1。要操作存储在指针中的值,需要创建loadstore指令。

使用getOrInsertGlobal时,您将传递要在全局命名空间中创建的对象的底层类型。然后,实现使用getPointerType在模块的符号表中实际创建映射,这就是为什么您会看到一个指向传入类型的指针

因此,您需要加载并存储到全局。