Как отметить границы базовых блоков с помощью LLVM или других инструментов? - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь переделать работу «Сравнение схожести двоичного кода с помощью нейронного машинного перевода вне функциональной пары», но мне не удалось завершить некоторые компоненты.

Автор сказал: « Мы изменяембэкэнды для добавления аннотатора границ базового блока, который не только четко маркирует границы блоков, но также аннотирует уникальный идентификатор для каждого сгенерированного сборочного блока таким образом, что все сборочные блоки скомпилированы из одного и того же блока IR '.

Я не знаю, как пометить границы блока, чтобы определить, исходят ли несколько кодов сборки для разных архитектур из одного и того же исходного кода с помощью LLVM или других инструментов.

Я ценю любую помощь.

1 Ответ

0 голосов
/ 17 октября 2019

Ну, учитывая Function, вы можете перебирать его BasicBlock с .begin() и end(). Это даст вам BasicBlock, для которого вы всегда можете сделать .front() и .back() для получения первой и последней инструкции соответственно. Это даст вам «границы» каждого блока и функции.

ОБНОВЛЕНИЕ

У меня возникла идея, как это сделать, если вы хотите «границы»присутствовать в скомпилированном источнике.

В начале каждой функции вы можете генерировать store инструкций, которые будут хранить blockaddress значение для каждого блока функции. Если я не ошибаюсь, они превратятся в mov s на уровне сборки, один операнд которого будет отправной точкой базового блока. Это позволит вам вывести «границы».

...