From 14920c0e1ef3e23fa9120008171c3c381510164e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 8 Oct 2026 17:58:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(vpi):=20=E9=80=83=E9=80=B8=E6=91=98?= =?UTF-8?q?=E8=A6=81=E5=9C=A8=E6=89=80=E6=9C=89=20vpi=20=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E7=82=B9=E9=83=BD=E5=96=82=E7=BC=93=E5=AD=98=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=20EscapeXmodTest=20=E8=B7=A8=E6=A8=A1=E5=9D=97=E6=BC=8F?= =?UTF-8?q?=E6=A3=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _ensure_vpi_ret_annot_loaded 开头有"本模块 ret 注解已缓存则直接 return 1"的短路:若某模块先经 _ParseVpiIntoModuleImpl(stub 注入)加载,而该处只喂了 ret/param 缓存、没喂逃逸缓存,后续跨模块逃逸查询就会永久查空。现场:EscapeXmodTest 漏检——box.vpi 里 `# esc=2 ret=0` 落盘正确,查询侧却命中不到。在该加载点补 _cache_vpi_escape_annots_text。 --- App/lib/Stub/StubGen/VpiReader.vp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/App/lib/Stub/StubGen/VpiReader.vp b/App/lib/Stub/StubGen/VpiReader.vp index 5600dad..3acb895 100644 --- a/App/lib/Stub/StubGen/VpiReader.vp +++ b/App/lib/Stub/StubGen/VpiReader.vp @@ -1803,6 +1803,11 @@ def _ParseVpiIntoModuleImpl(pool: memhub.MemBuddy*, mod: mlirlite.LLVMModule*, v # Likewise cache param annotations (tree param lists may be truncated; # _inject_*_declare uses this cache to complete declare param counts). _cache_vpi_param_annots_text(vpi_buf, src_sha1) + # v3 逃逸摘要必须**在所有 vpi 加载点**都喂一份:_ensure_vpi_ret_annot_loaded 开头有 + # "本模块 ret 注解已缓存 → 直接 return 1" 的短路,若某模块先经本函数(stub 注入) + # 加载、而这里没喂逃逸缓存,后续跨模块逃逸查询就会永久命中不到(现场:EscapeXmodTest + # 漏检——box.vpi 里 `# esc=2` 明明写对了,查询侧却查空)。 + _cache_vpi_escape_annots_text(vpi_buf, src_sha1) # 3. walk top-level AST nodes ch: list[ast.AST*]* = tree.children