diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-06-19 23:20:31 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-06-19 23:20:31 +0000 |
commit | 18c9dd31de61d8587f98d35bd47f0aceb216ba9f (patch) | |
tree | ce349acd94290ff5c7171ce9f2a8d6924ade4995 /llvm/lib/Analysis/IPA/CallGraph.cpp | |
parent | f023ff1d5153951be280283f1b0acf91beab7eb9 (diff) | |
download | bcm5719-llvm-18c9dd31de61d8587f98d35bd47f0aceb216ba9f.tar.gz bcm5719-llvm-18c9dd31de61d8587f98d35bd47f0aceb216ba9f.zip |
[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
Diffstat (limited to 'llvm/lib/Analysis/IPA/CallGraph.cpp')
-rw-r--r-- | llvm/lib/Analysis/IPA/CallGraph.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/IPA/CallGraph.cpp b/llvm/lib/Analysis/IPA/CallGraph.cpp index 77c36033b47..e2799d965a7 100644 --- a/llvm/lib/Analysis/IPA/CallGraph.cpp +++ b/llvm/lib/Analysis/IPA/CallGraph.cpp @@ -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) |