我试图找到LLVM中的指令,按行和列号(由第三方工具报告)来检测它们.为此,我clang -g -O0 -emit-llvm使用以下代码编译源文件并在元数据中查找信息:
const DebugLoc &location = instruction->getDebugLoc();
// location.getLine()
// location.getCol()
Run Code Online (Sandbox Code Playgroud)
不幸的是,这些信息绝对不准确.考虑以下Fibonacci函数的实现:
unsigned fib(unsigned n) {
if (n < 2)
return n;
unsigned f = fib(n - 1) + fib(n - 2);
return f;
}
Run Code Online (Sandbox Code Playgroud)
我想unsigned f = ...在结果LLVM IR中找到与赋值相对应的单个LLVM指令.我对右手边的所有计算都不感兴趣.生成的LLVM块包括相关的调试元数据:
[...]
if.end: ; preds = %entry
call void @llvm.dbg.declare(metadata !{i32* %f}, metadata !17), !dbg !18
%2 = load i32* %n.addr, align 4, !dbg !19
%sub = sub i32 %2, 1, !dbg !19
%call = …Run Code Online (Sandbox Code Playgroud)