【问题标题】:How to get source line number from .ll file LLVM如何从 .ll 文件 LLVM 中获取源代码行号
【发布时间】:2016-11-14 03:06:17
【问题描述】:

我正在使用 LLVM 3.4 并希望从 IR 获取源文件的行号信息。 IR 是使用 Clang 从简单的 c 代码生成的。 我想从 IR 正文中的行获取源 c 文件中的行号。

我试过了-

  1. 对于指令 BI, 无符号 Line = Line = BI->getDebugLoc().getLine();
  2. 对于循环 L,std::cout getStartLoc().getLine();

但是,存储/打印的结果始终为 0。我不知道如何从 LLVM IR 获取源中的行号。

我的 C 源文件是 -

#include <stdio.h>

int main()
{

 int i;

 int inbuf[100];
 int outbuf[100];

 for(i = 0; i < 100; ++i)        
        inbuf[i] ^= outbuf[i];

 inbuf[1] += 402;
 inbuf[6] += 107;
 inbuf[97] += 231;

 for(i = 0; i < 100; ++i)       
 {
         inbuf[i] += outbuf[i];
 }

 inbuf[47] += 312;  

    //print-statements 
 for (i=0;i<100;i++) {
        printf("inbuf[%d] = %d\n",i,inbuf[i]);              
}

return 0;

使用的命令- ~/llvm/build/Release+Asserts/bin/clang -O3 -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -S -emit-llvm sample.c -o sample.ll

谢谢!

【问题讨论】:

  • 您正在优化,因此没有理由期望输出以源代码行号顺序表示输入源,也没有理由期望每行源代码都有代码块。如果 llvm 有一个可以满足这些需求的库,而这正是您所要求的,那么您正在查看的内容可能没有一行。也许尝试未优化,看看是否会改变。
  • 谢谢!我尝试使用 -O0 但它仍然显示 0。命令:~/llvm/build/Release+Asserts/bin/clang -O0 -S -emit-llvm sample.c -o sample.ll 我有工作通行证,可以检测和分析循环和指令。我在函数内部使用它 - runOnLoop(Loop *L, LPPassManager &LPM)
  • 您似乎没有在编译命令行中询问调试信息。
  • 谢谢垫子!我应该为此使用调试版本吗?我还尝试包含 -fstandalone-debug 选项。但是,它仍在打印 0。

标签: c++ c llvm llvm-clang llvm-ir


【解决方案1】:

要将行号信息放入 .ll 文件中,您必须为 clang 指定 -O0-g 标志。

http://llvm.org/docs/SourceLevelDebugging.html#debugging-optimized-code

行号存储在专门的元数据节点中。

http://llvm.org/docs/LangRef.html#specialized-metadata-nodes

所以完整的命令行必须如下所示:

~/llvm/build/Release+Asserts/bin/clang -O0 -g -S -emit-llvm sample.c -o sample.ll

【讨论】:

  • 谢谢!添加 -g 有效。我首先添加了标志 -fstandalone-debug。但是,添加 -g 对 -O0 和 -O3 都有效。非常感谢! :)
  • 你绝对不需要-O0。如果您需要列信息,您肯定需要 -g,甚至可能需要 -gcolumn-info。 -fstandalone-debug 仅控制是否将类型发送到调试信息中-通常,如果我们不发出键函数,我们将优化类型,因为无论我们在哪里为类发出键函数,我们'将确保调试信息在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2019-05-28
  • 2021-11-11
  • 2022-06-30
相关资源
最近更新 更多