diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-03-05 16:31:07 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-03-05 16:31:07 +0000 |
commit | be91224894e1501133e224934285ba6440bf5b59 (patch) | |
tree | 1d76e00e4bc503c0baa99753c65d5a628055f90a /lib/Analysis/BasicStore.cpp | |
parent | fbffca65a95e26b198c084a81a33b9cdfcd01101 (diff) |
BasicStore:
- Store bindings using a MemRegion -> SVal binding instead of VarDecl -> SVal
binding. This mirrors some of the idea of RegionStore, but is far simpler and
not nearly as functional. This leads to some code simplification and
some potential for some minor precision hacks.
Along the way...
- constify the use of MemRegion* in a few places
- add operator<<(llvm::raw_ostream, const MemRegion*)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66163 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicStore.cpp')
-rw-r--r-- | lib/Analysis/BasicStore.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp index 2e619baf2f..edc2768035 100644 --- a/lib/Analysis/BasicStore.cpp +++ b/lib/Analysis/BasicStore.cpp @@ -19,7 +19,7 @@ using namespace clang; -typedef llvm::ImmutableMap<const VarDecl*,SVal> VarBindingsTy; +typedef llvm::ImmutableMap<const MemRegion*,SVal> VarBindingsTy; namespace { @@ -307,7 +307,7 @@ SVal BasicStoreManager::Retrieve(const GRState* state, Loc loc, QualType T) { Store store = state->getStore(); VarBindingsTy B = GetVarBindings(store); - VarBindingsTy::data_type* T = B.lookup(R->getDecl()); + VarBindingsTy::data_type* T = B.lookup(R); return T ? *T : UnknownVal(); } @@ -341,8 +341,8 @@ Store BasicStoreManager::BindInternal(Store store, Loc loc, SVal V) { VarBindingsTy B = GetVarBindings(store); return V.isUnknown() - ? VBFactory.Remove(B, R->getDecl()).getRoot() - : VBFactory.Add(B, R->getDecl(), V).getRoot(); + ? VBFactory.Remove(B, R).getRoot() + : VBFactory.Add(B, R, V).getRoot(); } default: assert ("SetSVal for given Loc type not yet implemented."); @@ -360,7 +360,7 @@ Store BasicStoreManager::Remove(Store store, Loc loc) { return store; VarBindingsTy B = GetVarBindings(store); - return VBFactory.Remove(B,R->getDecl()).getRoot(); + return VBFactory.Remove(B, R).getRoot(); } default: assert ("Remove for given Loc type not yet implemented."); @@ -379,14 +379,16 @@ BasicStoreManager::RemoveDeadBindings(const GRState* state, Stmt* Loc, typedef SVal::symbol_iterator symbol_iterator; // Iterate over the variable bindings. - for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) - if (SymReaper.isLive(Loc, I.getKey())) { - RegionRoots.push_back(MRMgr.getVarRegion(I.getKey())); + for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) { + const VarRegion *VR = cast<VarRegion>(I.getKey()); + if (SymReaper.isLive(Loc, VR->getDecl())) { + RegionRoots.push_back(VR); SVal X = I.getData(); for (symbol_iterator SI=X.symbol_begin(), SE=X.symbol_end(); SI!=SE; ++SI) SymReaper.markLive(*SI); } + } // Scan for live variables and live symbols. llvm::SmallPtrSet<const VarRegion*, 10> Marked; @@ -427,7 +429,7 @@ BasicStoreManager::RemoveDeadBindings(const GRState* state, Stmt* Loc, // Remove dead variable bindings. for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) { - const VarRegion* R = cast<VarRegion>(MRMgr.getVarRegion(I.getKey())); + const VarRegion* R = cast<VarRegion>(I.getKey()); if (!Marked.count(R)) { store = Remove(store, Loc::MakeVal(R)); @@ -548,9 +550,10 @@ Store BasicStoreManager::BindDeclInternal(Store store, const VarDecl* VD, return store; } -void BasicStoreManager::print(Store store, std::ostream& Out, +void BasicStoreManager::print(Store store, std::ostream& O, const char* nl, const char *sep) { + llvm::raw_os_ostream Out(O); VarBindingsTy B = GetVarBindings(store); Out << "Variables:" << nl; @@ -560,7 +563,7 @@ void BasicStoreManager::print(Store store, std::ostream& Out, if (isFirst) isFirst = false; else Out << nl; - Out << ' ' << I.getKey()->getNameAsString() << " : "; + Out << ' ' << I.getKey() << " : "; I.getData().print(Out); } } @@ -569,10 +572,9 @@ void BasicStoreManager::print(Store store, std::ostream& Out, void BasicStoreManager::iterBindings(Store store, BindingsHandler& f) { VarBindingsTy B = GetVarBindings(store); - for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I) { + for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I) + f.HandleBinding(*this, store, I.getKey(), I.getData()); - f.HandleBinding(*this, store, MRMgr.getVarRegion(I.getKey()),I.getData()); - } } StoreManager::BindingsHandler::~BindingsHandler() {} |