1//===- LLVMPrintFunctionNames.cpp
2//---------------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9//
10// Example clang plugin which simply prints the names of all the functions
11// within the generated LLVM code.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/AST/AST.h"
16#include "clang/AST/ASTConsumer.h"
17#include "clang/AST/RecursiveASTVisitor.h"
18#include "clang/Frontend/CompilerInstance.h"
19#include "clang/Frontend/FrontendPluginRegistry.h"
20#include "clang/Sema/Sema.h"
21#include "llvm/IR/PassManager.h"
22#include "llvm/Passes/OptimizationLevel.h"
23#include "llvm/Passes/PassBuilder.h"
24#include "llvm/Support/raw_ostream.h"
25using namespace clang;
26
27namespace {
28
29class PrintPass final : public llvm::AnalysisInfoMixin<PrintPass> {
30 friend struct llvm::AnalysisInfoMixin<PrintPass>;
31
32public:
33 using Result = llvm::PreservedAnalyses;
34
35 Result run(llvm::Module &M, llvm::ModuleAnalysisManager &MAM) {
36 for (auto &F : M)
37 llvm::outs() << "[PrintPass] Found function: " << F.getName() << "\n";
38 return llvm::PreservedAnalyses::all();
39 }
40 static bool isRequired() { return true; }
41};
42
43void PrintCallback(llvm::PassBuilder &PB) {
44 PB.registerPipelineStartEPCallback(
45 C: [](llvm::ModulePassManager &MPM, llvm::OptimizationLevel) {
46 MPM.addPass(Pass: PrintPass());
47 });
48}
49
50class LLVMPrintFunctionsConsumer : public ASTConsumer {
51public:
52 LLVMPrintFunctionsConsumer(CompilerInstance &Instance) {
53 Instance.getCodeGenOpts().PassBuilderCallbacks.push_back(x: PrintCallback);
54 }
55};
56
57class LLVMPrintFunctionNamesAction : public PluginASTAction {
58protected:
59 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
60 llvm::StringRef) override {
61 return std::make_unique<LLVMPrintFunctionsConsumer>(args&: CI);
62 }
63 bool ParseArgs(const CompilerInstance &,
64 const std::vector<std::string> &) override {
65 return true;
66 }
67 PluginASTAction::ActionType getActionType() override {
68 return AddBeforeMainAction;
69 }
70};
71
72} // namespace
73
74static FrontendPluginRegistry::Add<LLVMPrintFunctionNamesAction>
75 X("llvm-print-fns", "print function names, llvm level");
76

source code of clang/examples/LLVMPrintFunctionNames/LLVMPrintFunctionNames.cpp