Added more boilerplate for processing end-of-paths.

llvm-svn: 45724
This commit is contained in:
Ted Kremenek 2008-01-07 22:22:13 +00:00
parent ef81aa75f6
commit 35ff5b0ee6
2 changed files with 13 additions and 17 deletions

View File

@ -130,7 +130,11 @@ void ReachabilityEngineImpl::ProcessBlkBlk(const BlkBlkEdge& E,
if (Blk == &cfg.getExit()) {
assert (cfg.getExit().size() == 0 && "EXIT block cannot contain Stmts.");
// Process the End-Of-Path.
ProcessEOP(Blk, Pred);
void* State = ProcessEOP(Blk, Pred->State);
bool IsNew;
ExplodedNodeImpl* V = G->getNodeImpl(BlkStmtEdge(Blk,NULL),State,&IsNew);
V->addUntypedPredecessor(Pred);
if (IsNew) G->addEndOfPath(V);
return;
}

View File

@ -102,7 +102,7 @@ protected:
void ProcessBlkStmt(const BlkStmtEdge& E, ExplodedNodeImpl* Pred);
void ProcessStmtBlk(const StmtBlkEdge& E, ExplodedNodeImpl* Pred);
virtual void ProcessEOP(CFGBlock* Blk, ExplodedNodeImpl* Pred);
virtual void* ProcessEOP(CFGBlock* Blk, void* State);
virtual void ProcessStmt(Stmt* S, ExplodedNodeImpl* Pred);
virtual void ProcessTerminator(Stmt* Terminator, ExplodedNodeImpl* Pred);
@ -136,16 +136,10 @@ protected:
return (void*) getCheckerState()->getInitialState();
}
virtual void ProcessEOP(CFGBlock* Blk, ExplodedNodeImpl* Pred) {
assert (false && "Not implemented yet.");
virtual void* ProcessEOP(CFGBlock* Blk, void* State) {
// FIXME: Perform dispatch to adjust state.
// ExplodedNodeImpl* V = G->getNodeImpl(BlkStmtEdge(Blk,NULL),
// Pred->State).first;
// V->addPredecessor(Pred);
// Graph.addEndOfPath(V);
return State;
}
virtual void ProcessStmt(Stmt* S, ExplodedNodeImpl* Pred) {
CurrentBlkExpr = S;
@ -170,14 +164,12 @@ public:
ReachabilityEngine(CFG& cfg, reng::WorkList* wlist)
: ReachabilityEngineImpl(cfg,wlist) {}
/// getGraph - Returns the exploded graph. Ownership of the graph remains
/// with the ReachabilityEngine object.
GraphTy* getGraph() const { return static_cast<GraphTy*>(G.get()); }
/// getGraph - Returns the exploded graph.
GraphTy& getGraph() { return *static_cast<GraphTy*>(G.get()); }
/// getCheckerState - Returns the internal checker state. Ownership is not
/// transferred to the caller.
CheckerTy* getCheckerState() const {
return static_cast<GraphTy*>(G.get())->getCheckerState();
/// getCheckerState - Returns the internal checker state.
CheckerTy& getCheckerState() {
return *static_cast<GraphTy*>(G.get())->getCheckerState();
}
/// takeGraph - Returns the exploded graph. Ownership of the graph is