【问题标题】:How to attach debug information into an instruction in a LLVM Pass如何将调试信息附加到 LLVM Pass 中的指令中
【发布时间】:2019-03-11 22:43:25
【问题描述】:

我正在尝试在运行时从我的LLVM 优化过程中收集一些信息。换句话说,我想知道编译后特定IR指令的物理地址。所以我的想法是将LLVM 元数据转换为LLVM DWARF 数据,可以在运行时使用。我不想附上文件名和行号,而是附上我自己的信息。我的问题分为两部分:

  1. 下面是一段代码,可以得到一条指令的文件名和行号:

    if (DILocation *Loc = I->getDebugLoc()) { // Here I is an LLVM instruction unsigned Line = Loc->getLine(); StringRef File = Loc->getFilename(); StringRef Dir = Loc->getDirectory(); bool ImplicitCode = Loc->isImplicitCode(); }

但是如何设置这些字段?我找不到相关的功能。

  1. 如何在(文件名和行号)运行时查看更新的调试信息?我使用-g 进行编译,但仍然看不到调试信息。

谢谢

【问题讨论】:

    标签: c++ clang llvm


    【解决方案1】:

    你需要的函数setDebugLoc() 并且信息只有在你包含足够多的情况下才会包含在结果中。 The module verifier 会告诉你你错过了什么。这两行也可能是你的绊脚石。

    module->addModuleFlag(Module::Warning, "Dwarf Version", dwarf::DWARF_VERSION);
    module->addModuleFlag(Module::Warning, "Debug Info Version", DEBUG_METADATA_VERSION);
    

    【讨论】:

    • 我找不到调试信息和模块验证器之间的关系。它只是验证指令的调试信息是否完整?还有最后两行怎么能让我绊倒?我应该将这两行添加到我的通行证中并检查结果吗?
    • 模块验证器会检查模块的调试信息是否一致,并且可用于生成有效的 DWARF 输出。如果你不添加这两个模块标志,或者类似的东西,那么你根本不会得到 DWARF 调试输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多