xref: /llvm-project/clang/examples/LLVMPrintFunctionNames/LLVMPrintFunctionNames.cpp (revision 74197925dcb144ba31c7abfc61494c31c03d1f64)
13c11ac51SWilliam Moses //===- LLVMPrintFunctionNames.cpp
23c11ac51SWilliam Moses //---------------------------------------------===//
33c11ac51SWilliam Moses //
43c11ac51SWilliam Moses // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
53c11ac51SWilliam Moses // See https://llvm.org/LICENSE.txt for license information.
63c11ac51SWilliam Moses // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73c11ac51SWilliam Moses //
83c11ac51SWilliam Moses //===----------------------------------------------------------------------===//
93c11ac51SWilliam Moses //
103c11ac51SWilliam Moses // Example clang plugin which simply prints the names of all the functions
113c11ac51SWilliam Moses // within the generated LLVM code.
123c11ac51SWilliam Moses //
133c11ac51SWilliam Moses //===----------------------------------------------------------------------===//
143c11ac51SWilliam Moses 
153c11ac51SWilliam Moses #include "clang/AST/AST.h"
163c11ac51SWilliam Moses #include "clang/AST/ASTConsumer.h"
173c11ac51SWilliam Moses #include "clang/AST/RecursiveASTVisitor.h"
183c11ac51SWilliam Moses #include "clang/Frontend/CompilerInstance.h"
193c11ac51SWilliam Moses #include "clang/Frontend/FrontendPluginRegistry.h"
203c11ac51SWilliam Moses #include "clang/Sema/Sema.h"
21*74197925SJie Fu #include "llvm/IR/Module.h"
223c11ac51SWilliam Moses #include "llvm/IR/PassManager.h"
233c11ac51SWilliam Moses #include "llvm/Passes/OptimizationLevel.h"
243c11ac51SWilliam Moses #include "llvm/Passes/PassBuilder.h"
253c11ac51SWilliam Moses #include "llvm/Support/raw_ostream.h"
263c11ac51SWilliam Moses using namespace clang;
273c11ac51SWilliam Moses 
283c11ac51SWilliam Moses namespace {
293c11ac51SWilliam Moses 
303c11ac51SWilliam Moses class PrintPass final : public llvm::AnalysisInfoMixin<PrintPass> {
313c11ac51SWilliam Moses   friend struct llvm::AnalysisInfoMixin<PrintPass>;
323c11ac51SWilliam Moses 
333c11ac51SWilliam Moses public:
343c11ac51SWilliam Moses   using Result = llvm::PreservedAnalyses;
353c11ac51SWilliam Moses 
run(llvm::Module & M,llvm::ModuleAnalysisManager & MAM)363c11ac51SWilliam Moses   Result run(llvm::Module &M, llvm::ModuleAnalysisManager &MAM) {
373c11ac51SWilliam Moses     for (auto &F : M)
383c11ac51SWilliam Moses       llvm::outs() << "[PrintPass] Found function: " << F.getName() << "\n";
393c11ac51SWilliam Moses     return llvm::PreservedAnalyses::all();
403c11ac51SWilliam Moses   }
isRequired()413c11ac51SWilliam Moses   static bool isRequired() { return true; }
423c11ac51SWilliam Moses };
433c11ac51SWilliam Moses 
PrintCallback(llvm::PassBuilder & PB)443c11ac51SWilliam Moses void PrintCallback(llvm::PassBuilder &PB) {
453c11ac51SWilliam Moses   PB.registerPipelineStartEPCallback(
463c11ac51SWilliam Moses       [](llvm::ModulePassManager &MPM, llvm::OptimizationLevel) {
473c11ac51SWilliam Moses         MPM.addPass(PrintPass());
483c11ac51SWilliam Moses       });
493c11ac51SWilliam Moses }
503c11ac51SWilliam Moses 
513c11ac51SWilliam Moses class LLVMPrintFunctionsConsumer : public ASTConsumer {
523c11ac51SWilliam Moses public:
LLVMPrintFunctionsConsumer(CompilerInstance & Instance)533c11ac51SWilliam Moses   LLVMPrintFunctionsConsumer(CompilerInstance &Instance) {
543c11ac51SWilliam Moses     Instance.getCodeGenOpts().PassBuilderCallbacks.push_back(PrintCallback);
553c11ac51SWilliam Moses   }
563c11ac51SWilliam Moses };
573c11ac51SWilliam Moses 
583c11ac51SWilliam Moses class LLVMPrintFunctionNamesAction : public PluginASTAction {
593c11ac51SWilliam Moses protected:
CreateASTConsumer(CompilerInstance & CI,llvm::StringRef)603c11ac51SWilliam Moses   std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
613c11ac51SWilliam Moses                                                  llvm::StringRef) override {
623c11ac51SWilliam Moses     return std::make_unique<LLVMPrintFunctionsConsumer>(CI);
633c11ac51SWilliam Moses   }
ParseArgs(const CompilerInstance &,const std::vector<std::string> &)643c11ac51SWilliam Moses   bool ParseArgs(const CompilerInstance &,
653c11ac51SWilliam Moses                  const std::vector<std::string> &) override {
663c11ac51SWilliam Moses     return true;
673c11ac51SWilliam Moses   }
getActionType()683c11ac51SWilliam Moses   PluginASTAction::ActionType getActionType() override {
693c11ac51SWilliam Moses     return AddBeforeMainAction;
703c11ac51SWilliam Moses   }
713c11ac51SWilliam Moses };
723c11ac51SWilliam Moses 
733c11ac51SWilliam Moses } // namespace
743c11ac51SWilliam Moses 
753c11ac51SWilliam Moses static FrontendPluginRegistry::Add<LLVMPrintFunctionNamesAction>
763c11ac51SWilliam Moses     X("llvm-print-fns", "print function names, llvm level");
77