diff --git a/mlirlite/__types.vp b/mlirlite/__types.vp index 30a5c61..7da9762 100644 --- a/mlirlite/__types.vp +++ b/mlirlite/__types.vp @@ -683,12 +683,15 @@ def TypePrint(buf: str, size: sizet, # ============================================================ # 类型文本 → MLIR 类型文本转换 # -# 中间指令文本里的类型是 LLVM 语法(i8*、[4 x i32]、{i32, i8*}、%"name"), -# 需要转换成 MLIR 语法(!llvm.ptr、!llvm.array<4 x i32>、 -# !llvm.struct<(i32, !llvm.ptr)>、!llvm.struct<(…)>)后才能写进 op 行。 +# 中间指令文本里的类型有两种来源,本函数**都接受**: +# ① MLIR 形态(常态):builders 内嵌类型经 _type_str → TypePrint 渲染, +# 已是 `i32` / `f64` / `!llvm.ptr` / `!llvm.array` / `!llvm.struct<(…)>` +# —— 以 `!` 开头者与浮点标量 `f16/f32/f64/f128` 原样直通,`iN` 走整数分支; +# ② LLVM 形态(手工构造中间文本时可能出现):`i8*` / `[4 x i32]` / `{i32, i8*}` +# / `double` / `%"name"`,由下方各分支转写为对应 MLIR 语法。 # ============================================================ def MlirTypeText(dst: str, dstsz: sizet, src: str, pool: memhub.MemBuddy*): - """把 LLVM 语法类型文本转换为 MLIR 类型文本(追加到 dst)""" + """把中间文本类型(MLIR 或 LLVM 形态)规范化为 MLIR 类型文本(追加到 dst)""" if dst is None or dstsz == 0 or src is None: return _MlirTypeAppend(dst, dstsz, src, pool, 0) @@ -779,6 +782,13 @@ def _MlirTypeAppend(dst: str, dstsz: sizet, src: str, pool: memhub.MemBuddy*, if p[0] == '!': _MlirAppendN(dst, dstsz, p, lt) return + # 浮点标量的 MLIR 形态 f16/f32/f64/f128:TypePrint 直接输出该形态(见本文件 + # 顶部 TypePrint 渲染规则),必须原样直通;下方 half/float/double/fp128 分支 + # 只兼容手工构造的 LLVM 形态中间文本。'f' + 全数字与上述 LLVM 名不冲突 + # ("float" 次字符 'l'、"fp128" 次字符 'p' 均非数字)。 + if p[0] == 'f' and _MlirAllDigits(p, lt, 1) != 0: + _MlirAppendN(dst, dstsz, p, lt) + return if lt == 4 and string.strncmp(p, "none", 4) == 0: _strappend(dst, dstsz, "none") return