From 3da522a549599f6d2201af8a04e854dd39836556 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 19 Oct 2026 17:31:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(traceback):=20=E5=9C=A8=20main=20=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E7=9B=B4=E6=8E=A5=E8=B0=83=E7=94=A8=20Install()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MinGW 下 .ctors.65534 不被 CRT 执行,导致 Ctrl+C 无栈;改为编译期把 traceback_sha1.Install() 注入 main 入口,不依赖 .ctors/.init_array。 --- lib/Projectrans/Phase2Translator.py | 13 +++++++++++++ lib/core/Handles/HandlesFunctions.py | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/lib/Projectrans/Phase2Translator.py b/lib/Projectrans/Phase2Translator.py index f557709..6b12c7c 100644 --- a/lib/Projectrans/Phase2Translator.py +++ b/lib/Projectrans/Phase2Translator.py @@ -2354,6 +2354,19 @@ class Phase2Translator: and os.path.basename(src_path) in _TRACEBACK_MODULE_FILES) if _traceback_ctor: trans.translator.TracebackCtor = True + # --traceback:记录 traceback.Install 的跨模块符号名,含 main 的模块在入口 + # 直接调用它(不依赖 .ctors/.init_array,避免 MinGW 下 .ctors.65534 不执行)。 + if self.traceback_enabled: + _tb_sha1: str | None = None + for _src_map in (getattr(self, '_shared_source_module_sig_files', {}), self.sig_files): + for _k, _p in _src_map.items(): + if 'traceback' in os.path.basename(_p): + _tb_sha1 = _k + break + if _tb_sha1: + break + if _tb_sha1 is not None: + trans.translator.TracebackInstallSymbol = f'{_tb_sha1}.Install' trans.SliceLevel = self.slice_level trans.translator.SliceLevel = self.slice_level trans.translator.SliceCount = 0 diff --git a/lib/core/Handles/HandlesFunctions.py b/lib/core/Handles/HandlesFunctions.py index 971917e..fd4bcb2 100644 --- a/lib/core/Handles/HandlesFunctions.py +++ b/lib/core/Handles/HandlesFunctions.py @@ -2054,6 +2054,13 @@ class FunctionHandle(BaseHandle): func_body = func_body[1:] else: Gen._create_doc_global(doc_symbol, None) + if Node.name == 'main': + _tb_install: str | None = getattr(self.Trans, 'TracebackInstallSymbol', None) + if _tb_install: + _install_fn = Gen._CreateOrReuseFuncDecl( + _tb_install, ir.FunctionType(ir.IntType(32), [])) + _entry_block = func.blocks[0] if func.blocks else func.append_basic_block('entry') + ir.IRBuilder(_entry_block).call(_install_fn, []) try: self.Trans.BodyHandler.HandleBodyLlvm(func_body) except Exception as _body_exc: