LLVM入门


环境搭建

安装llvm(opt 也会自动安装):

sudo apt install llvm

安装clang:

sudo apt install 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;

// 定义一个继承 FunctionPass 的类
namespace {
struct SimplePass : public FunctionPass {
static char ID; // Pass 的 ID
SimplePass() : FunctionPass(ID) {}

// 重写 runOnFunction 方法
bool runOnFunction(Function &F) override {
// 输出函数的名称
errs() << "Function Name: " << F.getName() << "\n";
return false; // 不修改代码
}
};
}

// 注册该 Pass
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目录并进入:

mkdir build
cd build

编译:

cmake ..
make

然后就会生成如下文件:

生成一个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


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录