Add a separate MemSpaceRegion for function/method arguments passed on the stack.
This will simplify the logic of StoreManagers that want to specially reason
about the values of parameters.
llvm-svn: 74715
diff --git a/clang/lib/Analysis/MemRegion.cpp b/clang/lib/Analysis/MemRegion.cpp
index 98b4cf9..9314b1e 100644
--- a/clang/lib/Analysis/MemRegion.cpp
+++ b/clang/lib/Analysis/MemRegion.cpp
@@ -223,6 +223,10 @@
return LazyAllocate(stack);
}
+MemSpaceRegion* MemRegionManager::getStackArgumentsRegion() {
+ return LazyAllocate(stackArguments);
+}
+
MemSpaceRegion* MemRegionManager::getGlobalsRegion() {
return LazyAllocate(globals);
}
@@ -332,8 +336,10 @@
}
bool MemRegion::hasStackStorage() const {
- if (const MemSpaceRegion *MS = getMemorySpace())
- return MS == getMemRegionManager()->getStackRegion();
+ if (const MemSpaceRegion *MS = getMemorySpace()) {
+ MemRegionManager *Mgr = getMemRegionManager();
+ return MS == Mgr->getStackRegion() || MS == Mgr->getStackArgumentsRegion();
+ }
return false;
}
@@ -348,7 +354,9 @@
bool MemRegion::hasHeapOrStackStorage() const {
if (const MemSpaceRegion *MS = getMemorySpace()) {
MemRegionManager *Mgr = getMemRegionManager();
- return MS == Mgr->getHeapRegion() || MS == Mgr->getStackRegion();
+ return MS == Mgr->getHeapRegion()
+ || MS == Mgr->getStackRegion()
+ || MS == Mgr->getStackArgumentsRegion();
}
return false;
}