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