我目前正在使用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启用这一点,有什么建议吗?
1条答案
按热度按时间l7wslrjt1#
我刚刚发现了问题所在。我创建的名称是Rust CString,一旦作用域改变,它们就会被删除。因此,我所有的值名称字符串都是空的。所以,这根本不是LLVM特有的问题,只是我没有注意Rust的生命周期。