范例来自LLVM Techniques, Tips, and Best Practices Clang and Middle-End Libraries
llvm ir到ir是由一个个pass处理的,从一个ir到另一个ir会改变一些东西
书里面就是说想要给指针变量添加一个noalias属性
书里面使用插件的形式,但是不知道怎么我搞不出来,所以就用嵌入源码的形式,就重新编译的话也不用多久。
头文件,我们主要是在cpp里面实现run方法,这里传的是Function,也就是针对函数的优化
cpp文件的话大概就是扫描函数的参数,然后如果是指针且没有noalias属性,我们给他加上alias属性,在后面是管分析的东西,就先不说了,主要是看怎么在源码里加。
总的来说是按照官网的步骤
头文件路径/llvm-project/llvm/Transforms/Utils/StrictOpt.h
cpp文件路径llvm-project/llvm/lib/Transforms/Utils/StrictOpt.cpp
然后cpp同一个目录下面有个CMakeLists.txx,把cpp加上
然后llvm-project/llvm/lib/Passes/PassBuilder.cpp里加上头文件
同目录下的PassRegistry.def加
前面是你命令行要输入的passs名字,后面是你写的源文件里类的名字
改完这些就和正常一样编译,
build
cd build
使用类似的命令
cmake -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=/data/share/llvm-install \
-DLLVM_TARGETS_TO_BUILD="RISCV;NVPTX;AMDGPU"\
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_USE_LINKER=lld \
-DLLVM_BUILD_RUNTIME=Off \
../Ilvm
这边需要区分和默认的linux bin下面的llvm工具的关系,我们使用我们构建项目的bin下面llc查看信息会发现没有目标机器
所以我们使用opt的时候要加相关的目标
./opt -mtriple=riscv64-unknown-linux-gnu (.ll文件的位置) --passes=strictopt -S -o (要生成的.ll文件位置)
原ir
经过pass的ir