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();