LLVM IR级中添加的调试信息未出现在已编译的可执行二进制文件中

时间:2019-09-28 11:59:48

标签: debugging x86 llvm

我正在研究的问题是在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代码。

谢谢。

0 个答案:

没有答案