fix: vpi stub 注入期间修正错误归因,多级堆栈显示编译上下文与被读 stub 真实位置
This commit is contained in:
1 parent
94ae2aee52
commit
6dbcbe247e
3 files changed
+33
-2
No files matched your search
@@ -463,7 +463,26 @@ def ParseVpiIntoModule(pool: memhub.MemBuddy | t.CPtr,
|
|||||||
mod: llvmlite.LLVMModule | t.CPtr,
|
mod: llvmlite.LLVMModule | t.CPtr,
|
||||||
vpi_path: str,
|
vpi_path: str,
|
||||||
trans: HT.Translator | t.CPtr) -> int:
|
trans: HT.Translator | t.CPtr) -> int:
|
||||||
"""解析 .vpi 文件,将函数声明注入到当前模块"""
|
"""解析 .vpi 文件,将函数声明注入到当前模块
|
||||||
|
|
||||||
|
解析 stub 期间临时将错误归因切换到被读 stub 文件(.vpi):
|
||||||
|
注解解析失败时 fatal_error 应指向 stub 及其行号(真实出错位置),
|
||||||
|
而非当前编译模块(错误归因修复)。
|
||||||
|
"""
|
||||||
|
if pool is None or mod is None or vpi_path is None or trans is None:
|
||||||
|
return 0
|
||||||
|
saved_cur: str = HandlesType.get_current_file()
|
||||||
|
HandlesType.set_current_file(vpi_path)
|
||||||
|
ret: int = _ParseVpiIntoModuleImpl(pool, mod, vpi_path, trans)
|
||||||
|
HandlesType.set_current_file(saved_cur)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def _ParseVpiIntoModuleImpl(pool: memhub.MemBuddy | t.CPtr,
|
||||||
|
mod: llvmlite.LLVMModule | t.CPtr,
|
||||||
|
vpi_path: str,
|
||||||
|
trans: HT.Translator | t.CPtr) -> int:
|
||||||
|
"""解析 .vpi 文件,将函数声明注入到当前模块(ParseVpiIntoModule 实际实现)"""
|
||||||
if pool is None or mod is None or vpi_path is None or trans is None:
|
if pool is None or mod is None or vpi_path is None or trans is None:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|||||||
@@ -745,6 +745,11 @@ def set_current_file(file_path: str):
|
|||||||
_g_current_file = file_path
|
_g_current_file = file_path
|
||||||
|
|
||||||
|
|
||||||
|
def get_current_file() -> str:
|
||||||
|
"""获取当前编译的文件名(供报错归因使用)"""
|
||||||
|
return _g_current_file
|
||||||
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# _read_source_line - 从源文件读取第 lineno 行
|
# _read_source_line - 从源文件读取第 lineno 行
|
||||||
#
|
#
|
||||||
@@ -823,12 +828,14 @@ def fatal_error(node: ast.AST | t.CPtr, msg: str,
|
|||||||
for i in range(_g_trace_count):
|
for i in range(_g_trace_count):
|
||||||
frame: TraceFrame | t.CPtr = _get_trace_frame(i)
|
frame: TraceFrame | t.CPtr = _get_trace_frame(i)
|
||||||
if frame is not None and frame.file_name is not None:
|
if frame is not None and frame.file_name is not None:
|
||||||
stdio.printf(' File "%s", line %d\n', frame.file_name, frame.lineno)
|
|
||||||
if frame.lineno > 0:
|
if frame.lineno > 0:
|
||||||
|
stdio.printf(' File "%s", line %d\n', frame.file_name, frame.lineno)
|
||||||
src: str = _read_source_line(frame.file_name, frame.lineno)
|
src: str = _read_source_line(frame.file_name, frame.lineno)
|
||||||
if src is not None:
|
if src is not None:
|
||||||
stdio.printf(" %s\n", src)
|
stdio.printf(" %s\n", src)
|
||||||
stdlib.free(src)
|
stdlib.free(src)
|
||||||
|
else:
|
||||||
|
stdio.printf(' File "%s"\n', frame.file_name)
|
||||||
# 输出当前帧(node 对应的位置)
|
# 输出当前帧(node 对应的位置)
|
||||||
lineno: int = 0
|
lineno: int = 0
|
||||||
if node is not None:
|
if node is not None:
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import lib.core.IncludesScanner as IncludesScanner
|
|||||||
import lib.core.Handles.HandlesStruct as HandlesStruct
|
import lib.core.Handles.HandlesStruct as HandlesStruct
|
||||||
import lib.core.Handles.HandlesImports as HandlesImports
|
import lib.core.Handles.HandlesImports as HandlesImports
|
||||||
import lib.core.Handles.HandlesTranslator as HandlesTranslator
|
import lib.core.Handles.HandlesTranslator as HandlesTranslator
|
||||||
|
import lib.core.Handles.HandlesType as HandlesType
|
||||||
import lib.core.BuildPipeline as BuildPipeline
|
import lib.core.BuildPipeline as BuildPipeline
|
||||||
import lib.StubGen.VpiReader as VpiReader
|
import lib.StubGen.VpiReader as VpiReader
|
||||||
import lib.Projectrans.Utils as Utils
|
import lib.Projectrans.Utils as Utils
|
||||||
@@ -2084,7 +2085,11 @@ def LoadDepVpiIntoModule(pool: memhub.MemBuddy | t.CPtr,
|
|||||||
if not vf.closed:
|
if not vf.closed:
|
||||||
vf.close()
|
vf.close()
|
||||||
# 调用 VpiReader 解析 .vpi 并注入 declare
|
# 调用 VpiReader 解析 .vpi 并注入 declare
|
||||||
|
# 错误归因:push 当前编译模块帧,stub 解析期间若 fatal_error,
|
||||||
|
# 多级堆栈显示 当前模块 → 被读 stub 文件(真实出错位置)
|
||||||
|
HandlesType.push_trace(HandlesType.get_current_file(), 0)
|
||||||
ret: int = VpiReader.ParseVpiIntoModule(pool, mod, vpi_path, trans)
|
ret: int = VpiReader.ParseVpiIntoModule(pool, mod, vpi_path, trans)
|
||||||
|
HandlesType.pop_trace()
|
||||||
if ret == 1:
|
if ret == 1:
|
||||||
success_count += 1
|
success_count += 1
|
||||||
stdlib.free(vpi_path)
|
stdlib.free(vpi_path)
|
||||||
|
|||||||
Reference in new issue
Block a user