// PassManager.cpp #include "SysYIRPassManager.h" #include 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