LLVM pass------out-of-tree

10 篇文章 2 订阅

介绍:实现一个简单的打印function name的out-of-tree pass

项目准备
  • 项目布局:

    • <project dir>/
          |
          CMakeLists.txt
          <pass name>/
              |
              CMakeLists.txt
              Pass.cpp
              ...
      
  • /CMakeLists.txt的内容:

    • #指定cmake最小版本
      cmake_minimum_required(VERSION 3.13.4)
      
      #设置项目名称
      project("XXXX")
      
      #cmake参数,不加报错
      SET(CMAKE_CXX_FLAGS "-Wall -fno-rtti")
      
      #查找指定的库文件
      find_package(LLVM REQUIRED CONFIG)
      
      #将${LLVM_DEFINITIONS}的内容
      #以NATIVE_COMMAND的要求分割
      #保存在LLVM_DEFINITIONS_LIST中
      separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
      
      # 和C/C++中的#define是一样的
      add_definitions(${LLVM_DEFINITIONS_LIST})
      
      #将给定的目录添加到编译器(compiler)用于搜索包含文件的目录
      include_directories(${LLVM_INCLUDE_DIRS})
      
      #编译子文件夹的CMakeLists.txt
      add_subdirectory(pass name)
      
  • //CMakeLists.txt的内容:

    • add_library(LLVMPassname MODULE Pass.cpp)	//以Pass.cpp为源文件添加moudle模式的名为LLVMPassname的库
      
  • //pass.cpp的内容:

    • #include "llvm/Pass.h"
      #include "llvm/IR/Function.h"
      #include "llvm/Support/raw_ostream.h"
      
      #include "llvm/IR/LegacyPassManager.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来使用该pass
                                   false /* Only looks at CFG */,
                                   false /* Analysis Pass */);
      
编辑项目
  • 在目录下执行以下命令:

    • mkdir build
      cd build
      
      cmake ..
      make
      
      cd ..
      
  • 在build目录下会生成如下目录文件布局:

    • build/
          |
          CMakeCache.txt
          CMakeFiles
          cmake_install.cmake
          Makefile
          <pass name>/
              |
              CMakeFiles
          	cmake_install.cmake
          	Makefile
          	lib<pass name>.so
      
pass的使用(通过opt加载pass)
  • opt -load ./build/pass name/lib<pass name>.so
    \-hello 			//选择pass
    \./test_fun/hello.ll //自行编译
    \-enable-new-pm=0	//因为使用的legacy pass manager不是并不是LLVM默认的PassManager,所以需要添加该参数
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

What’smean

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

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

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

打赏作者

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

抵扣说明:

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

余额充值