diff options
Diffstat (limited to 'lib/Analysis/CallGraph.cpp')
-rw-r--r-- | lib/Analysis/CallGraph.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/Analysis/CallGraph.cpp b/lib/Analysis/CallGraph.cpp index 853e0f9df7..424e5c795e 100644 --- a/lib/Analysis/CallGraph.cpp +++ b/lib/Analysis/CallGraph.cpp @@ -141,8 +141,14 @@ bool CallGraph::includeInGraph(const Decl *D) { void CallGraph::addNodeForDecl(Decl* D, bool IsGlobal) { assert(D); + // Do nothing if the node already exists. + if (FunctionMap.find(D) != FunctionMap.end()) + return; + // Allocate a new node, mark it as root, and process it's calls. CallGraphNode *Node = getOrInsertNode(D); + if (IsGlobal) + Root->addCallee(Node, this); // Process all the calls by this function as well. CGBuilder builder(this, Node); @@ -162,9 +168,9 @@ CallGraphNode *CallGraph::getOrInsertNode(Decl *F) { return Node; Node = new CallGraphNode(F); - // Make Root node a parent of all functions to make sure all are reachable. + // If not root, add to the parentless list. if (F != 0) - Root->addCallee(Node, this); + ParentlessNodes.insert(Node); return Node; } |