[CallGraph] Given -print-callgraph a stable printing order.

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
This commit is contained in:
Sanjoy Das 2015-06-19 23:20:31 +00:00
parent f023ff1d51
commit 18c9dd31de
2 changed files with 23 additions and 5 deletions

View File

@ -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)

View File

@ -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