// PassManager.h #pragma once #include #include #include // For std::type_index #include #include "SysYIRPass.h" #include "IR.h" // 假设你的IR.h定义了Module, Function等 namespace sysy { class PassManager { public: PassManager() = default; // 添加一个FunctionPass void addPass(std::unique_ptr pass) { functionPasses.push_back(std::move(pass)); } // 添加一个ModulePass void addPass(std::unique_ptr pass) { modulePasses.push_back(std::move(pass)); } // 添加一个AnalysisPass template T* addAnalysisPass(Args&&... args) { static_assert(std::is_base_of::value, "T must derive from AnalysisPass"); auto analysis = std::make_unique(std::forward(args)...); T* rawPtr = analysis.get(); analysisPasses[std::type_index(typeid(T))] = std::move(analysis); return rawPtr; } // 获取分析结果(用于其他Pass访问) template T* getAnalysis() { static_assert(std::is_base_of::value, "T must derive from AnalysisPass"); auto it = analysisPasses.find(std::type_index(typeid(T))); if (it != analysisPasses.end()) { return static_cast(it->second.get()); } return nullptr; // 或者抛出异常 } // 运行所有注册的遍 void run(Module& M); private: std::vector> functionPasses; std::vector> modulePasses; std::unordered_map> analysisPasses; // 未来可以添加AnalysisPass的缓存机制 }; } // namespace sysy