import t, c from stdint import * import memhub import string import stdlib import llvmlite import w32.win32file as win32file import w32.win32base as win32base import w32.fileio as fileio import viperlib import sys import ast import lib.core.VLogger as VLogger import lib.core.IncludesScanner as IncludesScanner import lib.core.Gen.Translator as HandlesTranslator import lib.Phase.BuildPipeline as BuildPipeline import lib.Stub.StubGen.VpiReader as VpiReader import lib.Projectrans.Utils as Utils import lib.Projectrans.Config as Config # ============================================================ # StubMerger - stub 声明合并模块(Phase2 核心) # # 从 temp 目录加载所有 .stub.ll,把依赖模块的声明合并到主 IR 的 target triple 之后,使链接器能解析跨模块符号引用。 # 合并策略:扫描 temp 目录收集 {sha1}.stub.ll → 读取内容 → 过滤去重(避免重复声明)→ 插入主 IR。 # ============================================================ # 全局 mbuddy 指针 _mbuddy: memhub.MemBuddy* # 最大 includes SHA1 数(用于过滤) MAX_INCLUDES_SHA1: t.CDefine = 1024 # stub 读取缓冲区大小 # 1MB 不够:ast/parser.vp 的 text.ll >1MB,BuildCombinedIR 读取本地 text.ll # 单次截断 → 合并 IR 尾部丢字(opt: "end of file in global variable name")。 STUB_READ_BUF_SIZE: t.CDefine = 8388608 # 最大 includes 条目数 MAX_INCLUDES: t.CDefine = 1024 # 可达性分析 worklist/processed 缓冲区大小(8192 不够:递归扫描 source_dir # 后 worklist 含全部 App 文件 imports 的拼接 + BFS 依赖展开,追加82 溢出) REACH_WORKLIST_BUF: t.CDefine = 65536 # 全局 SHA1 映射存储器(内存中,不依赖 _sha1_map.txt 文件) # Phase1 扫描完成后填充,供所有函数使用 _sha1_store_arr: bytes # SHA1 数组(每个 17 字节,MAX_INCLUDES 个) _sha1_store_mod: bytes # 模块名数组(每个 64 字节,MAX_INCLUDES 个) _sha1_store_rel: bytes # 相对路径数组(每个 256 字节,MAX_INCLUDES 个) _sha1_store_incdir: bytes # 所属 includes 根目录数组(每个 512 字节,MAX_INCLUDES 个,多 includes 支持) _sha1_store_count: int # 条目数 # includes 依赖内存存储(不依赖 deps.txt 过程文件) # Phase B+ 前用 declare_only 翻译所有 includes 文件,提取 _imported_modules 存入此处 # _BuildReachableSha1Set 从此处读取依赖,不读 deps.txt _includes_deps_sha1: bytes # SHA1 数组(每个 17 字节,MAX_INCLUDES 个) _includes_deps_str: bytes # 依赖字符串数组(每个 512 字节,MAX_INCLUDES 个) _includes_deps_count: int # 条目数 # BuildCombinedIR 全目录扫描缓存:Phase B 每个源文件调用一次 BuildCombinedIR,而 _collect_stub_sha1s 会递归枚举 # temp_dir 全部切片子目录(O(N×S) 目录枚举很慢);按 temp_dir 缓存扫描结果,首次扫描后复用,temp_dir 变化时自动重建。 _stub_scan_cache_dir: str # 缓存对应的 temp_dir(None=未初始化) _stub_scan_cache_arr: str # 扫描结果数组(每 17 字节一个 SHA1,MAX_INCLUDES_SHA1 个) _stub_scan_cache_count: int # 收集数量 # 单条依赖字符串最大长度 MAX_DEPS_STR_LEN: t.CDefine = 512 # rel_path 最大长度 MAX_REL_PATH_LEN: t.CDefine = 256 # includes 根目录最大长度(绝对路径,多 includes 支持) MAX_INC_DIR_LEN: t.CDefine = 512