]> granicus.if.org Git - clang/commitdiff
- Add MemRegion::getMemorySpace()
authorTed Kremenek <kremenek@apple.com>
Tue, 23 Jun 2009 18:17:08 +0000 (18:17 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 23 Jun 2009 18:17:08 +0000 (18:17 +0000)
- Change implementation of MemRegion::hasStackStorage()/hasHeapStorage() to use
  'getMemorySpace()'.  This avoids a double traversal up the region hierarchy
  and is simpler.
- Add MemRegion::hasHeapOrStackStorage() as a slightly more efficient
  alternative to 'hasStackStorage() || hasHeapStorage()'.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73977 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/MemRegion.h
lib/Analysis/MemRegion.cpp
lib/Analysis/RegionStore.cpp

index b531375be2bcc25b87e6a1a3b02cee38515b7f17..65ac0b53027c8e1fbc851d0e6b431b4b2e9338c1 100644 (file)
@@ -33,7 +33,7 @@ namespace llvm { class raw_ostream; }
 namespace clang {
  
 class MemRegionManager;
-  
+class MemSpaceRegion;  
       
 /// MemRegion - The root abstract class for all memory regions.
 class MemRegion : public llvm::FoldingSetNode {
@@ -68,10 +68,14 @@ public:
   virtual MemRegionManager* getMemRegionManager() const = 0;
 
   std::string getString() const;
+  
+  const MemSpaceRegion *getMemorySpace() const;
     
   bool hasStackStorage() const;
   
   bool hasHeapStorage() const;
+  
+  bool hasHeapOrStackStorage() const;
 
   virtual void print(llvm::raw_ostream& os) const;  
   
index f018c83b910c57096fd463c1b23496d06f96e984..c8e027579a309fd1668bb3546a45004435459db4 100644 (file)
@@ -313,45 +313,40 @@ AllocaRegion* MemRegionManager::getAllocaRegion(const Expr* E, unsigned cnt) {
   return getRegion<AllocaRegion>(E, cnt);
 }
 
-bool MemRegion::hasStackStorage() const {
-  // Only subregions can have stack storage.
-  const SubRegion* SR = dyn_cast<SubRegion>(this);
-
-  if (!SR)
-    return false;
 
-  MemSpaceRegion* S = getMemRegionManager()->getStackRegion();
+const MemSpaceRegion *MemRegion::getMemorySpace() const {
+  const MemRegion *R = this;
+  const SubRegion* SR = dyn_cast<SubRegion>(this);
   
   while (SR) {
-    const MemRegion *R = SR->getSuperRegion();
-    if (R == S)
-      return true;
-    
-    SR = dyn_cast<SubRegion>(R);    
+    R = SR->getSuperRegion();
+    SR = dyn_cast<SubRegion>(R);
   }
-  return false;
+  
+  return dyn_cast<MemSpaceRegion>(R);
 }
 
-bool MemRegion::hasHeapStorage() const {
-  // Only subregions can have stack storage.
-  const SubRegion* SR = dyn_cast<SubRegion>(this);
+bool MemRegion::hasStackStorage() const {
+  if (const MemSpaceRegion *MS = getMemorySpace())
+    return MS == getMemRegionManager()->getStackRegion();
 
-  if (!SR)
-    return false;
+  return false;
+}
 
-  MemSpaceRegion* H = getMemRegionManager()->getHeapRegion();
+bool MemRegion::hasHeapStorage() const {
+  if (const MemSpaceRegion *MS = getMemorySpace())
+    return MS == getMemRegionManager()->getHeapRegion();
 
-  while (SR) {
-    const MemRegion *R = SR->getSuperRegion();
-    if (R == H)
-      return true;
+  return false;
+}
 
-    SR = dyn_cast<SubRegion>(R);
+bool MemRegion::hasHeapOrStackStorage() const {
+  if (const MemSpaceRegion *MS = getMemorySpace()) {
+    MemRegionManager *Mgr = getMemRegionManager();
+    return MS == Mgr->getHeapRegion() || MS == Mgr->getStackRegion();
   }
-
   return false;
-}
+}  
 
 //===----------------------------------------------------------------------===//
 // View handling.
index 17e332387f7ccd04a3a85d06b90c08a522e9f11a..77f5b7cb39bbd9ffe3be163608d9177ed3fb452e 100644 (file)
@@ -939,7 +939,7 @@ SVal RegionStoreManager::Retrieve(const GRState *state, Loc L, QualType T) {
     }
   }  
 
-  if (R->hasStackStorage() || R->hasHeapStorage()) {
+  if (R->hasHeapOrStackStorage()) {
     // All stack variables are considered to have undefined values
     // upon creation.  All heap allocated blocks are considered to
     // have undefined values as well unless they are explicitly bound