完整使用用例

以下提供一个完整使用该功能的代码示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "llvm/IR/Function.h"
#include "llvm/Pass.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/PassPlugin.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
namespace {
bool runBye(Function &F) {
  errs() << "Bye: ";
  errs().write_escaped(F.getName()) << '\n';
  return false;
}
struct Bye : PassInfoMixin<Bye> {
  PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
    if (!runBye(F))
      return PreservedAnalyses::all();
    return PreservedAnalyses::none();
  }
};
}
/* New PM Registration */
extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo() {
  return {LLVM_PLUGIN_API_VERSION, "Bye", LLVM_VERSION_STRING,
          [](PassBuilder &PB) {
            PB.registerVectorizerStartEPCallback(
                [](llvm::FunctionPassManager &PM, OptimizationLevel Level) {
                  PM.addPass(Bye());
                });
          }};
}

然后使用以下命令来使用这个Pass,这里使用的clang和clang++都是从毕昇软件包获取的。

1
2
3
4
5
clang++ MyPass.cpp -fPIC -shared -o bye.so `llvm-config --cxxflags --ldflags`
cat minimal.c 
int main() {return 0;}
clang -fplugin=./bye.so -fpass-plugin=./bye.so -O3 minimal.c
Bye: main

这里不要手动使用 -I -L,需要使用llvm-config。使用-fplugin=./bye.so -fpass-plugin=./bye.so来加载Pass。