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)
|
and os.path.basename(src_path) in _TRACEBACK_MODULE_FILES)
|
||||||
if _traceback_ctor:
|
if _traceback_ctor:
|
||||||
trans.translator.TracebackCtor = True
|
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.SliceLevel = self.slice_level
|
||||||
trans.translator.SliceLevel = self.slice_level
|
trans.translator.SliceLevel = self.slice_level
|
||||||
trans.translator.SliceCount = 0
|
trans.translator.SliceCount = 0
|
||||||
|
|||||||
@@ -2054,6 +2054,13 @@ class FunctionHandle(BaseHandle):
|
|||||||
func_body = func_body[1:]
|
func_body = func_body[1:]
|
||||||
else:
|
else:
|
||||||
Gen._create_doc_global(doc_symbol, None)
|
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:
|
try:
|
||||||
self.Trans.BodyHandler.HandleBodyLlvm(func_body)
|
self.Trans.BodyHandler.HandleBodyLlvm(func_body)
|
||||||
except Exception as _body_exc:
|
except Exception as _body_exc:
|
||||||
|
|||||||
Reference in new issue
Block a user