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

问题描述 投票:0回答:1

我目前正在使用 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 启用此功能有什么建议吗?

c rust llvm llvm-ir
1个回答
0
投票

我刚刚弄清楚问题出在哪里。我将名称创建为 Rust CStrings,一旦范围发生变化,这些名称就会被删除。因此,我所有的值名称字符串都是空的。所以,这根本不是 LLVM 特定的问题,只是我对 Rust 生命周期不小心。

© www.soinside.com 2019 - 2024. All rights reserved.