我使用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")这会中止我的程序。
答案 0 :(得分:1)
数据布局格式在http://llvm.org/docs/LangRef.html#data-layout中描述。而且它肯定不是目标三联。最好的,如果您只是将虚拟.c文件提供给目标的clang,请通过-S -emit-llvm进行编译并从那里获取完整的数据布局字符串。