Добавлена ​​отладочная информация на IR-уровне LLVM, отсутствующая в скомпилированном исполняемом двоичном файле - PullRequest
0 голосов
/ 28 сентября 2019

Проблема, над которой я работаю, заключается в том, чтобы найти соответствие между инструкциями ветви LLVM IR-уровня и полученными инструкциями X86 (моя целевая архитектура).Итак, мое решение заключается в изменении отладочной информации инструкций ветвления (например, изменение номера строки), а затем после создания исполняемого файла ELF я использую инструмент llvm-dwarfdump для извлечения адреса ПК команд X86, связанных с инструкциями ветвления IR.

Однако отладочная информация, которую я прикрепил к некоторым ветвям, не отображается в файле 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 для испускания ИК-кодов.

Спасибо.

...