使用C-API转储具有值名称的LLVMModule

ycggw6v2  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(94)

我目前正在使用Rust和LLVM以及LLVM-C-API编写自己的编译器。
出于调试目的,LLVM-C-API提供了一个名为LLVMDumpModule()的函数。遗憾的是,这似乎完全丢弃了之前提供的任何值名称,使得调试比实际需要的要困难得多。在C++ API中,这可以通过参数切换到dumpModule函数,但这不是C-API的情况。
最小示例(在Rust中,使用llvm-sys crate)

extern crate llvm_sys as llvm;
fn main() {
let ctx = LLVMContextCreate();
let mod =LLVMModuleCreateWithNameInContext(c_str("main_ctx"), ctx);
LLVMAddFunction(
        mod,
        c_str("my_func"),
        <my func type>, <params> //Sghortened for brevity
    );
LLVMDumpModule(mod);

字符串
这应该转储的内容如下:

define i64 @my_func(<some args>)


它实际上转储的内容:

define i64 @1(<some args>)


这对所有LLVM-IR指令都是一样的,我提供的所有值的名称都不会被转储。关于如何使用LLVM-C-API启用这一点,有什么建议吗?

l7wslrjt

l7wslrjt1#

我刚刚发现了问题所在。我创建的名称是Rust CString,一旦作用域改变,它们就会被删除。因此,我所有的值名称字符串都是空的。所以,这根本不是LLVM特有的问题,只是我没有注意Rust的生命周期。

相关问题