可能是什么原因导致`LLVM错误:Target不支持MC发射!`?

时间:2014-10-08 21:16:43

标签: llvm rust

我正在研究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)
    }
}
由llvm ::优先执行的LLVM函数由rustc导入,而不是由llvm ::执行的那些函数由我的代码导入,请参阅https://github.com/jauhien/iron-kaleidoscope/blob/master/src/missing_llvm_bindings/mod.rs

要查看完整的代码列表,请查看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

1 个答案:

答案 0 :(得分:7)

我有same problem并且可以通过运行

解决它
LLVMInitializeNativeAsmPrinter();
LLVMInitializeNativeAsmParser();
初始化X86Target后

。我在lli的源代码中找到了这个。