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

How to get source line number from .ll file LLVM

本文关键字:获取 源代码 LLVM 文件 ll      更新时间:2023-10-16

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

我试过这个——

  1. 对于指令BI,无符号行 = 行 = 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] = %dn",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

谢谢!

要将行号信息放入 .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