我正在研究的问题是在LLVM IR级分支指令和生成的X86指令(我的目标体系结构)之间找到映射。因此,我的解决方案是修改分支指令的调试信息(例如更改行号),然后生成可执行的ELF文件后,我使用llvm-dwarfdump工具提取与IR分支指令关联的X86指令的PC地址。
但是,我附加到某些分支的调试信息不会出现在ELF文件中。
这是我用来修改调试信息的过程:
long line = 200000;
for (Function& F: M)
{
for (BasicBlock& BB: F)
{
for (auto inst = B.begin(), inst_end = B.end(); inst_end != inst; ++inst)
{
if (isa<BranchInst>(&(*inst)))
{
if (inst->getDebugLoc())
{
DebugLoc loc = DebugLoc::get((unsigned)line, (unsigned)0, F.getSubprogram());
line++;
inst->setDebugLoc(loc);
}
}
}
}
}
然后我使用llvm-dwarddump工具,如下所示:
$ llvm-dwarfdump -debug-line ./binary_file
我希望看到我在LLVM传递中分配的所有行号。但是,其中许多人不见了。例如,在这里您可以看到缺少行号200003:
Address Line Column File ISA Discriminator Flags
------------------ ------ ------ ------ --- ------------- -------------
0x0000000000400a40 93 0 1 0 0 is_stmt
0x0000000000400a5c 107 13 1 0 0 is_stmt prologue_end
0x0000000000400a75 107 11 1 0 0
0x0000000000400a79 107 39 1 0 0 is_stmt
0x0000000000400a7d 200000 0 1 0 0 is_stmt
0x0000000000400a83 108 13 1 0 0 is_stmt
0x0000000000400a8e 109 22 1 0 0 is_stmt
0x0000000000400a9f 110 21 1 0 0 is_stmt
0x0000000000400ab0 111 21 1 0 0 is_stmt
0x0000000000400ac1 112 21 1 0 0 is_stmt
0x0000000000400ad2 113 20 1 0 0 is_stmt
0x0000000000400ae3 114 23 1 0 0 is_stmt
0x0000000000400af4 115 23 1 0 0 is_stmt
0x0000000000400b05 116 23 1 0 0 is_stmt
0x0000000000400b13 117 22 1 0 0 is_stmt
0x0000000000400b21 118 22 1 0 0 is_stmt
0x0000000000400b2f 119 20 1 0 0 is_stmt
0x0000000000400b3d 120 12 1 0 0 is_stmt
0x0000000000400b41 120 5 1 0 0
0x0000000000400b46 200001 0 1 0 0 is_stmt
0x0000000000400b48 122 13 1 0 0 is_stmt
0x0000000000400b53 125 3 1 0 0 is_stmt
0x0000000000400b64 127 13 1 0 0 is_stmt
0x0000000000400b7d 127 11 1 0 0
0x0000000000400b81 127 41 1 0 0 is_stmt
0x0000000000400b85 200002 0 1 0 0 is_stmt
0x0000000000400b8b 129 5 1 0 0 is_stmt
0x0000000000400b9c 130 21 1 0 0 is_stmt
0x0000000000400ba0 130 14 1 0 0
0x0000000000400bb5 130 12 1 0 0 is_stmt
0x0000000000400bb8 131 18 1 0 0 is_stmt
0x0000000000400bbc 131 12 1 0 0
0x0000000000400bc1 131 22 1 0 0 is_stmt
0x0000000000400bc4 200004 0 1 0 0 is_stmt
0x0000000000400bc6 200005 0 1 0 0 is_stmt
可能是什么问题?我应该从哪里开始寻找问题的原因?
此外,您还可以查看在IR级别执行的所有通行证:
===-------------------------------------------------------------------------===
... Pass execution timing report ...
===-------------------------------------------------------------------------===
Total Execution Time: 0.3720 seconds (0.3705 wall clock)
---User Time--- --User+System-- ---Wall Time--- --- Name ---
0.1720 ( 46.2%) 0.1720 ( 46.2%) 0.1735 ( 46.8%) Print Module IR
0.1120 ( 30.1%) 0.1120 ( 30.1%) 0.1098 ( 29.6%) MY Pass
0.0880 ( 23.7%) 0.0880 ( 23.7%) 0.0872 ( 23.5%) Module Verifier
0.3720 (100.0%) 0.3720 (100.0%) 0.3705 (100.0%) Total
所以,我认为没有其他修改通过的修改。
注意:我使用-g选项发出IR代码。
谢谢。