调用llvm_sys的LLVMCreateTargetMachine在Rust中生成对象文件时出现Segfault


extern crate llvm_sys;
use llvm_sys::*;
use llvm_sys::prelude::*;
use llvm_sys::core::*;
pub fn emit(module: LLVMModuleRef) {
    unsafe {
        use llvm_sys::target_machine::*;
        let triple = LLVMGetDefaultTargetTriple();
        let mut target: LLVMTargetRef = std::mem::uninitialized();
        LLVMGetTargetFromTriple(triple, &mut target, ["Cannot get target.".as_ptr() as *mut i8].as_mut_ptr());
        let cpu = "x86".as_ptr() as *const i8;
        let feature = "".as_ptr() as *const i8;
        let opt_level = LLVMCodeGenOptLevel::LLVMCodeGenLevelNone;
        let reloc_mode = LLVMRelocMode::LLVMRelocDefault;
        let code_model = LLVMCodeModel::LLVMCodeModelDefault;
        let target_machine = LLVMCreateTargetMachine(target, triple, cpu, feature, opt_level, reloc_mode, code_model);
        let file_type = LLVMCodeGenFileType::LLVMObjectFile;
        // LLVMTargetMachineEmitToFile(target_machine, module, "/Users/andyshiue/Desktop/main.o".as_ptr() as *mut i8, file_type, "Cannot generate file.".as_ptr() as *mut *mut i8);
    }
}
pub fn main() {
    use Term::*;
    unsafe {
        let module = LLVMModuleCreateWithName("Main".as_ptr() as *const i8);
        emit(module);
    }
}

错误:

Process didn't exit successfully: `target/debug/ende` (signal: 11, SIGSEGV: invalid memory reference)

我正在编写我的玩具编译器,现在我想生成目标文件。为什么上面的代码会产生段错误?我怎么知道我做错了什么?是否可以获取堆栈跟踪?我没有 C/C++ 的经验,所以我不知道如何调试。问题与target有关吗?

你误解了如何称呼LLVMGetTargetFromTriple

pub unsafe extern "C" fn LLVMGetTargetFromTriple(Triple: *const c_char,
                                                 T: *mut LLVMTargetRef,
                                                 ErrorMessage: *mut *mut c_char)
                                                 -> LLVMBool

此函数接受指向 C 样式字符串的指针,该字符串将在出现错误时填充。该方法的实际成功由结果报告。

根据LLVM文档:

查找与给定三元组对应的目标并将其存储在 T 中。

成功时返回 0。(可选(返回错误消息中的任何错误。使用 LLVMDisposeMessage 来释放消息。

(强调我的(

现在,该调用失败,因此目标 ref 从未初始化,因此您正在尝试对未定义的代码调用方法。

相关内容

  • 没有找到相关文章

最新更新