summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-04-15 20:39:48 +0000
committerJordan Rose <jordan_rose@apple.com>2013-04-15 20:39:48 +0000
commit2820e3dfca8874624a84592e1864c552d598f41d (patch)
treeabb696b7a5a079189f27d6fa148ff0bb707bfa42 /clang/lib/StaticAnalyzer/Core/RegionStore.cpp
parentfa80736bca51c87eeeedd55f5be5343ea56f00de (diff)
downloadbcm5719-llvm-2820e3dfca8874624a84592e1864c552d598f41d.tar.gz
bcm5719-llvm-2820e3dfca8874624a84592e1864c552d598f41d.zip
[analyzer] Be lazy about struct/array global invalidation too.
Structs and arrays can take advantage of the single top-level global symbol optimization (described in the previous commit) just as well as scalars. No intended behavioral change. llvm-svn: 179555
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/RegionStore.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Core/RegionStore.cpp17
1 files changed, 7 insertions, 10 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
index eeaf51d8ee0..c3e2395abf7 100644
--- a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
+++ b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
@@ -1040,7 +1040,13 @@ void invalidateRegionsWorker::VisitCluster(const MemRegion *baseR,
const TypedValueRegion *TR = cast<TypedValueRegion>(baseR);
QualType T = TR->getValueType();
- // Invalidate the binding.
+ if (isInitiallyIncludedGlobalRegion(baseR)) {
+ // If the region is a global and we are invalidating all globals,
+ // erasing the entry is good enough. This causes all globals to be lazily
+ // symbolicated from the same base symbol.
+ return;
+ }
+
if (T->isStructureOrClassType()) {
// Invalidate the region by setting its default value to
// conjured symbol. The type of the symbol is irrelavant.
@@ -1058,15 +1064,6 @@ void invalidateRegionsWorker::VisitCluster(const MemRegion *baseR,
B = B.addBinding(baseR, BindingKey::Default, V);
return;
}
-
- if (isInitiallyIncludedGlobalRegion(baseR)) {
- // If the region is a global and we are invalidating all globals,
- // just erase the entry. This causes all globals to be lazily
- // symbolicated from the same base symbol.
- B = B.removeBinding(baseR);
- return;
- }
-
DefinedOrUnknownSVal V = svalBuilder.conjureSymbolVal(baseR, Ex, LCtx,
T,Count);
OpenPOWER on IntegriCloud