【问题标题】:Non pointer global variables in LLVMLLVM中的非指针全局变量
【发布时间】:2015-11-15 16:07:59
【问题描述】:

我正在编写一个函数传递,并想在初始化阶段添加一个 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 类型的全局变量,如果可以,我哪里出错了?

【问题讨论】:

    标签: c++ c compiler-construction llvm compiler-optimization


    【解决方案1】:

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

    【讨论】:

    • 感谢您的帮助!这有点离题,但我觉得它足够相关,可以留在这个页面上:在我的函数传递中,我正在调用 Value* vpointer = M->getGlobalVariable("var1"); LoadInst load(vpointer,"var1",&i); &i 来自迭代器。此代码段错误。 LoadInst 是问题所在,删除它会删除段错误。我认为问题出在 LoadInst() 的字符串参数上,因为我基本上只是在猜测要放什么(文档很少)。我应该如何修复这个段错误?
    • @LLVMHacker30 我建议考虑使用 IRBuilder 而不是手动创建指令。
    • 不知道这个答案增加了什么我之前的答案没有:(
    • @dune.rocks 点赞不是我的(我没有点赞的“声望”),我询问了 Ismail 的后续行动,因为我来的时候他恰好在页面的上方背部。这两个答案都非常有用。
    【解决方案2】:

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

    所以你需要加载并存储到全局。

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多