Что вам нужно, это инструмент, для которого вы можете определить синтаксис языка ассемблера, а затем создать пользовательские анализаторы. Анализаторы могут быть простыми («сколько места занимает команда?») Или сложным («Сколько циклов будет выполнять эта операция?» [Что зависит от предыдущей последовательности инструкций и, возможно, от сложной модели процессора, которую вы заботиться]).
Один разработан специально для этого является New Jersey Machine Toolkit. Он действительно предназначен для создания генераторов кода и отладчиков. Я подозреваю, что было бы неплохо «счет байта команды». Не ясно, что это хорошо для более сложных анализов. И я считаю, что он настаивает на том, что вы следуете его синтаксическому стилю, а не вашему.
Один не разработан специально для этого, но хорошо разбирается/анализирует langauges в целом - это наш DMS Software Reengineering Toolkit.
DMS может быть предоставлено описание грамматики практически для любого контекстного свободного языка (который охватывает большинство синтаксисов языка ассемблера), и затем может анализировать конкретный экземпляр этой грамматики (код сборки) в АСТ для дальнейшей обработки. Мы сделали это с несколькими сборщиками, включая IBM 370, 8-битную линию процессора Motorola и довольно своеобразный DSP, без проблем.
Вы можете легко определить грамматику атрибута (вычисление по AST) для DMS. Это отличный способ кодирования анализов, которым нужна только локальная информация, например «Насколько велика эта инструкция?». Для более сложных анализезов вам понадобится модель процессора, которая выводится из серии инструкций; прохождение такой машинной модели АСТ для отдельных инструкций было бы простым способом применить модель машины для вычисления более сложных вещей как «Сколько времени занимает эта инструкция?».
Другие анализы, такие как поток управления и поток данных, представлены в общей форме DMS. Вы можете использовать оценщик атрибутов для сбора локальных фактов («control-next для этой инструкции ...», «данные из этой инструкции переходят к ...») и направляют их анализаторам потока для вычисления глобальных фактов потока («если я выполню эту инструкцию, какие другие инструкции могут быть выполнены ниже по потоку?»)
Вам необходимо настроить DMS для вашего конкретного (сборного) языка. Это , предназначенный для таких задач, как.
Да, вы можете скопировать все это в Python; в конце концов, его машина Тьюринга. Но, вероятно, не так легко.
Дополнительное преимущество: DMS готова применить преобразования к вашему коду, основываясь на ваших анализах. Таким образом, вы также можете реализовать свой оптимизатор. В конце концов, вам нужно подключить индикацию анализа, чтобы оптимизация была безопасной, до фактических шагов оптимизации.
Methinks, анализирующий LLVM IR, будет проще, так как он использует форму SSA для регистров. – delnan
@delnan Я согласен, но я добавляю пропуск оптимизации уровня сборки, поэтому мне нужно иметь возможность анализировать фактическую созданную ASM. – Zeke
Могу ли я предложить, чтобы ваш проход работал либо как LLVM MachineFunctionPass, либо был абсолютно необходим внутри инфраструктуры MC? Нет никакой причины разбирать asm, восстанавливать всю информацию об управлении и потоке данных, а затем делать некоторую оптимизацию. – ohmantics