From bca70671e79664dd2ecebbd92021a8e9396a3809 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 29 Jul 2009 18:16:25 +0000 Subject: Make StoreManager::InvalidateRegion() virtual, move the current implementation in StoreManager to RegionStoreManager, and create a special, highly reduced version in BasicStoreManager. These changes are in preparation for future RegionStore-specific changes to InvalidateRegion. llvm-svn: 77483 --- clang/lib/Analysis/BasicStore.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'clang/lib/Analysis/BasicStore.cpp') diff --git a/clang/lib/Analysis/BasicStore.cpp b/clang/lib/Analysis/BasicStore.cpp index f276975e9bd..b84bdf41005 100644 --- a/clang/lib/Analysis/BasicStore.cpp +++ b/clang/lib/Analysis/BasicStore.cpp @@ -50,7 +50,10 @@ public: } SValuator::CastResult Retrieve(const GRState *state, Loc loc, - QualType T = QualType()); + QualType T = QualType()); + + const GRState *InvalidateRegion(const GRState *state, const MemRegion *R, + const Expr *E, unsigned Count); const GRState *Bind(const GRState *state, Loc L, SVal V) { return state->makeWithStore(BindInternal(state->getStore(), L, V)); @@ -623,3 +626,27 @@ void BasicStoreManager::iterBindings(Store store, BindingsHandler& f) { } StoreManager::BindingsHandler::~BindingsHandler() {} + +//===----------------------------------------------------------------------===// +// Binding invalidation. +//===----------------------------------------------------------------------===// + +const GRState *BasicStoreManager::InvalidateRegion(const GRState *state, + const MemRegion *R, + const Expr *E, + unsigned Count) { + R = R->getBaseRegion(); + + if (!(isa(R) || isa(R))) + return state; + + // We only track bindings to self.ivar. + if (const ObjCIvarRegion *IVR = dyn_cast(R)) + if (IVR->getSuperRegion() != SelfRegion) + return state; + + QualType T = cast(R)->getValueType(R->getContext()); + SVal V = ValMgr.getConjuredSymbolVal(E, T, Count); + return Bind(state, loc::MemRegionVal(R), V); +} + -- cgit v1.2.3