1,下载源代码
$ git clone --mirror https://github.com/llvm/llvm-project.git
$ git clone ./llvm-project.git
2,编译 Debug 版本 mlir工具
编译:
$ cd llvm-project
$ git checkout llvmorg-16.0.1
$ mkdir build
$ cd build
cmake -G Ninja ../llvm \
-DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lldb;lld;polly;mlir" \
-DLLVM_BUILD_EXAMPLES=ON \
-DLLVM_TARGETS_TO_BUILD="Native;NVPTX;AMDGPU" \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_USE_SPLIT_DWARF=ON \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_INSTALL_UTILS=ON
「注:关于 utils,
-DLLVM_INSTALL_UTILS=ON
是 in order to install `FileCheck` to the chosen installation prefix.
至少当 build /llvm-project/mlir/examples/standalone/CMakeLists.txt 时会用到。
build standalone of mlir example:
$ export UILD_DIR=/home/hipper/ex_mlir/tmp2/llvm-project/build
$ export BUILD_DIR=/home/hipper/ex_mlir/tmp2/llvm-project/build
$ cmake -G Ninja .. -DMLIR_DIR=$PREFIX/lib/cmake/mlir -DLLVM_EXTERNAL_LIT=$BUILD_DIR/bin/llvm-lit
」
编译:
$ ninja
#or cmake --build . --target check-mlir
# 后一种 or 的方式测试不太好用,会遗漏许多目标的构建
安装:
$ cmake -DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir -P cmake_install.cmake
or 的那种方式会遗漏一些目标,可以后补。
可能的错误处理:
如果出现找不到libclang-cpp.so:
llvm-project/build/lib/libclang-cpp.so": No such file or directory.
则考虑手动生成:
$ ninja libclang-cpp.so
然后重新执行install:
$ cmake -DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir -P cmake_install.cmake
还有可能遇到的其他类似 target,需要手动生成:
$ ninja libclang-cpp.so
$ ninja lldb
$ ninja liblldbIntelFeatures.so
$ ninja lldb-vscode
$ ninja lldb-server
然后重新执行install:
$ cmake -DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir -P cmake_install.cmake
其中,
关于构建 lldb-server 时,可能的 libpanel 符号不匹配问题,比如,安装了多个版本的 ncurses lib等导致lib 互相不匹配。
$ ninja lldb-server
nm -D /usr/lib/x86_64-linux-gnu/libpanel.so | grep is_linetouched
nm -D /usr/lib/x86_64-linux-gnu/libncurses.so | grep is_linetouched
找到 ld 的curses lib 和 panel lib 的符号匹配关系。
若有必要,可以手动mv掉一些错误link的lib,根据 链接 配置参数,建立正确的符号连接。
3,编译 Release 版 mlir
$ cd llvm-project
$ git checkout llvmorg-16.0.1
$ mkdir build
$ cd build
cmake -G Ninja ../llvm \
-DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir \
-DLLVM_ENABLE_PROJECTS="clang;lld;mlir" \
-DLLVM_BUILD_EXAMPLES=ON \
-DLLVM_TARGETS_TO_BUILD="Native;NVPTX;AMDGPU" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_INSTALL_UTILS=ON
4,检测环境
../../locald_16.0.6_x86_mlir/bin/mlir-opt --version
$ ../../locald_16.0.6_x86_mlir/mlir-opt --version
显示版本号:

5,简单应用
MLIR 的 Hello World!
写一个文本文件:
文件名 hello_world.mlir, 内容如下,
module {
memref.global "private" constant @string : memref<13xi8> = dense<[0x48,0x65,0x6c,0x6c,0x6f,0x2c,0x20,0x4d,0x4c,0x49,0x52,0x21,0]>
llvm.func external @puts(!llvm.ptr<i8>) -> ()
func.func @main() -> i64 {
%c0_i64 = arith.constant 0 : i64
%0 = memref.get_global @string : memref<13xi8>
%1 = memref.extract_aligned_pointer_as_index %0 : memref<13xi8> -> index
%2 = arith.index_cast %1 : index to i64
%3 = llvm.inttoptr %2 : i64 to !llvm.ptr<i8>
llvm.call @puts(%3) : (!llvm.ptr<i8>) -> ()
return %c0_i64 : i64
}
}
编译成为 llvm 方言:
$ ../locald_16.0.6_x86_mlir/bin/mlir-opt --convert-func-to-llvm --convert-memref-to-llvm --convert-arith-to-llvm --reconcile-unrealized-casts hello_world.mlir -o hello_world.llvm.mlir
生成内容见下图,
将 llvm 方言 编译为 llvm IR:
$ mlir-translate --mlir-to-llvmir hello_world.llvm.mlir -o hello_world.ll
具体文件名无关紧要,
内容为见下图,可以使用lli来运行,

或者使用clang 将 .ll 文件 编译成为可执行文件:
![]()
6,mlir 的 toy
因为在cmake 配置中加入了选项
-DLLVM_BUILD_EXAMPLES=ON
所以, 可以在安装目录中看到example文件夹:

这里的 toyc-ch1 ~ 7 就是mlir/examples/toy/ 中的源码编译出来的,我们下一节分析一下它们。
7,tableGen 的应用
由td文件生成纪录,直接生成hpp文件;
将 td 文件转换成纪录:
$ ../../locald_16.0.6_x86_mlir/bin/llvm-tblgen \
-I ../../llvm-project/llvm/include \
-I ../../llvm-project/llvm/lib/Target/RISCV \
--print-records \
../../llvm-project/llvm/lib/Target/RISCV/RISCV.td
内容比较长,效果图:

生成指令匹配表:
$ ../../locald_16.0.6_x86_mlir/bin/llvm-tblgen \
-I ../../llvm-project/llvm/include \
-I ../../llvm-project/llvm/lib/Target/RISCV \
-gen-dag-isel \
../../llvm-project/llvm/lib/Target/RISCV/RISCV.td \
> hello_RISCV_td.hpp


被折叠的 条评论
为什么被折叠?



