跟着官网编写一个LLVMPass

官网地址 :https://llvm.org/docs/WritingAnLLVMPass.html#introduction-what-is-a-pass

一、创建文件

1、项目结构为:  llvm-project/lib/Transforms/Hello
2、在Transforms下创建CMakeLists.txt  
3、在Hello文件夹下创建Hello.cpp 和  CMakeLists.txt
4、在Hello文件夹下创建input.c

二、输入代码

1、在Hello/CMakeLists.txt 中输入 
	add_llvm_library( LLVMHello MODULE 
    Hello.cpp   # CPP文件名

    PLUGIN_TOOL
   	opt
   )
   
2、在Transforms/CMakeLists.txt中 输入
	add_subdirectory(Hello)
	
3、在Hello/Hello.cpp中输入 
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"

using namespace llvm;

namespace {
struct Hello : public FunctionPass {
static char ID;
Hello() : FunctionPass(ID) {}
bool runOnFunction(Function &F) override {
	errs() << "Hello: ";
	errs().write_escaped(F.getName()) << '\n';
	return false;
}
}; // end of struct Hello
}  // end of anonymous namespace

char Hello::ID = 0;
static RegisterPass<Hello> X("hello", "Hello World Pass",  # "hello"注册名
                         false /* Only looks at CFG */,
                         false /* Analysis Pass */);

static RegisterStandardPasses Y(
PassManagerBuilder::EP_EarlyAsPossible,
[](const PassManagerBuilder &Builder,
   legacy::PassManagerBase &PM) { PM.add(new Hello()); });
   
4、在input.c中输入
	int foo(int a,int b)
	{
		return a>b?a:b;
	}

三、编译

1、先把cpp文件编译成so文件 
	clang `llvm-config --cxxflags` -Wl,-znodelete -fno-rtti -fPIC -shared Hello.cpp -o LLVMHello.so `llvm-config --ldflags`
	其中 LLVMHello.so 是自己取的名字
2、clang input.c -emit-llvm -S -o input.ll  # 生成.ll 文件  --  人能看懂的
3、clang -c -emit-llvm input.c -o input.bc #生成.bc文件 -- 二进制文件 ,人看不懂的
4、opt -enable-new-pm=0 -load ./LLVMHello.so -hello input.bc -o /dev/null   #编译运行.bc文件 ,查看测试结果 ,结果输出为 foo(函数名)
5、opt -enable-new-pm=0 -load ./LLVMHello.so -hello input.ll # 编译运行.ll文件 ,其中hello 为cpp文件中注册名,结果输出为foo(函数名)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

内存不足°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值