在 JIT 中使用全局变量会产生垃圾结果

Using global variables in JIT yields garbage result

我正在使用 llvm-c API 并且想使用 JIT。我创建了以下模块

; ModuleID = '_tmp'

@a = global i64 5

define i64 @__tempfunc() {
entry:
  %a_val = load i64* @a
  ret i64 %a_val
}

这个输出是由 LLVMDumpModule 在我调用 LLVMRunFunction 之前生成的。这会产生一个 LLVMGenericValueRef。然而,通过 LLVMGenericValueToInt(gv, true) 将结果转换为 64 位整数,结果为 360287970189639680 或类似的东西 - 而不是 5。通过 LLVMGenericValueToInt(gv, false) 转换 也没有帮助。

如何在 JIT 情况下使用全局变量? IR有什么问题吗?

编辑:嗯,我发现它与数据布局有关,因为 360287970189639680 实际上是 0x50...0。所以我想将问题更改为 "How do I set the correct datalayout for a module? I've tried: LLVMSetDataLayout(mod, "x86_64-pc-linux") 这会中止我的程序。

数据布局格式在http://llvm.org/docs/LangRef.html#data-layout中描述。而且它肯定不是目标三倍。最好,如果您只是将虚拟 .c 文件提供给目标的 clang,通过 -S -emit-llvm 编译并从那里获取完整的数据布局字符串。