首页 > 解决方案 > 如何将调试信息附加到 LLVM Pass 中的指令中

问题描述

我试图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++clangllvm

解决方案


你需要的函数setDebugLoc()和信息只有在你包含足够多的情况下才会包含在结果中。模块验证器会告诉您缺少什么。这两行也可能是让你绊倒的原因。

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

推荐阅读