//===- 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/Module.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 { friend struct llvm::AnalysisInfoMixin; 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 CreateASTConsumer(CompilerInstance &CI, llvm::StringRef) override { return std::make_unique(CI); } bool ParseArgs(const CompilerInstance &, const std::vector &) override { return true; } PluginASTAction::ActionType getActionType() override { return AddBeforeMainAction; } }; } // namespace static FrontendPluginRegistry::Add X("llvm-print-fns", "print function names, llvm level");