最简路径是直接运行toyc-ch2 --emit=mlir,但需确保LLVM/MLIR已编译完成且build/bin在PATH中;否则会报command not found或链接错误。

toyc-ch2 并指定 --emit=mlir 是最简路径,但前提是 LLVM/MLIR 已正确编译且环境变量就绪;否则会报错找不到命令或链接失败。
确认 MLIR 编译完成且 bin 目录在 PATH 中
Toy 教程依赖预编译的 toyc-ch* 可执行文件,它们不在系统默认路径里。常见错误是直接敲 toyc-ch2 报 command not found。
- 先确认你已按官方方式构建:进入
llvm-project/build后执行cmake --build . --target toyc-ch2(不是只 build all) -
toyc-ch2生成在build/bin/下,运行前必须把该路径加进PATH,例如:export PATH=$PWD/bin:$PATH - 验证:运行
which toyc-ch2应输出完整路径;运行toyc-ch2 --help不应报错
用 toyc-ch2 生成并查看 MLIR IR
Toy 源码(如 ast.toy)需配合 --emit=mlir 才能输出 MLIR 表达式;仅用 --emit=ast 不会触发 MLIRGen 阶段。
- 示例命令:
toyc-ch2 ../../mlir/test/Examples/Toy/Ch2/ast.toy --emit=mlir - 注意路径是相对于当前工作目录的——若你在
build/bin下运行,../../mlir/...才能正确找到测试文件 - 输出中会出现
toy.func、toy.transpose等操作,说明已成功进入 Toy Dialect 层 - 若看到
error: 'toy.transpose' op is not legal,说明后续 lowering 步骤未启用,这属于正常现象——ch2阶段本就不做 lowering
想让 Toy 程序真正执行?得走完 lowering 到 LLVM + JIT
单纯生成 MLIR 并不能运行;要看到打印结果,必须降到 LLVM Dialect 并用 JIT 执行。这涉及 ch5–ch6 的完整流程,不是 toyc-ch2 能完成的。
- 关键命令是
toyc-ch6(非ch2),它内置了从 Toy → Standard/Affine/MemRef → LLVM Dialect → LLVM IR → JIT 的整条链 - 运行:
toyc-ch6 ../mlir/test/Examples/Toy/Ch6/test.toy -emit=llvm -optimize,再加-run即可执行(部分版本支持) - 更可靠的做法是导出为 LLVM IR 文件:
toyc-ch6 test.toy -emit=llvm > test.ll,再用lli test.ll运行(需系统已装 LLVM 工具链) - 注意
toy.print在 lowering 到 LLVM 时需手动绑定printf,若缺失该逻辑,JIT 会报symbol not found: printf
最容易被忽略的坑:TableGen 和 dialect 注册没生效
即使编译通过,toyc-ch* 也可能静默跳过某些 dialect 或 operation,导致 IR 输出不全或优化失效。
典型表现:运行 toyc-ch3 时 transpose(transpose(x)) 没被简化成 x;或 toyc-ch5 输出里仍有 toy.* op。根本原因常是:Ops.td 没被正确 include 进 CMake 构建,或 getDialects() 里漏注册了 toy::ToyDialect。检查 build/lib/ 下是否有 libMLIRToyDialect.so(Linux)或对应 dylib(macOS)——没有就说明 dialect 未加载。

















