编写第一个Pass

使用的编译环境:
Ubuntu16.04,LLVM3.6.0,GCC5.3.1
在编写Pass之前首先要编译LLVM源码,具体编译方法在之前的帖子中有介绍。
下面编写一个打印函数名的Pass


1.在llvm\lib\Transforms\目录下创建FunctionName目录
这里写图片描述


2.在llvm\lib\Transforms\FunctionName\目录下创建CMakeLists.txt文件,并在CMakeLists.txt中增加如下内容:

if( NOT LLVM_REQUIRES_RTTI )
  if( NOT LLVM_REQUIRES_EH )
    set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/FunctionName.exports)
  endif()
endif()

if(WIN32 OR CYGWIN)
  set(LLVM_LINK_COMPONENTS Core Support)
endif()

add_llvm_loadable_module( FunctionName
  FunctionName.cpp
)


3.在llvm\lib\Transforms\FunctionName\目录下创建Makefile文件,并在Makefile中增加如下内容:

LEVEL = ../../..
LIBRARYNAME = FunctionName
LOADABLE_MODULE = 1
USEDLIBS =

ifneq ($(REQUIRES_RTTI), 1)
ifneq ($(REQUIRES_EH), 1)
EXPORTED_SYMBOL_FILE = $(PROJ_SRC_DIR)/FunctionName.exports
endif
endif

include $(LEVEL)/Makefile.common


4.在llvm\lib\Transforms\FunctionName\目录下创建FunctionName.exports文件,这个文件内容为空即可


5.在llvm\lib\Transforms\FunctionName\目录下创建FunctionName.cpp文件,并在FunctionName.cpp中增加如下代码:

#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;

namespace {

struct Test : public FunctionPass {
  static char ID;

  Test() : FunctionPass(ID) { ; }

  virtual bool runOnFunction(Function &function) {
    errs() << "Function name:";
    errs().write_escaped(function.getName()) << "\n";
    return false;
  }
};

}

char Test::ID = 0;
static RegisterPass<Test> X("function-name", "FunctionName.", false, false);


6.在llvm\lib\Transforms\CMakeLists.txt中增加子目录
这里写图片描述


7.编译(输出在llvm/build/lib/FunctionName.so)

Terminal command
$ cd llvm/build
$ make


这里写图片描述


8.测试

Terminal command
$ opt -load ./FunctionName.so -function-name demo.ll


这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值