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