diff --git a/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h b/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h index fe8634edad17..93c2884f8b18 100644 --- a/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h +++ b/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h @@ -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 diff --git a/clang/include/clang/Analysis/PathSensitive/GRWorkList.h b/clang/include/clang/Analysis/PathSensitive/GRWorkList.h index de7ea5ebd6fb..c76532294c1f 100644 --- a/clang/include/clang/Analysis/PathSensitive/GRWorkList.h +++ b/clang/include/clang/Analysis/PathSensitive/GRWorkList.h @@ -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 diff --git a/clang/lib/Analysis/GRCoreEngine.cpp b/clang/lib/Analysis/GRCoreEngine.cpp index e4f27b60cf2b..46a2173c96af 100644 --- a/clang/lib/Analysis/GRCoreEngine.cpp +++ b/clang/lib/Analysis/GRCoreEngine.cpp @@ -47,13 +47,35 @@ public: return U; } }; + +class VISIBILITY_HIDDEN BFS : public GRWorkList { + std::queue 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 {