Добавить 5. Добавление нового прохода в SAPFOR
@@ -0,0 +1,9 @@
|
||||
В данном разделе описан алгоритм создания прохода (фазы анализа). [По данной ссылке](https://docs.google.com/document/d/1QQfpq7Xic5PDhFt5ESUUIcl_7jn1TFIGY5zznsvmbis/) можно изучить текущее описание некоторых идей и алгоритмов 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*` и выполняет обход дерева разбора каждого файла для построения некоторой информации.
|
||||
- Второй этап – анализ полученной информации после первого этапа. Каждый проход может содержать в себе вторую часть анализа, например, агрегация результатов первого этапа. Данный этап не обязательно должен присутствовать для каждого прохода.
|
||||
Reference in New Issue
Block a user