// PassManager.cpp
#include "SysYIRPassManager.h"
#include <iostream>

namespace sysy {

void PassManager::run(Module& M) {
  // 首先运行Module级别的Pass
  for (auto& pass : modulePasses) {
    std::cout << "Running Module Pass: " << pass->getPassName() << std::endl;
    pass->runOnModule(M);
  }

  // 然后对每个函数运行Function级别的Pass
  auto& functions = M.getFunctions();
  for (auto& pair : functions) {
    Function& F = *(pair.second); // 获取Function的引用
    std::cout << "  Processing Function: " << F.getName() << std::endl;

    // 在每个函数上运行FunctionPasses
    bool changedInFunction;
    do {
      changedInFunction = false;
      for (auto& pass : functionPasses) {
        // 对于FunctionPasses，可以考虑一个迭代执行的循环，直到稳定
        std::cout << "    Running Function Pass: " << pass->getPassName() << std::endl;
        changedInFunction |= pass->runOnFunction(F);
      }
    } while (changedInFunction); // 循环直到函数稳定，这模拟了您SysYCFGOpt的while(changed)逻辑
  }

  // 分析Pass的运行可以在其他Pass需要时触发，或者在特定的PassManager阶段触发
  // 对于依赖于分析结果的Pass，可以在其run方法中通过PassManager::getAnalysis()来获取
}

} // namespace sysy