Use a deque instead of an ImmutableList in AnalysisConsumer to preserve the file order that functions are visited. Should fix the buildbots.

llvm-svn: 155693
This commit is contained in:
Ted Kremenek 2012-04-27 04:54:28 +00:00
parent f906329eef
commit 2964aac03b
3 changed files with 14 additions and 20 deletions

View File

@ -14,15 +14,15 @@
#ifndef LLVM_CLANG_GR_FUNCTIONSUMMARY_H
#define LLVM_CLANG_GR_FUNCTIONSUMMARY_H
#include <deque>
#include "clang/AST/Decl.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/ImmutableList.h"
namespace clang {
namespace ento {
typedef llvm::ImmutableList<Decl*> SetOfDecls;
typedef std::deque<Decl*> SetOfDecls;
typedef llvm::DenseSet<const Decl*> SetOfConstDecls;
class FunctionSummariesTy {

View File

@ -102,8 +102,6 @@ public:
/// The local declaration to all declarations ratio might be very small when
/// working with a PCH file.
SetOfDecls LocalTUDecls;
SetOfDecls::Factory LocalTUDeclsFactory;
// PD is owned by AnalysisManager.
PathDiagnosticConsumer *PD;
@ -308,9 +306,7 @@ void AnalysisConsumer::storeTopLevelDecls(DeclGroupRef DG) {
if (isa<ObjCMethodDecl>(*I))
continue;
// We use an ImmutableList to avoid issues with invalidating iterators
// to the list while we are traversing it.
LocalTUDecls = LocalTUDeclsFactory.add(*I, LocalTUDecls);
LocalTUDecls.push_back(*I);
}
}
@ -319,9 +315,6 @@ void AnalysisConsumer::HandleDeclsGallGraph() {
// Build the Call Graph.
CallGraph CG;
// Add all the top level declarations to the graph.
//
// NOTE: We use an ImmutableList to avoid issues with invalidating iterators
// to the list while we are traversing it.
for (SetOfDecls::iterator I = LocalTUDecls.begin(),
E = LocalTUDecls.end(); I != E; ++I)
CG.addToCallGraph(*I);
@ -410,12 +403,13 @@ void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) {
// Process all the top level declarations.
//
// NOTE: We use an ImmutableList to avoid issues with invalidating iterators
// to the list while we are traversing it.
//
for (SetOfDecls::iterator I = LocalTUDecls.begin(),
E = LocalTUDecls.end(); I != E; ++I) {
TraverseDecl(*I);
// Note: TraverseDecl may modify LocalTUDecls, but only by appending more
// entries. Thus we don't use an iterator, but rely on LocalTUDecls
// random access. By doing so, we automatically compensate for iterators
// possibly being invalidated, although this is a bit slower.
const unsigned n = LocalTUDecls.size();
for (unsigned i = 0 ; i < n ; ++i) {
TraverseDecl(LocalTUDecls[i]);
}
if (Mgr->shouldInlineCall())

View File

@ -80,11 +80,11 @@ int handleVoidInComma() {
int marker(void) { // control reaches end of non-void function
}
// CHECK-darwin8: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage
// CHECK-darwin8: warning: The receiver of message 'unsignedLongLongM' is nil and returns a value of type 'unsigned long long' that will be garbage
// CHECK-darwin8: warning: The receiver of message 'doubleM' is nil and returns a value of type 'double' that will be garbage
// CHECK-darwin8: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage
// CHECK-darwin8: warning: The receiver of message 'longDoubleM' is nil and returns a value of type 'long double' that will be garbage
// CHECK-darwin8: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage
// CHECK-darwin8: warning: The receiver of message 'doubleM' is nil and returns a value of type 'double' that will be garbage
// CHECK-darwin8: warning: The receiver of message 'unsignedLongLongM' is nil and returns a value of type 'unsigned long long' that will be garbage
// CHECK-darwin8: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage
// CHECK-darwin9-NOT: warning: The receiver of message 'longlongM' is nil and returns a value of type 'long long' that will be garbage
// CHECK-darwin9-NOT: warning: The receiver of message 'unsignedLongLongM' is nil and returns a value of type 'unsigned long long' that will be garbage