feat(traceback): 在 main 入口直接调用 Install()
MinGW 下 .ctors.65534 不被 CRT 执行,导致 Ctrl+C 无栈;改为编译期把 traceback_sha1.Install() 注入 main 入口,不依赖 .ctors/.init_array。
This commit is contained in:
1 parent
0903491df3
commit
3da522a549
2 files changed
+20
No files matched your search
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user