Самый простой способ собрать динамическое количество выполнений команд?
Я хотел бы получить простой и быстрый способ собрать количество раз, когда каждая инструкция в битовом коде LLVM выполнялась при данном запуске приложения. Насколько я могу судить, существует несколько подходов:
Используйте PIN-код. Это потребует использования информации отладки DWARF и информации отладки инструкций, чтобы попытаться отобразить инструкции в двоичном файле в инструкции в битовом коде; не уверен на 100%, насколько точно это будет.
Используйте llvm-prof. Два вопроса здесь. Во-первых, я видел в переполнении стека опцию
opt
называется--insert-edge-profiling
, Тем не менее, эта опция не доступна в версии 3.6? Во-вторых, похоже, что такое профилирование только учитывает выполнение записей на уровне функций, а не на уровне отдельных инструкций. Это верно?Написать новый инструмент, похожий на AddressSanitizer. Это может сработать, но кажется излишним.
Есть ли более простой способ достижения моей цели, который я пропускаю?
1 ответ
В рамках своей докторской диссертации я написал инструмент для сбора информации об основных блоках, выполняемых программой. Этот инструмент также записывает количество инструкций LLVM в каждом базовом блоке, поэтому анализ трассы даст динамическое число выполнений инструкций.
Другой инструмент исследования - Гармония. Он предоставит динамический счетчик выполнения каждого базового блока в программе, который вы можете дополнить статическим счетчиком команд.
В противном случае, я бы предложил написать свой собственный инструмент. Для каждого базового блока (атомарно) увеличивайте глобальный счетчик на количество инструкций в этом блоке.