forked from OSchip/llvm-project
Mark CXXThisRegion in the current or parent stack frame context as live so that
their bindings are not removed. llvm-svn: 98705
This commit is contained in:
parent
476e541673
commit
03fd76663e
|
@ -453,6 +453,7 @@ public:
|
|||
ConstraintManager& getConstraintManager() { return *ConstraintMgr; }
|
||||
|
||||
const GRState* RemoveDeadBindings(const GRState* St, Stmt* Loc,
|
||||
const StackFrameContext *LCtx,
|
||||
SymbolReaper& SymReaper);
|
||||
|
||||
public:
|
||||
|
|
|
@ -144,6 +144,7 @@ public:
|
|||
}
|
||||
|
||||
virtual Store RemoveDeadBindings(Store store, Stmt* Loc,
|
||||
const StackFrameContext *LCtx,
|
||||
SymbolReaper& SymReaper,
|
||||
llvm::SmallVectorImpl<const MemRegion*>& RegionRoots) = 0;
|
||||
|
||||
|
|
|
@ -72,7 +72,9 @@ public:
|
|||
|
||||
/// RemoveDeadBindings - Scans a BasicStore of 'state' for dead values.
|
||||
/// It updatees the GRState object in place with the values removed.
|
||||
Store RemoveDeadBindings(Store store, Stmt* Loc, SymbolReaper& SymReaper,
|
||||
Store RemoveDeadBindings(Store store, Stmt* Loc,
|
||||
const StackFrameContext *LCtx,
|
||||
SymbolReaper& SymReaper,
|
||||
llvm::SmallVectorImpl<const MemRegion*>& RegionRoots);
|
||||
|
||||
void iterBindings(Store store, BindingsHandler& f);
|
||||
|
@ -250,6 +252,7 @@ Store BasicStoreManager::Remove(Store store, Loc loc) {
|
|||
}
|
||||
|
||||
Store BasicStoreManager::RemoveDeadBindings(Store store, Stmt* Loc,
|
||||
const StackFrameContext *LCtx,
|
||||
SymbolReaper& SymReaper,
|
||||
llvm::SmallVectorImpl<const MemRegion*>& RegionRoots)
|
||||
{
|
||||
|
|
|
@ -44,7 +44,9 @@ public:
|
|||
}
|
||||
|
||||
SVal ArrayToPointer(Loc Array);
|
||||
Store RemoveDeadBindings(Store store, Stmt* Loc, SymbolReaper& SymReaper,
|
||||
Store RemoveDeadBindings(Store store, Stmt* Loc,
|
||||
const StackFrameContext *LCtx,
|
||||
SymbolReaper& SymReaper,
|
||||
llvm::SmallVectorImpl<const MemRegion*>& RegionRoots){
|
||||
return store;
|
||||
}
|
||||
|
|
|
@ -481,7 +481,9 @@ void GRExprEngine::ProcessStmt(CFGElement CE, GRStmtNodeBuilder& builder) {
|
|||
SymbolReaper SymReaper(BasePred->getLocationContext(), SymMgr);
|
||||
|
||||
CleanedState = AMgr.shouldPurgeDead()
|
||||
? StateMgr.RemoveDeadBindings(EntryNode->getState(), CurrentStmt, SymReaper)
|
||||
? StateMgr.RemoveDeadBindings(EntryNode->getState(), CurrentStmt,
|
||||
BasePred->getLocationContext()->getCurrentStackFrame(),
|
||||
SymReaper)
|
||||
: EntryNode->getState();
|
||||
|
||||
// Process any special transfer function for dead symbols.
|
||||
|
|
|
@ -35,6 +35,7 @@ GRStateManager::~GRStateManager() {
|
|||
|
||||
const GRState*
|
||||
GRStateManager::RemoveDeadBindings(const GRState* state, Stmt* Loc,
|
||||
const StackFrameContext *LCtx,
|
||||
SymbolReaper& SymReaper) {
|
||||
|
||||
// This code essentially performs a "mark-and-sweep" of the VariableBindings.
|
||||
|
@ -50,7 +51,7 @@ GRStateManager::RemoveDeadBindings(const GRState* state, Stmt* Loc,
|
|||
state, RegionRoots);
|
||||
|
||||
// Clean up the store.
|
||||
NewState.St = StoreMgr->RemoveDeadBindings(NewState.St, Loc, SymReaper,
|
||||
NewState.St = StoreMgr->RemoveDeadBindings(NewState.St, Loc, LCtx, SymReaper,
|
||||
RegionRoots);
|
||||
|
||||
return ConstraintMgr->RemoveDeadBindings(getPersistentState(NewState),
|
||||
|
|
|
@ -354,7 +354,9 @@ public: // Part of public interface to class.
|
|||
|
||||
/// RemoveDeadBindings - Scans the RegionStore of 'state' for dead values.
|
||||
/// It returns a new Store with these values removed.
|
||||
Store RemoveDeadBindings(Store store, Stmt* Loc, SymbolReaper& SymReaper,
|
||||
Store RemoveDeadBindings(Store store, Stmt* Loc,
|
||||
const StackFrameContext *LCtx,
|
||||
SymbolReaper& SymReaper,
|
||||
llvm::SmallVectorImpl<const MemRegion*>& RegionRoots);
|
||||
|
||||
const GRState *EnterStackFrame(const GRState *state,
|
||||
|
@ -1678,12 +1680,14 @@ class RemoveDeadBindingsWorker :
|
|||
llvm::SmallVector<const SymbolicRegion*, 12> Postponed;
|
||||
SymbolReaper &SymReaper;
|
||||
Stmt *Loc;
|
||||
const StackFrameContext *CurrentLCtx;
|
||||
|
||||
public:
|
||||
RemoveDeadBindingsWorker(RegionStoreManager &rm, GRStateManager &stateMgr,
|
||||
RegionBindings b, SymbolReaper &symReaper,
|
||||
Stmt *loc)
|
||||
Stmt *loc, const StackFrameContext *LCtx)
|
||||
: ClusterAnalysis<RemoveDeadBindingsWorker>(rm, stateMgr, b),
|
||||
SymReaper(symReaper), Loc(loc) {}
|
||||
SymReaper(symReaper), Loc(loc), CurrentLCtx(LCtx) {}
|
||||
|
||||
// Called by ClusterAnalysis.
|
||||
void VisitAddedToCluster(const MemRegion *baseR, RegionCluster &C);
|
||||
|
@ -1713,6 +1717,15 @@ void RemoveDeadBindingsWorker::VisitAddedToCluster(const MemRegion *baseR,
|
|||
|
||||
return;
|
||||
}
|
||||
|
||||
// CXXThisRegion in the current or parent location context is live.
|
||||
if (const CXXThisRegion *TR = dyn_cast<CXXThisRegion>(baseR)) {
|
||||
const StackArgumentsSpaceRegion *StackReg =
|
||||
cast<StackArgumentsSpaceRegion>(TR->getSuperRegion());
|
||||
const StackFrameContext *RegCtx = StackReg->getStackFrame();
|
||||
if (RegCtx == CurrentLCtx || RegCtx->isParentOf(CurrentLCtx))
|
||||
AddToWorkList(TR, C);
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveDeadBindingsWorker::VisitCluster(const MemRegion *baseR,
|
||||
|
@ -1799,11 +1812,12 @@ bool RemoveDeadBindingsWorker::UpdatePostponed() {
|
|||
}
|
||||
|
||||
Store RegionStoreManager::RemoveDeadBindings(Store store, Stmt* Loc,
|
||||
const StackFrameContext *LCtx,
|
||||
SymbolReaper& SymReaper,
|
||||
llvm::SmallVectorImpl<const MemRegion*>& RegionRoots)
|
||||
{
|
||||
RegionBindings B = GetRegionBindings(store);
|
||||
RemoveDeadBindingsWorker W(*this, StateMgr, B, SymReaper, Loc);
|
||||
RemoveDeadBindingsWorker W(*this, StateMgr, B, SymReaper, Loc, LCtx);
|
||||
W.GenerateClusters();
|
||||
|
||||
// Enqueue the region roots onto the worklist.
|
||||
|
|
Loading…
Reference in New Issue