feat(traceback): 在 main 入口直接调用 Install()

MinGW 下 .ctors.65534 不被 CRT 执行,导致 Ctrl+C 无栈;改为编译期把 traceback_sha1.Install() 注入 main 入口,不依赖 .ctors/.init_array。
This commit is contained in:
TermiNexus committed 2026-10-19 17:31:12 +08:00
1 parent 0903491df3
commit 3da522a549
2 files changed
+20

No files matched your search

+13
View File
@@ -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
+7
View File
@@ -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: