36 lines
1.3 KiB
C++
36 lines
1.3 KiB
C++
// 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
|