diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-05-08 21:49:51 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-05-08 21:49:51 +0000 |
commit | 7dbbc2178fb487f3a8bff03a2c9e87f727bf2b98 (patch) | |
tree | 87131faae468cef1988c8081d5ba63e477ebc739 /lib/StaticAnalyzer/Core/RegionStore.cpp | |
parent | 6341931b144cbf369ab816e871322c99ee62bea7 (diff) |
When creating lazy bindings in RegionStore, propagate existing lazy bindings instead of creating new ones.
This is a functionality optimization.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156427 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/RegionStore.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/RegionStore.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/StaticAnalyzer/Core/RegionStore.cpp b/lib/StaticAnalyzer/Core/RegionStore.cpp index 1fec020623..bf79b9da0b 100644 --- a/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -1427,12 +1427,30 @@ SVal RegionStoreManager::getBindingForLazySymbol(const TypedValueRegion *R) { SVal RegionStoreManager::getBindingForStruct(Store store, const TypedValueRegion* R) { assert(R->getValueType()->isStructureOrClassType()); + + // If we already have a lazy binding, don't create a new one. + RegionBindings B = GetRegionBindings(store); + BindingKey K = BindingKey::Make(R, BindingKey::Default); + if (const nonloc::LazyCompoundVal *V = + dyn_cast_or_null<nonloc::LazyCompoundVal>(lookup(B, K))) { + return *V; + } + return svalBuilder.makeLazyCompoundVal(StoreRef(store, *this), R); } -SVal RegionStoreManager::getBindingForArray(Store store, +SVal RegionStoreManager::getBindingForArray(Store store, const TypedValueRegion * R) { assert(Ctx.getAsConstantArrayType(R->getValueType())); + + // If we already have a lazy binding, don't create a new one. + RegionBindings B = GetRegionBindings(store); + BindingKey K = BindingKey::Make(R, BindingKey::Default); + if (const nonloc::LazyCompoundVal *V = + dyn_cast_or_null<nonloc::LazyCompoundVal>(lookup(B, K))) { + return *V; + } + return svalBuilder.makeLazyCompoundVal(StoreRef(store, *this), R); } |