Tweaker Checker::VisitEndAnalysis to have 'hasWorkRemaining' also
be true if some paths were aborted because they exceeded the maximum loop unrolling count. llvm-svn: 107209
This commit is contained in:
parent
c728518bfe
commit
090d62e7cc
|
@ -57,6 +57,10 @@ class GRCoreEngine {
|
|||
/// These are used to record for key nodes in the ExplodedGraph the
|
||||
/// number of times different CFGBlocks have been visited along a path.
|
||||
GRBlockCounter::Factory BCounterFactory;
|
||||
|
||||
/// A flag that indicates whether paths were halted because
|
||||
/// ProcessBlockEntrace returned false.
|
||||
bool BlockAborted;
|
||||
|
||||
void GenerateNode(const ProgramPoint& Loc, const GRState* State,
|
||||
ExplodedNode* Pred);
|
||||
|
@ -108,14 +112,16 @@ public:
|
|||
GRCoreEngine(ASTContext& ctx, GRSubEngine& subengine)
|
||||
: SubEngine(subengine), G(new ExplodedGraph(ctx)),
|
||||
WList(GRWorkList::MakeBFS()),
|
||||
BCounterFactory(G->getAllocator()) {}
|
||||
BCounterFactory(G->getAllocator()),
|
||||
BlockAborted(false) {}
|
||||
|
||||
/// Construct a GRCoreEngine object to analyze the provided CFG and to
|
||||
/// use the provided worklist object to execute the worklist algorithm.
|
||||
/// The GRCoreEngine object assumes ownership of 'wlist'.
|
||||
GRCoreEngine(ASTContext& ctx, GRWorkList* wlist, GRSubEngine& subengine)
|
||||
: SubEngine(subengine), G(new ExplodedGraph(ctx)), WList(wlist),
|
||||
BCounterFactory(G->getAllocator()) {}
|
||||
BCounterFactory(G->getAllocator()),
|
||||
BlockAborted(false) {}
|
||||
|
||||
~GRCoreEngine() {
|
||||
delete WList;
|
||||
|
|
|
@ -221,7 +221,7 @@ bool GRCoreEngine::ExecuteWorkList(const LocationContext *L, unsigned Steps) {
|
|||
}
|
||||
}
|
||||
|
||||
SubEngine.ProcessEndWorklist(WList->hasWork());
|
||||
SubEngine.ProcessEndWorklist(WList->hasWork() || BlockAborted);
|
||||
return WList->hasWork();
|
||||
}
|
||||
|
||||
|
@ -258,7 +258,10 @@ void GRCoreEngine::HandleBlockEdge(const BlockEdge& L, ExplodedNode* Pred) {
|
|||
// FIXME: Should we allow ProcessBlockEntrance to also manipulate state?
|
||||
|
||||
if (ProcessBlockEntrance(Blk, Pred, WList->getBlockCounter()))
|
||||
GenerateNode(BlockEntrance(Blk, Pred->getLocationContext()), Pred->State, Pred);
|
||||
GenerateNode(BlockEntrance(Blk, Pred->getLocationContext()),
|
||||
Pred->State, Pred);
|
||||
else
|
||||
BlockAborted = true;
|
||||
}
|
||||
|
||||
void GRCoreEngine::HandleBlockEntrance(const BlockEntrance& L,
|
||||
|
|
Loading…
Reference in New Issue