summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Analysis/CallGraph.h24
-rw-r--r--llvm/lib/Analysis/IPA/CallGraph.cpp15
2 files changed, 38 insertions, 1 deletions
diff --git a/llvm/include/llvm/Analysis/CallGraph.h b/llvm/include/llvm/Analysis/CallGraph.h
index 651d1901f3e..5562e9b9465 100644
--- a/llvm/include/llvm/Analysis/CallGraph.h
+++ b/llvm/include/llvm/Analysis/CallGraph.h
@@ -105,7 +105,8 @@ class CallGraph {
void addToCallGraph(Function *F);
public:
- CallGraph(Module &M);
+ explicit CallGraph(Module &M);
+ CallGraph(CallGraph &&Arg);
~CallGraph();
void print(raw_ostream &OS) const;
@@ -288,6 +289,27 @@ private:
void allReferencesDropped() { NumReferences = 0; }
};
+/// \brief An analysis pass to compute the \c CallGraph for a \c Module.
+///
+/// This class implements the concept of an analysis pass used by the \c
+/// ModuleAnalysisManager to run an analysis over a module and cache the
+/// resulting data.
+class CallGraphAnalysis {
+public:
+ /// \brief A formulaic typedef to inform clients of the result type.
+ typedef CallGraph Result;
+
+ static void *ID() { return (void *)&PassID; }
+
+ /// \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); }
+
+private:
+ static char PassID;
+};
+
/// \brief The \c ModulePass which wraps up a \c CallGraph and the logic to
/// build it.
///
diff --git a/llvm/lib/Analysis/IPA/CallGraph.cpp b/llvm/lib/Analysis/IPA/CallGraph.cpp
index 46c044a3843..083b22d0170 100644
--- a/llvm/lib/Analysis/IPA/CallGraph.cpp
+++ b/llvm/lib/Analysis/IPA/CallGraph.cpp
@@ -32,6 +32,15 @@ CallGraph::CallGraph(Module &M)
Root = ExternalCallingNode;
}
+CallGraph::CallGraph(CallGraph &&Arg)
+ : M(Arg.M), FunctionMap(std::move(Arg.FunctionMap)), Root(Arg.Root),
+ ExternalCallingNode(Arg.ExternalCallingNode),
+ CallsExternalNode(std::move(Arg.CallsExternalNode)) {
+ Arg.FunctionMap.clear();
+ Arg.Root = nullptr;
+ Arg.ExternalCallingNode = nullptr;
+}
+
CallGraph::~CallGraph() {
// CallsExternalNode is not in the function map, delete it explicitly.
if (CallsExternalNode)
@@ -253,6 +262,12 @@ void CallGraphNode::replaceCallEdge(CallSite CS,
}
//===----------------------------------------------------------------------===//
+// Out-of-line definitions of CallGraphAnalysis class members.
+//
+
+char CallGraphAnalysis::PassID;
+
+//===----------------------------------------------------------------------===//
// Implementations of the CallGraphWrapperPass class methods.
//
OpenPOWER on IntegriCloud