完整使用用例
以下提供一个完整使用该功能的代码示例。
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。
父主题: 如何在毕昇编译器中使用自定义Pass