From 10b011a1de6950709856659f576277942118d28f Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Fri, 18 Jul 2025 21:28:36 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=E6=9E=84=E5=BB=BA=EF=BC=8C[Pass]=E5=BB=BA?= =?UTF-8?q?=E7=AB=8BPass=E5=9F=BA=E7=B1=BB=E5=92=8C=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E9=A2=84=E9=87=8D=E6=9E=84=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=81=8D=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SysYIRCFGOpt.cpp | 4 +-- src/include/SysYIRPass.h | 59 +++++++++++++++++++++++++++++++++ src/include/SysYIRPassManager.h | 58 ++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 src/include/SysYIRPass.h create mode 100644 src/include/SysYIRPassManager.h diff --git a/src/SysYIRCFGOpt.cpp b/src/SysYIRCFGOpt.cpp index 4a84497..c386379 100644 --- a/src/SysYIRCFGOpt.cpp +++ b/src/SysYIRCFGOpt.cpp @@ -463,9 +463,9 @@ bool SysYCFGOpt::SysYAddReturn(Function *func, IRBuilder* pBuilder) { pBuilder->setPosition(block.get(), block->end()); // TODO: 如果int float函数缺少返回值是否需要报错 if (func->getReturnType()->isInt()) { - pBuilder->createReturnInst(ConstantValue::get(0)); + pBuilder->createReturnInst(ConstantInteger::get(0)); } else if (func->getReturnType()->isFloat()) { - pBuilder->createReturnInst(ConstantValue::get(0.0F)); + pBuilder->createReturnInst(ConstantFloating::get(0.0F)); } else { pBuilder->createReturnInst(); } diff --git a/src/include/SysYIRPass.h b/src/include/SysYIRPass.h new file mode 100644 index 0000000..cb6e6a9 --- /dev/null +++ b/src/include/SysYIRPass.h @@ -0,0 +1,59 @@ +#pragma once + +#include "IR.h" + +namespace sysy { + +// 前置声明 +class FunctionPass; +class ModulePass; +class AnalysisPass; +class PassManager; + +// 抽象基类 Pass +class Pass { +public: + enum PassKind { + PK_Function, + PK_Module, + PK_Analysis + }; + + Pass(PassKind kind, const std::string& name) : Kind(kind), Name(name) {} + virtual ~Pass() = default; + + PassKind getPassKind() const { return Kind; } + const std::string& getPassName() const { return Name; } + + // 每个Pass需要实现此方法来执行其逻辑 + // 具体的run方法将根据Pass类型在FunctionPass和ModulePass中定义 +protected: + PassKind Kind; + std::string Name; +}; + +// 针对函数的优化遍 +class FunctionPass : public Pass { +public: + FunctionPass(const std::string& name) : Pass(PK_Function, name) {} + // 真正的优化逻辑将在此方法中实现 + virtual bool runOnFunction(Function& F) = 0; +}; + +// 针对模块的优化遍 +class ModulePass : public Pass { +public: + ModulePass(const std::string& name) : Pass(PK_Module, name) {} + // 真正的优化逻辑将在此方法中实现 + virtual bool runOnModule(Module& M) = 0; +}; + +// 分析遍 +class AnalysisPass : public Pass { +public: + AnalysisPass(const std::string& name) : Pass(PK_Analysis, name) {} + // 分析遍通常需要一个模块或函数作为输入,并计算出分析结果 + // 具体分析结果的存储和访问方式需要设计 +}; + +} // namespace sysy \ No newline at end of file diff --git a/src/include/SysYIRPassManager.h b/src/include/SysYIRPassManager.h new file mode 100644 index 0000000..310b50f --- /dev/null +++ b/src/include/SysYIRPassManager.h @@ -0,0 +1,58 @@ +// 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 \ No newline at end of file