使用new pm写一个pass

发布时间:2024年01月12日

范例来自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

文章来源:https://blog.csdn.net/Kongxiangyunltj/article/details/135556642
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。