ISSN 2305-5626. Вестник МГТУ им. Н.Э. Баумана: электронное издание. 2013
5
Рис. 4. Использование обработчиков промежуточного кода
В данной работе для генерации модифицированного исполняемо-
го файла реализован обработчик AST-деревьев в рамках платформы
LLVM. В зависимости от цели оптимизатора LLVM представляет не-
сколько типов базовых проходов. Класс
ModulePass
является наибо-
лее общим проходом, позволяющим добавлять, удалять функции или
изменять код любой функции. Для определения корректного прохода
уровня модуля необходимо создать его класс-наследник и переопре-
делить функцию
runOnModule
.
Разработанный обработчик проводит анализ на уровне модулей
программы, поэтому он является наследником класса
ModulePass
.
Модификация модуля программы проходит в два этапа:
1) добавление деклараций функций, вызовы которых будут
вставлены в код;
2) проход по всем функциям модуля для вставки необходимых
инструкций.
Созданный обработчик осуществляет добавление вызовов следу-
ющих функций библиотеки регистрации событий:
void new_segment(int line, char* file, char* dir)
— ге-
нерация события входа в новый сегмент выполнения программы;
void mem_access(int* addr, short is_write)
— генерация
события обращения к памяти на чтение или запись;
void enter_function(char* name)
— генерация события входа
в функцию;
void leave_function()
— генерация события о выходе из
функции.
Таким образом, разработанное устройство анализирует суще-
ствование гонок и поддерживает журналы обращений к памяти с по-
мощью модификации процессов выполнения потоков, проводящих
вызов специальных функций во время выполнения. События входа и