运行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

猜你喜欢

转载自blog.csdn.net/qq_23599965/article/details/86620219