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