运行LLVM Pass的两种方式

一、通过opt -load mypass.so -mypass code.bc

核心代码

//引入的头文件
#include "MyHello.h"

namespace mytest{
  char MyHello::ID = 0;
  RegisterPass<MyHello> X("myhello", "MyHello World Pass");

  bool MyHello::runOnFunction(Function &F){
    errs() << "Hello: ";
    errs() << F.getName() << '\n';
    return false;
  }
}

$ clang -c -emit-llvm code.c
$ opt -load myhello.so -myhello code.bc

二、通过clang -Xclang -load -Xclang mypass.so code.c

#include "llvm/Pass.h"
#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 SkeletonPass : public FunctionPass {
    static char ID;
    SkeletonPass() : FunctionPass(ID) {}

    virtual bool runOnFunction(Function &F) {
      errs() << "I saw a function called " << F.getName() << "!\n";
      return false;
    }
  };
}

char SkeletonPass::ID = 0;

// Automatically enable the pass.
// http://adriansampson.net/blog/clangpass.html
static void registerSkeletonPass(const PassManagerBuilder &,
                         legacy::PassManagerBase &PM) {
  PM.add(new SkeletonPass());
}
static RegisterStandardPasses
  RegisterMyPass(PassManagerBuilder::EP_EarlyAsPossible,
                 registerSkeletonPass);

$ clang -Xclang -load -Xclang mypass.so code.c

方式2参照https://www.cs.cornell.edu/~asampson/blog/clangpass.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值