From 10c1d153acbd09c58a3e6af2abb7289b7874e57c Mon Sep 17 00:00:00 2001 From: Lane0218 Date: Sat, 7 Mar 2026 23:14:57 +0800 Subject: [PATCH] =?UTF-8?q?docs(doc):=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E5=AE=9E=E9=AA=8C=E8=AF=B4=E6=98=8E=E5=B9=B6=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20Lab3=20=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...®žéªŒè¯´æ˜Ž.md => Lab1-语法树构建.md} | 2 +- ...ªŒè¯´æ˜Ž.md => Lab2-中间表示生æˆ.md} | 16 ++-- doc/Lab3-指令选择与汇编生æˆ.md | 88 +++++++++++++++++++ 3 files changed, 95 insertions(+), 11 deletions(-) rename doc/{Lab1-ANTLRè¯æ³•语法分æžå®žéªŒè¯´æ˜Ž.md => Lab1-语法树构建.md} (98%) rename doc/{Lab2-AST到IR实验说明.md => Lab2-中间表示生æˆ.md} (87%) create mode 100644 doc/Lab3-指令选择与汇编生æˆ.md diff --git a/doc/Lab1-ANTLRè¯æ³•语法分æžå®žéªŒè¯´æ˜Ž.md b/doc/Lab1-语法树构建.md similarity index 98% rename from doc/Lab1-ANTLRè¯æ³•语法分æžå®žéªŒè¯´æ˜Ž.md rename to doc/Lab1-语法树构建.md index 46c0df1..ed1cda1 100644 --- a/doc/Lab1-ANTLRè¯æ³•语法分æžå®žéªŒè¯´æ˜Ž.md +++ b/doc/Lab1-语法树构建.md @@ -1,4 +1,4 @@ -# Lab1:用 ANTLR 实现 SysY è¯æ³•/语法分æžå™¨ +# Lab1:语法树构建 ## 1. æœ¬å®žéªŒå®šä½ diff --git a/doc/Lab2-AST到IR实验说明.md b/doc/Lab2-中间表示生æˆ.md similarity index 87% rename from doc/Lab2-AST到IR实验说明.md rename to doc/Lab2-中间表示生æˆ.md index aa3f14c..79c019c 100644 --- a/doc/Lab2-AST到IR实验说明.md +++ b/doc/Lab2-中间表示生æˆ.md @@ -1,4 +1,4 @@ -# Lab2:从 AST 生æˆä¸­é—´è¡¨ç¤ºï¼ˆIR) +# Lab2ï¼šä¸­é—´è¡¨ç¤ºç”Ÿæˆ ## 1. æœ¬å®žéªŒå®šä½ @@ -11,9 +11,7 @@ Lab2 çš„ç›®æ ‡æ˜¯åœ¨è¯¥ç¤ºä¾‹åŸºç¡€ä¸Šæ‰©å±•è¯­ä¹‰è¦†ç›–èŒƒå›´ï¼Œé€æ­¥æŠŠæ›´å¤š 1. 熟悉 IR 相关数æ®ç»“构与构建接å£ã€‚ 2. ç†è§£å½“å‰ AST -> IR 的最å°å®žçްæµç¨‹ã€‚ -3. 在现有框架上扩展 IR 生æˆèƒ½åŠ›ï¼Œä½¿å…¶è¦†ç›–è¯¾ç¨‹è¦æ±‚çš„Sysy语法。 - - +3. 在现有框架上扩展 IR 生æˆèƒ½åŠ›ï¼Œä½¿å…¶è¦†ç›–è¯¾ç¨‹è¦æ±‚çš„ SysY 语法。 ## 3. 当å‰ä»£ç æ¡†æž¶ï¼ˆä¸Ž Lab2 直接相关) @@ -42,11 +40,11 @@ Lab2 çš„ç›®æ ‡æ˜¯åœ¨è¯¥ç¤ºä¾‹åŸºç¡€ä¸Šæ‰©å±•è¯­ä¹‰è¦†ç›–èŒƒå›´ï¼Œé€æ­¥æŠŠæ›´å¤š - `src/ir/IR.h`(当现有 IR 指令/类型ä¸å¤Ÿç”¨æ—¶ï¼‰ - `src/ir/IRBuilder.cpp`ï¼ˆå½“éœ€è¦æ–°å¢žæž„å»ºæŽ¥å£æ—¶ï¼‰ - `src/ir/IRPrinter.cpp`(新增 IR 指令åŽè¡¥é½æ‰“å°ï¼‰ - - `src/irgen/IRGen.h`ï¼ˆå½“éœ€è¦æ‰©å±•çŠ¶æ€æˆ–辅助接å£ï¼‰ + - `src/irgen/IRGen.h`ï¼ˆå½“éœ€è¦æ‰©å±•çŠ¶æ€æˆ–è¾…åŠ©æŽ¥å£æ—¶ï¼‰ 2. 视实现需è¦å¯èƒ½ä¿®æ”¹ - - `src/main.cpp`(当需è¦è°ƒæ•´è¾“出阶段行为) - - `src/sem/*`(当新增语法ä¾èµ–更多语义信æ¯ï¼‰ + - `src/main.cpp`(当需è¦è°ƒæ•´è¾“出阶段行为时) + - `src/sem/*`(当新增语法ä¾èµ–æ›´å¤šè¯­ä¹‰ä¿¡æ¯æ—¶ï¼‰ ## 5. 当剿œ€å°ç¤ºä¾‹å®žçŽ°è¯´æ˜Ž @@ -74,11 +72,9 @@ cmake --build build -j "$(nproc)" ```bash ./build/bin/compiler --emit-ir test/test_case/simple_add.sy ``` -` -推èä½¿ç”¨ç»Ÿä¸€è„šæœ¬éªŒè¯ â€œIR -> LLVM åŽç«¯ -> 坿‰§è¡Œç¨‹åºâ€ 整体链路,用于验è¯ir的正确性: +推èä½¿ç”¨ç»Ÿä¸€è„šæœ¬éªŒè¯ â€œIR -> LLVM åŽç«¯ -> 坿‰§è¡Œç¨‹åºâ€ æ•´ä½“é“¾è·¯ï¼Œç”¨äºŽéªŒè¯ IR 的正确性: ```bash ./scripts/verify_ir_with_llvm.sh test/test_case/simple_add.sy out/ir --run ``` - diff --git a/doc/Lab3-指令选择与汇编生æˆ.md b/doc/Lab3-指令选择与汇编生æˆ.md new file mode 100644 index 0000000..f0ec7ac --- /dev/null +++ b/doc/Lab3-指令选择与汇编生æˆ.md @@ -0,0 +1,88 @@ +# Lab3ï¼šæŒ‡ä»¤é€‰æ‹©ä¸Žæ±‡ç¼–ç”Ÿæˆ + +## 1. æœ¬å®žéªŒå®šä½ + +æœ¬ä»“åº“å½“å‰æä¾›äº†ä¸€ä¸ªâ€œæœ€å°å¯è¿è¡Œâ€çš„ IR -> AArch64 汇编示例链路。 +Lab3 的目标是在该示例基础上扩展åŽç«¯è¯­ä¹‰è¦†ç›–èŒƒå›´ï¼Œé€æ­¥æŠŠæ›´å¤š SysY IR æ­£ç¡®ç¿»è¯‘ä¸ºç›®æ ‡å¹³å°æ±‡ç¼–代ç ã€‚ + +## 2. Lab3 è¦æ±‚ + +需è¦åŒå­¦å®Œæˆï¼š + +1. 熟悉 MIR 相关数æ®ç»“构与åŽç«¯é˜¶æ®µæŽ¥å£ã€‚ +2. ç†è§£å½“å‰ IR -> MIR -> 汇编输出的最å°å®žçްæµç¨‹ã€‚ +3. 在现有框架上扩展åŽç«¯ä»£ç ç”Ÿæˆèƒ½åŠ›ï¼Œä½¿å…¶è¦†ç›–è¯¾ç¨‹è¦æ±‚çš„ SysY 语义。 + +## 3. 当å‰ä»£ç æ¡†æž¶ï¼ˆä¸Ž Lab3 直接相关) + +1. MIR 定义与目标相关抽象 + - `include/mir/MIR.h` + - `src/mir/MIRContext.cpp` + - `src/mir/MIRFunction.cpp` + - `src/mir/MIRBasicBlock.cpp` + - `src/mir/MIRInstr.cpp` + - `src/mir/Register.cpp` + +2. IR -> MIR ä¸Žæ±‡ç¼–ç”Ÿæˆ + - `src/mir/Lowering.cpp` + - `src/mir/RegAlloc.cpp` + - `src/mir/FrameLowering.cpp` + - `src/mir/AsmPrinter.cpp` + +3. 入壿µç¨‹ + - `src/main.cpp` + - `src/utils/CLI.h` + - `src/utils/CLI.cpp` + +## 4. Lab3 需è¦è¡¥å……的内容 + +1. 必须修改的文件 + - `src/mir/Lowering.cpp` + - `src/mir/RegAlloc.cpp` + - `src/mir/FrameLowering.cpp` + - `src/mir/AsmPrinter.cpp` + - `include/mir/MIR.h`(当现有 MIR æ•°æ®ç»“构或接å£ä¸å¤Ÿç”¨æ—¶ï¼‰ + - `src/mir/MIRInstr.cpp`ï¼ˆå½“éœ€è¦æ–°å¢žæœºå™¨æŒ‡ä»¤æˆ–æ“作数表达时) + - `src/mir/MIRFunction.cpp`ï¼ˆå½“éœ€è¦æ‰©å±•æ ˆå¸§æˆ–æœºå™¨å‡½æ•°çŠ¶æ€æ—¶ï¼‰ + - `src/mir/Register.cpp`ï¼ˆå½“éœ€è¦æ‰©å±•物ç†/虚拟寄存器表示时) + +2. 视实现需è¦å¯èƒ½ä¿®æ”¹ + - `src/main.cpp`(当需è¦è°ƒæ•´è¾“出阶段行为时) + - `src/utils/CLI.cpp`ï¼ˆå½“éœ€è¦æ‰©å±•åŽç«¯ç›¸å…³å‘½ä»¤è¡Œé€‰é¡¹æ—¶ï¼‰ + - `scripts/verify_asm_with_qemu.sh`ï¼ˆå½“éœ€è¦æ‰©å±•统一验è¯è„šæœ¬æ—¶ï¼‰ + +## 5. 当剿œ€å°ç¤ºä¾‹å®žçŽ°è¯´æ˜Ž + +å½“å‰ IR -> 汇编仅覆盖最å°å­é›†ï¼š + +1. 仅支æŒå•函数 `main`ã€å•基本å—çš„æœ€å°æµç¨‹ã€‚ +2. 仅支æŒç”±å½“å‰ Lab2 æœ€å° IR 产生的 `alloca`ã€`load`ã€`store`ã€`add`ã€`ret`。 +3. 局部å˜é‡ä¸Žä¸­é—´ç»“果当å‰ç»Ÿä¸€é‡‡ç”¨æ ˆæ§½æ¨¡åž‹ï¼šæ‰€æœ‰å€¼å…ˆæ˜ å°„到栈槽,å†é€šè¿‡å›ºå®šå¯„存器 `w0`ã€`w8`ã€`w9` é…åˆ `ldur/stur/add` ç”Ÿæˆæ±‡ç¼–。 +4. `RegAlloc` 当å‰ä»…执行最å°ä¸€è‡´æ€§æ£€æŸ¥ï¼Œä¸å®žçŽ°çœŸå®žå¯„å­˜å™¨åˆ†é…。 +5. `FrameLowering` 当å‰ä¼šæ’入最å°åºè¨€/尾声,并按 16 å­—èŠ‚å¯¹é½æ ˆå¸§ã€‚ + + +说明:当å‰é˜¶æ®µåŽç«¯ä¸»è¦ç”¨äºŽæ¼”示完整æµç¨‹ã€‚å³ä½¿ä¸­é—´å€¼å¯ä»¥æš‚å­˜åœ¨å¯„å­˜å™¨ä¸­ï¼Œä¹Ÿä¼šå…ˆå†™å›žæ ˆæ§½ï¼Œè€Œä¸æ˜¯ç›´æŽ¥æž„造更接近最终机器代ç çš„寄存器æµã€‚åŽç»­å®žéªŒä¸­ï¼ŒåŒå­¦å¯æŒ‰éœ€æ±‚继续扩展指令选择ã€å¯„存器分é…ã€è°ƒç”¨çº¦å®šä¸ŽæŽ§åˆ¶æµç›¸å…³åŠŸèƒ½ã€‚ + +## 6. 构建与è¿è¡Œ + +```bash +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j "$(nproc)" +``` + +## 7. Lab3 éªŒè¯æ–¹å¼ + +é¡¹ç›®ç¼–è¯‘åŽæŒ‰æä¾›æµ‹è¯•输入回归: + +```bash +./build/bin/compiler --emit-asm test/test_case/simple_add.sy +``` + +推èä½¿ç”¨ç»Ÿä¸€è„šæœ¬éªŒè¯ â€œæºç  -> 汇编 -> 坿‰§è¡Œç¨‹åºâ€ 整体链路,用于验è¯åŽç«¯ä»£ç ç”Ÿæˆçš„æ­£ç¡®æ€§ï¼š + +```bash +./scripts/verify_asm_with_qemu.sh test/test_case/simple_add.sy out/asm --run +``` + +若最终输出 `退出ç : 3`ï¼Œè¯´æ˜Žå½“å‰æœ€å°å­é›†ç¤ºä¾‹ `return a + b` 的完整åŽç«¯é“¾è·¯å·²ç»è·‘通。