1
05. Добавление нового прохода в SAPFOR
xnpster edited this page 2024-01-12 17:13:10 +00:00
В данном разделе описан алгоритм создания прохода (фазы анализа). По данной ссылке можно изучить текущее описание некоторых идей и алгоритмов SAPFOR. Для добавления нового прохода, необходимо его объявить, добавить данному проходу зависимости и описать его в основном цикле запуска проходов.
- Для объявления прохода, необходимо добавить в файл
Sapfor.hв конец enum passes (и до EMPTY_PASS) название данного прохода, а также добавить строку его описания вconst char *passNames. - Зависимости проходов содержатся в файле
PassManager.h. Зависимости задаются в функцииInitPassesDependencies(). Если проход не имеет зависимости от других проходов, то данный пункт можно пропустить. Например,Pass(А) <= Pass(B)означает, что проход B зависит от прохода A, то есть проход B автоматически запустит проход А перед своим выполнением.List <= Passозначает, что проход зависит от всех проходов из списка.Pass (А) <= Listозначает, что каждый проход из списка зависит от прохода А.List (A) <= List (B)означает, что каждый проход из списка B зависит от всех проходов из списка А. - Далее необходимо создать функцию для прохода и вставить его в функции запуска проходов. Для запуска проходов используются функции runPass и runAnalysis.
- Первая функция позволяет описать сложное поведение прохода, которое отличается от default запуска в switch. Пример такого прохода - FILL_PAR_REGIONS_LINES: после выполнения данного прохода необходимо выполнить какие-то дополнительные действия.
- Вторая функция запускает анализ в два этапа. Проход не обязательно может иметь два этапа обработки, может присутствовать только первый, либо только второй.
- Первый этап – анализ дерева разбора для каждого файла программы независимо. На первом этапе каждый проход принимает как минимум
SgFile*и выполняет обход дерева разбора каждого файла для построения некоторой информации. - Второй этап – анализ полученной информации после первого этапа. Каждый проход может содержать в себе вторую часть анализа, например, агрегация результатов первого этапа. Данный этап не обязательно должен присутствовать для каждого прохода.
- Первый этап – анализ дерева разбора для каждого файла программы независимо. На первом этапе каждый проход принимает как минимум