From 31898ab4a5d693fe89f7acf931f2bd39da63dacb Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 27 Sep 2026 18:30:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(stubmerger):=20define=E2=86=92declare=20?= =?UTF-8?q?=E9=99=8D=E7=BA=A7=E6=97=B6=E5=89=A5=E6=8E=89=E8=A1=8C=E5=B0=BE?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E7=BA=A7=E5=85=83=E6=95=B0=E6=8D=AE=E9=99=84?= =?UTF-8?q?=E5=8A=A0=EF=BC=88!dbg=20!N=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit llc 对 declare 不接受元数据附加,报 expected = here(实证 LLvmLiteTest 949685246c8e241c.ll:898:104 的 declare ... !dbg !71) 根因:降级只删尾部 ' {',源 define 头行的 ' !dbg !71' 被原样抄下;declare 无函数体,!dbg 无意义(FunctionPrint 对 declare 从不打印 !dbg) 判据:参数表之后、括号深度 0、不在双引号内的 ' !';连同前导空白一起截断 --- App/lib/Stub/StubMerger/StubMergerBuild.vp | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/App/lib/Stub/StubMerger/StubMergerBuild.vp b/App/lib/Stub/StubMerger/StubMergerBuild.vp index 7e772c4..0ab3307 100644 --- a/App/lib/Stub/StubMerger/StubMergerBuild.vp +++ b/App/lib/Stub/StubMerger/StubMergerBuild.vp @@ -549,6 +549,43 @@ def _LoadAndAppendTextDeclares(temp_dir: str, td_len: sizet, dep_sha1: str, if dep_buf[decl_end - 1] == '{' and dep_buf[decl_end - 2] == ' ': decl_end -= 2 + # 剥掉行尾的**函数级元数据附加**(`!dbg !71`;可多组如 `!dbg !71 !prof !72`)。 + # declare **不接受**函数级元数据附加:llc 直接报 "expected '='"(实证 + # LLvmLiteTest 合并产物 949685246c8e241c.ll:898:104 — + # `declare void @"…GSList[Param].__init__"(…) !dbg !71`)。这条残留正是 + # "文本降级 define→declare"自身带出来的:源 define 头行形如 + # `define linkonce_odr void @"…"(…) !dbg !71 {`,上面只删掉了尾部 `" {"`, + # 其后的 ` !dbg !71` 被原样抄下。declare 无函数体,!dbg 本就无意义 + # (FunctionPrint 对 declare 从不打印 !dbg,见 llvmlite/__function.vp 的 + # IsDeclared==1 提前返回分支),故在此直接截断。 + # 判据:参数表之后、括号深度 0、且不在双引号内的 ` !`(元数据附加恒在行尾, + # 裸标识符不允许含 '!',唯一可能含 '!' 的是带引号的符号名 → 用引号态排除)。 + meta_pos_lt: sizet = ls + meta_depth_lt: int = 0 + meta_in_str_lt: int = 0 + meta_cut_lt: sizet = 0 + while meta_pos_lt < decl_end: + meta_ch_lt: int = dep_buf[meta_pos_lt] + if meta_ch_lt == '"': + meta_in_str_lt = 1 - meta_in_str_lt + elif meta_in_str_lt == 0: + if meta_ch_lt == '(' or meta_ch_lt == '[' or meta_ch_lt == '{': + meta_depth_lt += 1 + elif meta_ch_lt == ')' or meta_ch_lt == ']' or meta_ch_lt == '}': + if meta_depth_lt > 0: + meta_depth_lt -= 1 + elif meta_ch_lt == '!' and meta_depth_lt == 0 and meta_pos_lt > ls \ + and dep_buf[meta_pos_lt - 1] <= ' ': + meta_cut_lt = meta_pos_lt + break + meta_pos_lt += 1 + if meta_cut_lt != 0: + # 连同前导空白一起截掉,避免残留行尾空白 + # (`<= ' '` 同时覆盖空格与制表符,且不会误吃 ')' 等非空白字符) + while meta_cut_lt > ls and dep_buf[meta_cut_lt - 1] <= ' ': + meta_cut_lt -= 1 + decl_end = meta_cut_lt + # 输出: declare + content(跳过 "define " 及其后所有 linkage 词,至多到 decl_end)。 # 泛型特化方法 define 名为 "define linkonce_odr ..."(名含 '['):只跳 "define " 会拼出 "declare linkonce_odr ..." → # llc 报 "invalid linkage for function declaration"(declare 只能 external),故循环剥掉全部 linkage 词。