1
05. Добавление нового прохода в SAPFOR
xnpster edited this page 2024-01-12 17:13:10 +00:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

В данном разделе описан алгоритм создания прохода (фазы анализа). По данной ссылке можно изучить текущее описание некоторых идей и алгоритмов 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* и выполняет обход дерева разбора каждого файла для построения некоторой информации.
      • Второй этап анализ полученной информации после первого этапа. Каждый проход может содержать в себе вторую часть анализа, например, агрегация результатов первого этапа. Данный этап не обязательно должен присутствовать для каждого прохода.