我正在写一个函数传递,并希望在初始化阶段添加一个int类型的全局变量,用于传递的实际工作。
到目前为止,我有
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类型的全局变量,如果是这样,我哪里出错了?
答案 0 :(得分:2)
你做得对。全局变量总是存储在内存中 - 您已经插入了i32
类型的全局变量,并返回指向该内存位置的指针。在C语言中,您返回&var1
而不是var1
。要操纵指针中存储的值,您需要创建load
和store
指令。
答案 1 :(得分:0)
使用getOrInsertGlobal
时,您将在全局命名空间中传递要创建的对象的底层类型。然后,实现使用getPointerType
在模块的符号表中实际创建映射,这就是您查看指向您传入类型的指针的原因。
因此,您需要加载并存储到全局。