This is the first step to implement a field-sensitive store model. Other things are simplified: no heap shape assumption, no parameter alias assumption, etc.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57285 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp
index 49c58f6..747d2f6 100644
--- a/lib/Analysis/MemRegion.cpp
+++ b/lib/Analysis/MemRegion.cpp
@@ -32,6 +32,15 @@
   ID.AddPointer(superRegion);
 }
 
+void AnonPointeeRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, 
+                                      const VarDecl* VD, QualType T,
+                                      const MemRegion* superRegion) {
+  ID.AddInteger((unsigned) AnonPointeeRegionKind);
+  ID.Add(T);
+  ID.AddPointer(VD);
+  ID.AddPointer(superRegion);
+}
+
 void AnonTypedRegion::Profile(llvm::FoldingSetNodeID& ID) const {
   AnonTypedRegion::ProfileRegion(ID, T, superRegion);
 }
@@ -92,6 +101,10 @@
   return LazyAllocate(heap);
 }
 
+MemSpaceRegion* MemRegionManager::getUnknownRegion() {
+  return LazyAllocate(unknown);
+}
+
 VarRegion* MemRegionManager::getVarRegion(const VarDecl* d,
                                           MemRegion* superRegion) {
   llvm::FoldingSetNodeID ID;
@@ -146,6 +159,27 @@
   return R;
 }
 
+AnonPointeeRegion* MemRegionManager::getAnonPointeeRegion(const VarDecl* d) {
+  llvm::FoldingSetNodeID ID;
+  QualType T = d->getType();
+  QualType PointeeType = cast<PointerType>(T.getTypePtr())->getPointeeType();
+  MemRegion* superRegion = getUnknownRegion();
+
+  AnonPointeeRegion::ProfileRegion(ID, d, PointeeType, superRegion);
+
+  void* InsertPos;
+  MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
+  AnonPointeeRegion* R = cast_or_null<AnonPointeeRegion>(data);
+
+  if (!R) {
+    R = (AnonPointeeRegion*) A.Allocate<AnonPointeeRegion>();
+    new (R) AnonPointeeRegion(d, PointeeType, superRegion);
+    Regions.InsertNode(R, InsertPos);
+  }
+
+  return R;
+}
+
 bool MemRegionManager::hasStackStorage(const MemRegion* R) {
   MemSpaceRegion* S = getStackRegion();