Add a new BFS GRWorkList and make it the default worklist model for

GRCoreEngine. This tends to result in shorter paths for pathological cases.

llvm-svn: 70585
This commit is contained in:
Ted Kremenek 2009-05-01 22:18:46 +00:00
parent f58c243830
commit 2c32773fa2
3 changed files with 27 additions and 4 deletions

View File

@ -631,7 +631,7 @@ public:
/// a DFS exploration of the exploded graph.
GRCoreEngine(CFG& cfg, Decl& cd, ASTContext& ctx, SubEngineTy& subengine)
: GRCoreEngineImpl(new GraphTy(cfg, cd, ctx),
GRWorkList::MakeBFSBlockDFSContents()),
GRWorkList::MakeBFS()),
SubEngine(subengine) {}
/// Construct a GRCoreEngine object to analyze the provided CFG and to

View File

@ -68,8 +68,9 @@ public:
void setBlockCounter(GRBlockCounter C) { CurrentCounter = C; }
GRBlockCounter getBlockCounter() const { return CurrentCounter; }
static GRWorkList* MakeDFS();
static GRWorkList* MakeBFSBlockDFSContents();
static GRWorkList *MakeDFS();
static GRWorkList *MakeBFS();
static GRWorkList *MakeBFSBlockDFSContents();
};
} // end clang namespace
#endif

View File

@ -47,13 +47,35 @@ public:
return U;
}
};
class VISIBILITY_HIDDEN BFS : public GRWorkList {
std::queue<GRWorkListUnit> Queue;
public:
virtual bool hasWork() const {
return !Queue.empty();
}
virtual void Enqueue(const GRWorkListUnit& U) {
Queue.push(U);
}
virtual GRWorkListUnit Dequeue() {
// Don't use const reference. The subsequent pop_back() might make it
// unsafe.
GRWorkListUnit U = Queue.front();
Queue.pop();
return U;
}
};
} // end anonymous namespace
// Place the dstor for GRWorkList here because it contains virtual member
// functions, and we the code for the dstor generated in one compilation unit.
GRWorkList::~GRWorkList() {}
GRWorkList* GRWorkList::MakeDFS() { return new DFS(); }
GRWorkList *GRWorkList::MakeDFS() { return new DFS(); }
GRWorkList *GRWorkList::MakeBFS() { return new BFS(); }
namespace {
class VISIBILITY_HIDDEN BFSBlockDFSContents : public GRWorkList {