2010-11-05 3 views
8

Есть ли у кого-нибудь предложения по инструментам анализа файлов сборки? Я пытаюсь проанализировать файлы ASM ARM/Thumb-2, созданные LLVM (или, альтернативно, GCC) при передаче опции -S. Меня особенно интересует статистика команд на уровне базового блока, например. количество операций с памятью и т. д. Я могу запустить собственный инструмент на Python, но мне было любопытно узнать, есть ли какие-либо существующие инструменты, прежде чем я начну.Инструменты анализа сборки

Обновление: я немного поработал и нашел хороший ресурс для инструментов разборки/шестнадцатеричных редакторов/etc here, но, к сожалению, он в основном сосредоточен на сборке x86, а также не содержит никаких реальных анализаторов файлов сборки ,

+0

Methinks, анализирующий LLVM IR, будет проще, так как он использует форму SSA для регистров. – delnan

+0

@delnan Я согласен, но я добавляю пропуск оптимизации уровня сборки, поэтому мне нужно иметь возможность анализировать фактическую созданную ASM. – Zeke

+0

Могу ли я предложить, чтобы ваш проход работал либо как LLVM MachineFunctionPass, либо был абсолютно необходим внутри инфраструктуры MC? Нет никакой причины разбирать asm, восстанавливать всю информацию об управлении и потоке данных, а затем делать некоторую оптимизацию. – ohmantics

ответ

2

Что вам нужно, это инструмент, для которого вы можете определить синтаксис языка ассемблера, а затем создать пользовательские анализаторы. Анализаторы могут быть простыми («сколько места занимает команда?») Или сложным («Сколько циклов будет выполнять эта операция?» [Что зависит от предыдущей последовательности инструкций и, возможно, от сложной модели процессора, которую вы заботиться]).

Один разработан специально для этого является New Jersey Machine Toolkit. Он действительно предназначен для создания генераторов кода и отладчиков. Я подозреваю, что было бы неплохо «счет байта команды». Не ясно, что это хорошо для более сложных анализов. И я считаю, что он настаивает на том, что вы следуете его синтаксическому стилю, а не вашему.

Один не разработан специально для этого, но хорошо разбирается/анализирует langauges в целом - это наш DMS Software Reengineering Toolkit.

DMS может быть предоставлено описание грамматики практически для любого контекстного свободного языка (который охватывает большинство синтаксисов языка ассемблера), и затем может анализировать конкретный экземпляр этой грамматики (код сборки) в АСТ для дальнейшей обработки. Мы сделали это с несколькими сборщиками, включая IBM 370, 8-битную линию процессора Motorola и довольно своеобразный DSP, без проблем.

Вы можете легко определить грамматику атрибута (вычисление по AST) для DMS. Это отличный способ кодирования анализов, которым нужна только локальная информация, например «Насколько велика эта инструкция?». Для более сложных анализезов вам понадобится модель процессора, которая выводится из серии инструкций; прохождение такой машинной модели АСТ для отдельных инструкций было бы простым способом применить модель машины для вычисления более сложных вещей как «Сколько времени занимает эта инструкция?».

Другие анализы, такие как поток управления и поток данных, представлены в общей форме DMS. Вы можете использовать оценщик атрибутов для сбора локальных фактов («control-next для этой инструкции ...», «данные из этой инструкции переходят к ...») и направляют их анализаторам потока для вычисления глобальных фактов потока («если я выполню эту инструкцию, какие другие инструкции могут быть выполнены ниже по потоку?»)

Вам необходимо настроить DMS для вашего конкретного (сборного) языка. Это , предназначенный для таких задач, как.

Да, вы можете скопировать все это в Python; в конце концов, его машина Тьюринга. Но, вероятно, не так легко.

Дополнительное преимущество: DMS готова применить преобразования к вашему коду, основываясь на ваших анализах. Таким образом, вы также можете реализовать свой оптимизатор. В конце концов, вам нужно подключить индикацию анализа, чтобы оптимизация была безопасной, до фактических шагов оптимизации.

+0

Спасибо за ссылки и увлекательный TechTalk. Я думаю, что DMS может быть излишним для моей конкретной ситуации, но сама концепция очень интересна. Насколько крутой является кривая обучения при использовании DMS? – Zeke

+0

DMS - сложная система, потому что она имеет дело со сложными артефактами и делает некоторые довольно сложные вещи (анализ потока на 25 миллионов строк кода C требует некоторого довольно удивительного механизма). Вы можете узнать основы в неделю; ознакомьтесь с http://www.semanticdesigns.com/Products/DMS/SimpleDMSDomainExample.html для быстрого ознакомления с основами. Вероятно, это займет 6-12 месяцев, чтобы стать * хорошим * при использовании DMS; подумайте о кривой обучения, чтобы хорошо использовать C++. Возможно, это не правильный способ подумать о DMS; реальный вопрос в том, сколько времени потребуется для выполнения той же задачи без? –

+0

не похоже, что это бесплатно, поэтому, возможно, оно не подходит для личных проектов/проектов свободного программного обеспечения. Или я ошибаюсь и просто пропустил ссылку «скачать»? Похоже, классный инструмент. –

2

Я написал много дизассемблеров, включая руку и большой палец.Не качество продукции, но и для обучения ассемблера. Для ARM и Thumb ARM ARM (ARM Architectural Reference Manual) имеет хорошую диаграмму, из которой вы можете легко подсчитывать операции с данными из загрузки/хранения и т. Д., Возможно, часы работы, возможно, две. По крайней мере, впереди, вы в конечном итоге подсчитаете значения данных.

Другой плакат может быть прав, как и на диаграмме, о которой я говорю, должно быть очень просто написать программу для изучения ASCII, ищущего ldr, str, add и т. Д. Не нужно разбирать все, если вы интересуется операциями памяти и т. д. Конечно, недостатком является то, что вы, скорее всего, не сможете исследовать циклы. Одна функция может иметь нагрузку и хранить, другая может иметь нагрузку и хранить, но она завершена циклом, в результате чего выполняется много операций с памятью.

Не зная, в чем вы действительно заинтересованы, возможно, вы захотите смоделировать код и посчитать такие вещи. Я написал симулятор большого пальца (thumbulator), который пытается сделать именно это. (и я использовал его для сравнения выполнения llvm vs gcc-исполнения, когда дело доходит до количества выполненных инструкций, извлечения, операций с памятью и т. д.) Проблема может заключаться в том, что это только большой палец, без ARM no Thumb2. Thumb2 можно было бы добавить проще, чем ARM. Существует подлокотник от руки, который находится в источниках gdb среди других мест. Я не могу вспомнить, если он выполняет thumb2. Я понимаю, что, когда рука использовала его, вы точно рассказывали бы вам о таких статистических данных.

+0

Вы не назвали его «Thimbleulator»? –

1

Вы можете подключить свою статистику к генератору кода LLVM, он довольно гибкий и уже собирает некоторые статистические данные, которые можно использовать в качестве примера.

Смежные вопросы