Skip to content

Commit

Permalink
Revert r244127: [PM] Remove a failed attempt to port the CallGraph
Browse files Browse the repository at this point in the history
analysis ...

It turns out that we *do* need the old CallGraph ported to the new pass
manager. There are times where this model of a call graph is really
superior to the one provided by the LazyCallGraph. For example,
GlobalsModRef very specifically needs the model provided by CallGraph.

While here, I've tried to make the move semantics actually work. =]

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245170 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
chandlerc committed Aug 16, 2015
1 parent 7e9986f commit 5df1207
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
24 changes: 23 additions & 1 deletion include/llvm/Analysis/CallGraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -288,6 +289,27 @@ class CallGraphNode {
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.
///
Expand Down
15 changes: 15 additions & 0 deletions lib/Analysis/IPA/CallGraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -252,6 +261,12 @@ void CallGraphNode::replaceCallEdge(CallSite CS,
}
}

//===----------------------------------------------------------------------===//
// Out-of-line definitions of CallGraphAnalysis class members.
//

char CallGraphAnalysis::PassID;

//===----------------------------------------------------------------------===//
// Implementations of the CallGraphWrapperPass class methods.
//
Expand Down

0 comments on commit 5df1207

Please sign in to comment.