|  | //===- LLVMPrintFunctionNames.cpp | 
|  | //---------------------------------------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // Example clang plugin which simply prints the names of all the functions | 
|  | // within the generated LLVM code. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "clang/AST/AST.h" | 
|  | #include "clang/AST/ASTConsumer.h" | 
|  | #include "clang/AST/RecursiveASTVisitor.h" | 
|  | #include "clang/Frontend/CompilerInstance.h" | 
|  | #include "clang/Frontend/FrontendPluginRegistry.h" | 
|  | #include "clang/Sema/Sema.h" | 
|  | #include "llvm/IR/PassManager.h" | 
|  | #include "llvm/Passes/OptimizationLevel.h" | 
|  | #include "llvm/Passes/PassBuilder.h" | 
|  | #include "llvm/Support/raw_ostream.h" | 
|  | using namespace clang; | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class PrintPass final : public llvm::AnalysisInfoMixin<PrintPass> { | 
|  | friend struct llvm::AnalysisInfoMixin<PrintPass>; | 
|  |  | 
|  | public: | 
|  | using Result = llvm::PreservedAnalyses; | 
|  |  | 
|  | Result run(llvm::Module &M, llvm::ModuleAnalysisManager &MAM) { | 
|  | for (auto &F : M) | 
|  | llvm::outs() << "[PrintPass] Found function: " << F.getName() << "\n"; | 
|  | return llvm::PreservedAnalyses::all(); | 
|  | } | 
|  | static bool isRequired() { return true; } | 
|  | }; | 
|  |  | 
|  | void PrintCallback(llvm::PassBuilder &PB) { | 
|  | PB.registerPipelineStartEPCallback( | 
|  | [](llvm::ModulePassManager &MPM, llvm::OptimizationLevel) { | 
|  | MPM.addPass(PrintPass()); | 
|  | }); | 
|  | } | 
|  |  | 
|  | class LLVMPrintFunctionsConsumer : public ASTConsumer { | 
|  | public: | 
|  | LLVMPrintFunctionsConsumer(CompilerInstance &Instance) { | 
|  | Instance.getCodeGenOpts().PassBuilderCallbacks.push_back(PrintCallback); | 
|  | } | 
|  | }; | 
|  |  | 
|  | class LLVMPrintFunctionNamesAction : public PluginASTAction { | 
|  | protected: | 
|  | std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, | 
|  | llvm::StringRef) override { | 
|  | return std::make_unique<LLVMPrintFunctionsConsumer>(CI); | 
|  | } | 
|  | bool ParseArgs(const CompilerInstance &, | 
|  | const std::vector<std::string> &) override { | 
|  | return true; | 
|  | } | 
|  | PluginASTAction::ActionType getActionType() override { | 
|  | return AddBeforeMainAction; | 
|  | } | 
|  | }; | 
|  |  | 
|  | } // namespace | 
|  |  | 
|  | static FrontendPluginRegistry::Add<LLVMPrintFunctionNamesAction> | 
|  | X("llvm-print-fns", "print function names, llvm level"); |