From bbfb8f2c69418d8ace0fb71a876358f9ab1a0768 Mon Sep 17 00:00:00 2001 From: mxr <> Date: Mon, 13 Apr 2026 22:01:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(mir)=E9=93=BE=E6=8E=A5=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E7=9A=84=20SysY=20=E8=BF=90=E8=A1=8C=E6=97=B6=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/libsysy.a | Bin 0 -> 12296 bytes scripts/verify_asm.sh | 3 ++- src/mir/AsmPrinter.cpp | 14 +++++++++++++- src/mir/Lowering.cpp | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 lib/libsysy.a diff --git a/lib/libsysy.a b/lib/libsysy.a new file mode 100644 index 0000000000000000000000000000000000000000..c6fe87c3e029ad81e2937cac25d174e3030940d7 GIT binary patch literal 12296 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 "$asm_file" echo "汇编已生成: $asm_file" -aarch64-linux-gnu-gcc "$asm_file" -o "$exe" +# 静态链接 +aarch64-linux-gnu-gcc -no-pie "$asm_file" -L./lib -lsysy -static -o "$exe" echo "可执行文件已生成: $exe" if [[ "$run_exec" == true ]]; then diff --git a/src/mir/AsmPrinter.cpp b/src/mir/AsmPrinter.cpp index 4a35a81..5a45801 100644 --- a/src/mir/AsmPrinter.cpp +++ b/src/mir/AsmPrinter.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "utils/Log.h" @@ -447,10 +448,21 @@ void PrintAsm(const MachineModule& module, std::ostream& os) { os << ".size " << g.name << ", " << g.size << "\n\n"; } } - + + static const std::set externalFuncs = { + "getint", "getch", "getarray", "putint", "putch", "putarray", "puts", + "_sysy_starttime", "_sysy_stoptime", "starttime", "stoptime", + "getfloat", "putfloat", "getfarray", "putfarray", "memset", + "sysy_alloc_i32", "sysy_alloc_f32", "sysy_free_i32", "sysy_free_f32", + "sysy_zero_i32", "sysy_zero_f32" + }; DEBUG_MSG("module"); // 遍历所有函数,输出汇编 for (const auto& func : module.GetFunctions()) { + + if (externalFuncs.count(func->GetName())) { + continue; // 跳过库函数桩 + } DEBUG_MSG("func"); PrintAsm(*func, os); os << "\n"; diff --git a/src/mir/Lowering.cpp b/src/mir/Lowering.cpp index 80bd986..53c755d 100644 --- a/src/mir/Lowering.cpp +++ b/src/mir/Lowering.cpp @@ -7,7 +7,7 @@ #include "ir/IR.h" #include "utils/Log.h" -#define DEBUG_Lower +//#define DEBUG_Lower #ifdef DEBUG_Lower #include