按 wiki/新规范: - T | t.CPtr → T*(无 | 标准) - t.CInt/t.CUInt64T/t.CChar/t.CDouble 等 → int/uint64/char/double 等短别名 - X: t.CDefine = Y → define X = Y - c.Asm → __asm__,c.AsmInp/c.AsmOut → asminp/asmout,t.ASM_DESCR. → ASM_DESCR. - c.Addr(x) → &x,c.Deref(p) → *p,c.DerefAs(p, v) → *p = v 种子自举通过(96s)。
66 lines
2.9 KiB
Plaintext
66 lines
2.9 KiB
Plaintext
import t, c
|
|
from stdint import *
|
|
import memhub
|
|
import string
|
|
import stdlib
|
|
import mlirlite
|
|
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 数(用于过滤)
|
|
define MAX_INCLUDES_SHA1 = 1024
|
|
# stub/text 读取缓冲区大小
|
|
# 1MB 不够:ast/parser.vp 的 text.ll >1MB,读取本地 text.ll 单次截断
|
|
# → 尾部丢字(opt: "end of file in global variable name")。
|
|
define STUB_READ_BUF_SIZE = 8388608
|
|
# 最大 includes 条目数
|
|
define MAX_INCLUDES = 1024
|
|
# 可达性分析 worklist/processed 缓冲区大小(8192 不够:递归扫描 source_dir
|
|
# 后 worklist 含全部 App 文件 imports 的拼接 + BFS 依赖展开,追加82 溢出)
|
|
define REACH_WORKLIST_BUF = 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 # 条目数
|
|
|
|
# 单条依赖字符串最大长度
|
|
define MAX_DEPS_STR_LEN = 512
|
|
|
|
# rel_path 最大长度
|
|
define MAX_REL_PATH_LEN = 256
|
|
# includes 根目录最大长度(绝对路径,多 includes 支持)
|
|
define MAX_INC_DIR_LEN = 512
|