diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-03-21 10:50:08 +0000 | 
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-03-21 10:50:08 +0000 | 
| commit | c0c7bca4e5b8d12699dc93a0da49e9e4bb79671b (patch) | |
| tree | 508d4388db78f87d35bf26a0400b4b03bc4c1f13 /lib/Checker/RegionStore.cpp | |
| parent | 4a37f65f1c1373c9956d118a012943de2f61edb0 (diff) | |
Notes
Diffstat (limited to 'lib/Checker/RegionStore.cpp')
| -rw-r--r-- | lib/Checker/RegionStore.cpp | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/Checker/RegionStore.cpp b/lib/Checker/RegionStore.cpp index 307ef78803889..c2b702acad9a4 100644 --- a/lib/Checker/RegionStore.cpp +++ b/lib/Checker/RegionStore.cpp @@ -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.  | 
