环境搭建
安装llvm(opt 也会自动安装):
安装clang:
Example
编写一个Pass
编写一个简单的分析文件SimplePass.cpp:
#include "llvm/Pass.h" #include "llvm/IR/Function.h" #include "llvm/IR/Module.h" #include "llvm/Support/raw_ostream.h"
using namespace llvm;
namespace { struct SimplePass : public FunctionPass { static char ID; SimplePass() : FunctionPass(ID) {}
bool runOnFunction(Function &F) override { errs() << "Function Name: " << F.getName() << "\n"; return false; } }; }
char SimplePass::ID = 0; static RegisterPass<SimplePass> X("simple-pass", "Simple LLVM Pass", false, false);
|
编写CMakelists.txt文件:
cmake_minimum_required(VERSION 3.10) project(SimplePass)
find_package(LLVM REQUIRED CONFIG)
add_definitions(${LLVM_DEFINITIONS})
include_directories(${LLVM_INCLUDE_DIRS})
add_library(SimplePass MODULE SimplePass.cpp)
target_link_libraries(SimplePass ${LLVM_LIBS})
|
创建一个build目录并进入:
编译:
然后就会生成如下文件:

生成一个IR文件
首先编写如下c语言文件:demo.c

生成人类可读的.ll文件:
clang -S -emit-llvm demo.c -o test.ll
|

生成机器可读的.bc文件:
clang -emit-llvm -c demo.c -o test.bc
|

分析
opt -load ./build/libSimplePass.so -enable-new-pm=0 -simple < test.bc > /dev/null
|
这里的-simple就是我们注册的pass的名字:


参考
https://zhuanlan.zhihu.com/p/122522485
https://leiblog.wang/%E7%BC%96%E8%AF%91%E9%AB%98%E7%BA%A7%E6%95%99%E7%A8%8B%EF%BD%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Value%E6%98%AF%E4%B8%80%E5%88%87%E7%9A%84%E5%BC%80%E5%A7%8B