如何从.ll文件LLVM获取源行号

Sha*_*ave 6 c c++ llvm llvm-clang llvm-ir

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

我试过这个 -

  1. 对于指令BI,unsigned Line = Line = BI-> getDebugLoc().getLine();
  2. 对于循环L,std :: cout << L-> 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;
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

小智 4

要将行号信息获取到 .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

  • 你绝对不需要-O0。如果您想要列信息,您肯定会需要 -g,甚至可能需要 -gcolumn-info。-fstandalone-debug 仅控制是否将类型发送到调试信息中 - 通常,如果我们不发送关键函数,我们会优化类型,因为无论我们在何处为类发出关键函数,我们都会优化该类型将确保调试信息在那里。 (2认同)