diff options
author | Jordan Rose <jordan_rose@apple.com> | 2013-04-15 20:39:48 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2013-04-15 20:39:48 +0000 |
commit | 2820e3dfca8874624a84592e1864c552d598f41d (patch) | |
tree | abb696b7a5a079189f27d6fa148ff0bb707bfa42 /clang/lib/StaticAnalyzer/Core/RegionStore.cpp | |
parent | fa80736bca51c87eeeedd55f5be5343ea56f00de (diff) | |
download | bcm5719-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.cpp | 17 |
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); |