diff options
-rw-r--r-- | include/llvm/Analysis/CallGraph.h | 11 | ||||
-rw-r--r-- | lib/Analysis/CallGraph.cpp | 6 | ||||
-rw-r--r-- | lib/Passes/PassBuilder.cpp | 1 | ||||
-rw-r--r-- | lib/Passes/PassRegistry.def | 2 | ||||
-rw-r--r-- | test/Analysis/CallGraph/no-intrinsics.ll | 1 | ||||
-rw-r--r-- | test/Other/new-pass-manager.ll | 8 |
6 files changed, 28 insertions, 1 deletions
diff --git a/include/llvm/Analysis/CallGraph.h b/include/llvm/Analysis/CallGraph.h index 5f329913121..7feccefdc59 100644 --- a/include/llvm/Analysis/CallGraph.h +++ b/include/llvm/Analysis/CallGraph.h @@ -303,7 +303,16 @@ public: /// \brief Compute the \c CallGraph for the module \c M. /// /// The real work here is done in the \c CallGraph constructor. - CallGraph run(Module *M) { return CallGraph(*M); } + CallGraph run(Module &M) { return CallGraph(M); } +}; + +/// \brief Printer pass for the \c CallGraphAnalysis results. +class CallGraphPrinterPass : public PassBase<CallGraphPrinterPass> { + raw_ostream &OS; + +public: + explicit CallGraphPrinterPass(raw_ostream &OS) : OS(OS) {} + PreservedAnalyses run(Module &M, AnalysisManager<Module> *AM); }; /// \brief The \c ModulePass which wraps up a \c CallGraph and the logic to diff --git a/lib/Analysis/CallGraph.cpp b/lib/Analysis/CallGraph.cpp index 235d0f61263..594e886e539 100644 --- a/lib/Analysis/CallGraph.cpp +++ b/lib/Analysis/CallGraph.cpp @@ -259,6 +259,12 @@ void CallGraphNode::replaceCallEdge(CallSite CS, } } +PreservedAnalyses CallGraphPrinterPass::run(Module &M, + AnalysisManager<Module> *AM) { + AM->getResult<CallGraphAnalysis>(M).print(OS); + return PreservedAnalyses::all(); +} + //===----------------------------------------------------------------------===// // Out-of-line definitions of CallGraphAnalysis class members. // diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index 38e1dd00661..7f55353ab50 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -23,6 +23,7 @@ #include "llvm/Analysis/BasicAliasAnalysis.h" #include "llvm/Analysis/CFLAliasAnalysis.h" #include "llvm/Analysis/CGSCCPassManager.h" +#include "llvm/Analysis/CallGraph.h" #include "llvm/Analysis/DominanceFrontier.h" #include "llvm/Analysis/LazyCallGraph.h" #include "llvm/Analysis/LoopInfo.h" diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def index 0bc3739f3f1..112ce909910 100644 --- a/lib/Passes/PassRegistry.def +++ b/lib/Passes/PassRegistry.def @@ -19,6 +19,7 @@ #ifndef MODULE_ANALYSIS #define MODULE_ANALYSIS(NAME, CREATE_PASS) #endif +MODULE_ANALYSIS("callgraph", CallGraphAnalysis()) MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis()) MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis()) MODULE_ANALYSIS("targetlibinfo", TargetLibraryAnalysis()) @@ -32,6 +33,7 @@ MODULE_PASS("inferattrs", InferFunctionAttrsPass()) MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass()) MODULE_PASS("no-op-module", NoOpModulePass()) MODULE_PASS("print", PrintModulePass(dbgs())) +MODULE_PASS("print-callgraph", CallGraphPrinterPass(dbgs())) MODULE_PASS("print-lcg", LazyCallGraphPrinterPass(dbgs())) MODULE_PASS("strip-dead-prototypes", StripDeadPrototypesPass()) MODULE_PASS("verify", VerifierPass()) diff --git a/test/Analysis/CallGraph/no-intrinsics.ll b/test/Analysis/CallGraph/no-intrinsics.ll index d858907d724..69bfce77918 100644 --- a/test/Analysis/CallGraph/no-intrinsics.ll +++ b/test/Analysis/CallGraph/no-intrinsics.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -print-callgraph -disable-output 2>&1 | FileCheck %s +; RUN: opt < %s -passes=print-callgraph -disable-output 2>&1 | FileCheck %s ; Check that intrinsics aren't added to the call graph diff --git a/test/Other/new-pass-manager.ll b/test/Other/new-pass-manager.ll index 67a6672165b..1ffd422c6a2 100644 --- a/test/Other/new-pass-manager.ll +++ b/test/Other/new-pass-manager.ll @@ -323,6 +323,14 @@ ; CHECK-MEMDEP: Running analysis: MemoryDependenceAnalysis ; CHECK-MEMDEP: Finished llvm::Module pass manager run +; RUN: opt -disable-output -disable-verify -debug-pass-manager %s 2>&1 \ +; RUN: -passes='require<callgraph>' \ +; RUN: | FileCheck %s --check-prefix=CHECK-CALLGRAPH +; CHECK-CALLGRAPH: Starting llvm::Module pass manager run +; CHECK-CALLGRAPH: Running pass: RequireAnalysisPass +; CHECK-CALLGRAPH: Running analysis: CallGraphAnalysis +; CHECK-CALLGRAPH: Finished llvm::Module pass manager run + ; RUN: opt -disable-output -disable-verify -debug-pass-manager \ ; RUN: -passes='default<O0>' %s 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-O2 |