refactor(backend): 单端 MLIR —— 发射器全树改名 mlirlite 并删除 --backend 开关

- App/Test 的 .vp 中 llvmlite 全部改名为 mlirlite(import、限定名、类型注解、注释)

- 删除后端开关:Config.set_backend/is_mlir_backend/alias_module_name、BackendTarget/BackendIsMlir、CLI --backend、options.backend/options.target 读取,以及 IncludesScanner/StubMergerIR 的模块别名调用

- BuildPipeline 的 mlir-opt -> mlir-translate 降级管线去掉开关门,改为恒执行

- backend_dir_suffix 改名 mlir_dir_suffix 并恒返回 _mlir:TempDir/OutputDir/includes 缓存继续落在 *_mlir,避免复用旧 LLVM 后端的 .ll/obj

- project.vpj 删除已失效的 options.target
This commit is contained in:
TermiNexus committed 2026-10-03 19:26:24 +08:00
1 parent 1dcd29db9c
commit 7b3e814524
70 files changed
+5670 -5746

No files matched your search

+16 -66
View File
@@ -44,15 +44,13 @@ IncludesDirs: str = None # 全部 includes 目录(空格分隔,多
_inc_bin_suffix: str = ".binary"
# ============================================================
# 后端(Emitter Backend)
# 发射后端:**单端 MLIR**(2026-10-03 起)
#
# "llvm"(默认):IR 发射走 includes/llvmlite(LLVM IR 文本),opt/llc 直接消费。
# "mlir" :模块名 llvmlite 在解析层重定向到 includes/mlirlite(MLIR 文本),
# 并在 opt/llc 之前插入 mlir-opt(校验)→ mlir-translate(降级回 LLVM IR)。
# 只认字符串 "mlir":缺省 / 未知值一律按 LLVM(BackendIsMlir=0),保证默认路径逐字不变。
# 全树发射器已由 includes/llvmlite 改为 includes/mlirlite(`import mlirlite`),
# 不再有 `--backend` 开关、不再有模块别名:mlirlite 发射的是 MLIR 文本,
# 故 BuildPipeline 恒在 opt/llc 之前插入
# mlir-opt(校验)→ mlir-translate --mlir-to-llvmir(降级回 LLVM IR)。
# ============================================================
BackendTarget: str = "llvm"
BackendIsMlir: int = 0
def Load_project_config(path: str) -> int:
@@ -156,16 +154,6 @@ def Load_project_config(path: str) -> int:
sm: JsonValue | t.CPtr = options["strict_mode"]
if sm is not None and sm.is_bool():
StrictMode = 1 if sm.as_bool() else 0
# 后端:options.backend(新键)优先,回退 options.target(兼容旧键)。
# 只认 "mlir";其余(含缺省/未知)按 LLVM。CLI --backend 由 main.vp
# 在本函数返回后覆盖(CLI 优先级最高)。
be_val: JsonValue | t.CPtr = options["backend"]
if be_val is not None and be_val.is_string():
set_backend(be_val.as_string())
else:
tgt_be: JsonValue | t.CPtr = options["target"]
if tgt_be is not None and tgt_be.is_string():
set_backend(tgt_be.as_string())
# 读取 includes 数组(支持多目录:首元素存 IncludesDir,全部拼接存 IncludesDirs)
includes_val: JsonValue | t.CPtr = root["includes"]
@@ -445,10 +433,10 @@ def resolve_paths(project_dir: str) -> int:
SourceDir = _join_path(SourceDir, project_dir)
BuildDir = _join_path(BuildDir, project_dir)
# TempDir = {BuildDir}/temp(非 LLVM 后端追加隔离后缀,如 _mlir;LLVM 时后缀为空串,路径逐字不变)
# TempDir = {BuildDir}/temp(单端 MLIR 恒追加 _mlir 隔离后缀)
if BuildDir is not None:
bd_len: sizet = string.strlen(BuildDir)
suf_dir: str = backend_dir_suffix()
suf_dir: str = mlir_dir_suffix()
suf_dir_len: sizet = string.strlen(suf_dir)
temp_buf: str = _mbuddy.alloc(bd_len + suf_dir_len + 8)
if temp_buf is not None:
@@ -661,13 +649,13 @@ def get_includes_binary_dir() -> str:
includes 目录如 ../includes,默认返回 ../includes.binary;
asan 模式(set_inc_bin_suffix(".binary_asan"))返回 ../includes.binary_asan,
隔离 asan 插桩 obj,避免与非 asan obj 混链。
非 LLVM 后端再追加后端后缀(如 .binary_asan_mlir),隔离不同后端的 obj。
再追加单端 MLIR 后缀(如 .binary_asan_mlir):隔离旧 LLVM 后端留下的缓存 obj。
"""
if IncludesDir is None:
return None
inc_len: sizet = string.strlen(IncludesDir)
suf_len: sizet = string.strlen(_inc_bin_suffix)
be_suf: str = backend_dir_suffix()
be_suf: str = mlir_dir_suffix()
be_suf_len: sizet = string.strlen(be_suf)
buf: str = _mbuddy.alloc(inc_len + suf_len + be_suf_len + 1)
if buf is None:
@@ -677,53 +665,15 @@ def get_includes_binary_dir() -> str:
# ============================================================
# 后端开关(Emitter Backend)
# 单端 MLIR 的目录隔离后缀
#
# set_backend: 只接受 "llvm" / "mlir"(其余返回 1 且不改动),大小写敏感。
# backend_dir_suffix: 非默认后端的目录隔离后缀;LLVM 后端返回空串(调用方拼出的
# 路径与改前逐字相同)。用于 TempDir/OutputDir/includes.binary。
# is_mlir_backend: 0/1 便捷视图(BuildPipeline 降级管线的门)。
# 发射器固定为 mlirlite(MLIR 文本),故后缀恒为 "_mlir":TempDir/OutputDir/
# includes 缓存都落在 *_mlir 目录,与旧 LLVM 后端留下的 temp/output/.binary
# 缓存彻底分离(否则增量构建会复用旧的 LLVM IR .ll / obj,喂给 mlir-opt 必炸)。
# ============================================================
def set_backend(name: str) -> int:
"""设置后端;0=成功,1=非法(name 为 None 或非 llvm/mlir)"""
global BackendTarget, BackendIsMlir
if name is None:
return 1
if string.strcmp(name, "llvm") == 0:
BackendTarget = name
BackendIsMlir = 0
return 0
if string.strcmp(name, "mlir") == 0:
BackendTarget = name
BackendIsMlir = 1
return 0
return 1
def is_mlir_backend() -> int:
"""是否 MLIR 后端(1=mlir / 0=llvm)"""
return BackendIsMlir
def backend_dir_suffix() -> str:
"""非默认后端的目录隔离后缀(LLVM 后端返回空串 ⇒ 路径逐字不变)"""
if BackendIsMlir != 0:
return "_mlir"
return ""
def alias_module_name(name: str) -> str:
"""MLIR 后端下把模块名 "llvmlite" 重定向到 "mlirlite"(其余原样返回)。
这是"TransPyV 调用点零改动"的唯一开关:所有 **名称→模块/文件/SHA1** 的解析
都应经此函数(模块文件解析 IncludesScanner.ResolveModuleToPath、依赖名→SHA1
StubMergerIR._FindSha1ByModName 等)。LLVM 后端恒等返回,默认路径逐字不变。
"""
if name is None:
return None
if BackendIsMlir != 0 and string.strcmp(name, "llvmlite") == 0:
return "mlirlite"
return name
def mlir_dir_suffix() -> str:
"""单端 MLIR 的目录隔离后缀(恒为 "_mlir")"""
return "_mlir"
def asan_runtime_declared() -> int: