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