diff --git a/frontend/CMakeLists.txt b/frontend/CMakeLists.txt index 5101dd263e0f5d12fce2d02ff7e819e6b39ac438..8c5e6212ae3e09cf2ab56d2fb1515f7366f1d544 100644 --- a/frontend/CMakeLists.txt +++ b/frontend/CMakeLists.txt @@ -3,8 +3,6 @@ cmake_minimum_required(VERSION 2.8) # 设置 C++ æ ‡å‡† set(CMAKE_CXX_STANDARD 17) -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,stack-size=33554432") - # å°†å‰ç«¯çš„代ç 编译æˆé™æ€åº“ file(GLOB_RECURSE ANTLR4_RUNTIME ${CMAKE_SOURCE_DIR}/dependencies/antlr4-runtime/*.cpp) diff --git a/frontend/include/IRStatement.h b/frontend/include/IRStatement.h index b33e10e1b9ead669a6f0687479f806729d8808d6..b4362de8912978d44f57d93935e7eda6661db115 100644 --- a/frontend/include/IRStatement.h +++ b/frontend/include/IRStatement.h @@ -17,6 +17,7 @@ namespace SCNUCC { class IRStatement { + friend class AsmGenerator; public: /** * æž„é€ å‡½æ•° @@ -196,8 +197,8 @@ private: * %3 = alloca i32 */ class AllocaIR : public IRStatement { -public: friend class AsmGenerator; +public: AllocaIR(IRTYPE::IRTYPE type); auto ToSSA() const -> std::string override; @@ -208,8 +209,8 @@ public: * %3 = load i32* %2 */ class LordIR : public IRStatement { -public: friend class AsmGenerator; +public: LordIR(IRTYPE::IRTYPE type); auto ToSSA() const -> std::string override; @@ -220,8 +221,8 @@ public: * store i32 %1, i32* %2 */ class StoreIR : public IRStatement { -public: friend class AsmGenerator; +public: StoreIR(IRTYPE::IRTYPE type); @@ -236,6 +237,7 @@ private: * phiè¯å¥çš„IRè¯å¥ã€‚phiè¯å¥ç”¨äºŽå¤„ç†åˆ†æ”¯è¯å¥çš„åˆå¹¶ */ class PhiIR : public IRStatement { + friend class AsmGenerator; public: PhiIR(IRTYPE::IRTYPE type); @@ -243,8 +245,8 @@ public: auto AddUser(std::shared_ptr<PhiIR> user) -> void; - auto GetUsers() -> std::vector<std::shared_ptr<PhiIR>>; - + auto GetUsers() -> std::vector<std::shared_ptr<PhiIR>>; + /** * 调整GenPhiForCond的默认的I1ï¼Œæ ¹æ®æ“作数的返回值æ¥ç¡®å®šPhiçš„IRTYPE */ @@ -274,7 +276,7 @@ private: * 4. ä¼ å…¥çš„æ¯ä¸€ä¸ªå‚数:使用父类æˆå‘˜oprnds_ å˜æ”¾å‚æ•° * 5. 函数å:使用 string */ - std::string func_name_; + std::string func_name_; std::vector<Type> params_type_; }; @@ -383,7 +385,7 @@ class LogicIR: public IRStatement { public: LogicIR(IRTYPE::IRTYPE type); - + auto ToSSA() const -> std::string override; }; @@ -449,9 +451,9 @@ private: class GEPIR : public IRStatement { public: GEPIR(IRTYPE::IRTYPE type, std::shared_ptr<VarSymbol> symbol, std::vector<std::shared_ptr<IRStatement>> indices); - + auto ToSSA() const -> std::string override; - + auto IsValue() const -> int; private: friend class AsmGenerator; diff --git a/frontend/include/MyVisitor.h b/frontend/include/MyVisitor.h index 3fbb2274b10453b835ceb728d938023fa29cc746..0f78ee4a43a7fb1d2f6ce8044533edfb2184d722 100644 --- a/frontend/include/MyVisitor.h +++ b/frontend/include/MyVisitor.h @@ -221,7 +221,10 @@ public: void SyLibInit(); // åˆå§‹åŒ–è¿è¡Œæ—¶é™æ€åº“函数 + auto GetCFGS() -> std::vector<std::shared_ptr<ControlFlowGraph>>; + private: + friend class AsmGenerator; std::shared_ptr<SymbolTable> sym_table_; std::vector<std::shared_ptr<ControlFlowGraph>> cfgs_; std::map<std::string, IRPtr> gbl_vars; diff --git a/frontend/src/MyVisitor.cpp b/frontend/src/MyVisitor.cpp index 7be82dde873d2776e64da232c0d5341828118f2f..b8ac36671f6ac5522eafabdcb6a61f3718e215a5 100644 --- a/frontend/src/MyVisitor.cpp +++ b/frontend/src/MyVisitor.cpp @@ -1009,8 +1009,10 @@ void MyVisitor::SyLibInit() { } ) ); +} - +auto MyVisitor::GetCFGS() -> std::vector<std::shared_ptr<ControlFlowGraph>> { + return cfgs_; } } // namespace SCNUCC \ No newline at end of file