Обновить 5. Добавление нового прохода в SAPFOR

2023-09-22 18:14:04 +00:00
parent 0f83813c31
commit 7d611248cf

@@ -1,7 +1,7 @@
В данном разделе описан алгоритм создания прохода (фазы анализа). [По данной ссылке](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)` (TODO: поменять на <=) означает, что каждый проход из списка B зависит от всех проходов из списка А.
- Зависимости проходов содержатся в файле `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: после выполнения данного прохода необходимо выполнить какие-то дополнительные действия.
- Вторая функция запускает анализ в два этапа. Проход не обязательно может иметь два этапа обработки, может присутствовать только первый, либо только второй.