For inline-based inter-procedural analysis, we will have multiple stack space regions. Use a dense map to store them.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96472 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Checker/PathSensitive/MemRegion.h b/include/clang/Checker/PathSensitive/MemRegion.h
index 12bc0b7..91ace10 100644
--- a/include/clang/Checker/PathSensitive/MemRegion.h
+++ b/include/clang/Checker/PathSensitive/MemRegion.h
@@ -798,11 +798,10 @@
 
   GlobalsSpaceRegion *globals;
   
-  const StackFrameContext *cachedStackLocalsFrame;
-  StackLocalsSpaceRegion *cachedStackLocalsRegion;
-  
-  const StackFrameContext *cachedStackArgumentsFrame;
-  StackArgumentsSpaceRegion *cachedStackArgumentsRegion;
+  llvm::DenseMap<const StackFrameContext *, StackLocalsSpaceRegion *> 
+    StackLocalsSpaceRegions;
+  llvm::DenseMap<const StackFrameContext *, StackArgumentsSpaceRegion *>
+    StackArgumentsSpaceRegions;
 
   HeapSpaceRegion *heap;
   UnknownSpaceRegion *unknown;
@@ -810,10 +809,7 @@
 
 public:
   MemRegionManager(ASTContext &c, llvm::BumpPtrAllocator& a)
-    : C(c), A(a), globals(0),
-      cachedStackLocalsFrame(0), cachedStackLocalsRegion(0),
-      cachedStackArgumentsFrame(0), cachedStackArgumentsRegion(0),
-      heap(0), unknown(0), code(0) {}
+    : C(c), A(a), globals(0), heap(0), unknown(0), code(0) {}
 
   ~MemRegionManager();
 
diff --git a/lib/Checker/MemRegion.cpp b/lib/Checker/MemRegion.cpp
index 194015a..9a26988 100644
--- a/lib/Checker/MemRegion.cpp
+++ b/lib/Checker/MemRegion.cpp
@@ -419,20 +419,27 @@
 const StackLocalsSpaceRegion*
 MemRegionManager::getStackLocalsRegion(const StackFrameContext *STC) {
   assert(STC);
-  if (STC == cachedStackLocalsFrame)
-    return cachedStackLocalsRegion;
-  cachedStackLocalsFrame = STC;
-  return LazyAllocate(cachedStackLocalsRegion, STC);
+  StackLocalsSpaceRegion *&R = StackLocalsSpaceRegions[STC];
+
+  if (R)
+    return R;
+
+  R = A.Allocate<StackLocalsSpaceRegion>();
+  new (R) StackLocalsSpaceRegion(this, STC);
+  return R;
 }
 
 const StackArgumentsSpaceRegion *
 MemRegionManager::getStackArgumentsRegion(const StackFrameContext *STC) {
   assert(STC);
-  if (STC == cachedStackArgumentsFrame)
-    return cachedStackArgumentsRegion;
-  
-  cachedStackArgumentsFrame = STC;
-  return LazyAllocate(cachedStackArgumentsRegion, STC);
+  StackArgumentsSpaceRegion *&R = StackArgumentsSpaceRegions[STC];
+
+  if (R)
+    return R;
+
+  R = A.Allocate<StackArgumentsSpaceRegion>();
+  new (R) StackArgumentsSpaceRegion(this, STC);
+  return R;
 }
 
 const GlobalsSpaceRegion *MemRegionManager::getGlobalsRegion() {