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

时间:2015-01-08 11:32:35

标签: llvm

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

; ModuleID = '_tmp'

@a = global i64 5

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

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

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

编辑:嗯,我发现它与datalayout有关,因为360287970189639680实际上是0x50 ... 0。所以我想将问题更改为"如何为模块设置正确的数据布局?我已经尝试过: LLVMSetDataLayout(mod," x86_64-pc-linux")这会中止我的程序。

1 个答案:

答案 0 :(得分:1)

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