ISSN 2305-5626. Вестник МГТУ им. Н.Э. Баумана: электронное издание. 2013
4
Рис. 3. Структура динамического анализатора
Модуль компилятора генерирует модифицированный исполняемый
файл, который во время выполнения проводит генерацию событий.
Библиотека, содержащая переопределенные функции, необходима для
генерации событий, упорядочивающих выполнение программы. Биб-
лиотека регистрации событий предоставляет интерфейс, через который
события фиксируются в журнале выполнения потоков. Библиотека, со-
держащая реализацию гибридного алгоритма поиска гонок на основе
журнала выполнения потоков, осуществляет поиск гонок и формирова-
ние отчета на основе данных журнала выполнения.
Разработанный анализатор проводит анализ наличия гонок непо-
средственно во время выполнения программы и работает в том же
адресном пространстве, что и анализируемая программа.
Компиляция из языка программирования в промежуточное пред-
ставление реализуется в соответствующем трансляторе LLVM: для
языка С в LLVM используется компилятор CLang. После преобразо-
вания транслятором исходного кода в промежуточный код (IR-код)
происходит наложение цепочки оптимизаторов и получение объект-
ного файла для заданной архитектуры. Далее для получения испол-
няемого файла выполняется компоновка объектных файлов с необхо-
димыми библиотеками (рис. 4).
Система LLVM предоставляет возможность включения соб-
ственных обработчиков AST-деревьев в процесс компиляции IR-кода
в машинный код и предлагает API для них. Обработчики проводят
преобразования и оптимизацию кода, сбор аналитических данных во
время компиляции. Благодаря тому, что обработчики являются раз-
деляемыми библиотеками, для реализации собственного обработчика
необязательно вносить изменения в дерево исходных кодов LLVM.