我正在研究Rust的LLVM教程。我已经实现了Kaleidoscope REPL的一些部分。它很适合我,但突然停止工作,现在每次计算值的尝试都以LLVM ERROR: Target does not support MC emission!
结束。它似乎发生在将Rust编译器更新到最新的每晚之后(但我不确定)。
相关的代码片段如下。
初始化功能:
#[allow(non_snake_case)]
pub unsafe fn LLVMInitializeNativeTarget() {
llvm::LLVMInitializeX86TargetInfo();
llvm::LLVMInitializeX86Target();
llvm::LLVMInitializeX86TargetMC();
}
模块创建:
let module = llvm::LLVMModuleCreateWithNameInContext(module_name.to_c_str().as_ptr(), context);
执行引擎创建:
let mut exec_engine = 0 as llvm::ExecutionEngineRef;
let mut error = 0 as *const c_char;
LLVMCreateExecutionEngineForModule(&mut exec_engine, module, &mut error);
assert!(exec_engine != 0 as llvm::ExecutionEngineRef);
编译和运行功能:
pub fn run(value: llvm::ValueRef, context: &Context) -> f64 {
unsafe {
let result = LLVMRunFunction(context.exec_engine,
value,
0,
0 as *const GenericValueRef);
let ty = llvm::LLVMDoubleTypeInContext(context.context);
LLVMGenericValueToFloat(ty, result)
}
}
要查看完整的代码列表,请查看https://github.com/jauhien/iron-kaleidoscope/blob/master/src/builder.rs
我正在使用最新的每晚Rust和LLVM 3.5.0。
UPD:在调用LLVMInitializeNativeTarget之后,JIT再次开始工作。但我仍然想知道问题的原因是什么,以及如何正确使用JIT。
UPD2:在初始化注释掉行之后并不是所有内容都重新开始工作:对Rust代码中定义的函数的调用现在失败了LLVM ERROR: Tried to execute an unknown external function
。
我试图调用的函数(之前有效):
#[no_mangle]
pub extern fn print(x: f64) -> f64 {
println!("> {} <", x);
x
}
示例会话:
jauhien@zcj iron-repl % ./target/iron_kaleidoscope
>extern print(x)
declare double @print(double)
>print(1)
LLVM ERROR: Tried to execute an unknown external function: print
答案 0 :(得分:7)
我有same problem并且可以通过运行
解决它LLVMInitializeNativeAsmPrinter();
LLVMInitializeNativeAsmParser();
初始化X86Target后。我在lli
的源代码中找到了这个。