【发布时间】:2016-11-14 03:06:17
【问题描述】:
我正在使用 LLVM 3.4 并希望从 IR 获取源文件的行号信息。 IR 是使用 Clang 从简单的 c 代码生成的。 我想从 IR 正文中的行获取源 c 文件中的行号。
我试过了-
- 对于指令 BI, 无符号 Line = Line = BI->getDebugLoc().getLine();
- 对于循环 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