Skip to content

Commit

Permalink
[CallGraph] Given -print-callgraph a stable printing order.
Browse files Browse the repository at this point in the history
Summary:
Since FunctionMap has llvm::Function pointers as keys, the order in
which the traversal happens can differ from run to run, causing spurious
FileCheck failures.  Have CallGraph::print sort the CallGraphNodes by
name before printing them.

Reviewers: bogner, chandlerc

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D10575

llvm-svn: 240191
  • Loading branch information
sanjoy committed Jun 19, 2015
1 parent f023ff1 commit 18c9dd3
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 5 deletions.
22 changes: 20 additions & 2 deletions llvm/lib/Analysis/IPA/CallGraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,26 @@ void CallGraph::print(raw_ostream &OS) const {
OS << "<<null function: 0x" << Root << ">>\n";
}

for (CallGraph::const_iterator I = begin(), E = end(); I != E; ++I)
I->second->print(OS);
// Print in a deterministic order by sorting CallGraphNodes by name. We do
// this here to avoid slowing down the non-printing fast path.

SmallVector<CallGraphNode *, 16> Nodes;
Nodes.reserve(FunctionMap.size());

for (auto I = begin(), E = end(); I != E; ++I)
Nodes.push_back(I->second);

std::sort(Nodes.begin(), Nodes.end(),
[](CallGraphNode *LHS, CallGraphNode *RHS) {
if (Function *LF = LHS->getFunction())
if (Function *RF = RHS->getFunction())
return LF->getName() < RF->getName();

return RHS->getFunction() != nullptr;
});

for (CallGraphNode *CN : Nodes)
CN->print(OS);
}

#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Analysis/CallGraph/non-leaf-intrinsics.ll
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ entry:
; CHECK: Call graph node <<null function>>
; CHECK: CS<0x0> calls function 'f'

; CHECK: Call graph node for function: 'calls_statepoint'
; CHECK-NEXT: CS<[[addr_0:[^>]+]]> calls external node

; CHECK: Call graph node for function: 'calls_patchpoint'
; CHECK-NEXT: CS<[[addr_1:[^>]+]]> calls external node

; CHECK: Call graph node for function: 'calls_statepoint'
; CHECK-NEXT: CS<[[addr_0:[^>]+]]> calls external node

0 comments on commit 18c9dd3

Please sign in to comment.