Rate This Document
Findability
Accuracy
Completeness
Readability

Complete Use Cases

The following provides a complete code example for using this function:

 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());
                });
          }};
}

Run the following commands to use the pass. Clang and Clang++ are obtained from the BiSheng software package.

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

Do not manually run -I or -L, and run llvm-config instead. Run -fplugin=./bye.so -fpass-plugin=./bye.so to load the pass