]> granicus.if.org Git - clang/commitdiff
Hack: have BasicStore::getLValueElement return the "Base" lvalue. This restores...
authorTed Kremenek <kremenek@apple.com>
Fri, 17 Oct 2008 22:52:40 +0000 (22:52 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 17 Oct 2008 22:52:40 +0000 (22:52 +0000)
BasicStore::RemoveDeadBindings: handle regions besides VarRegions (we now have FieldRegions).

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

lib/Analysis/BasicStore.cpp

index e1220ce674da8a4f5366a037b09bfd4158a78c36..8fc438d6a5c5bc39a0cf6547e222fb64001391c1 100644 (file)
@@ -129,7 +129,8 @@ SVal BasicStoreManager::getLValueField(const GRState* St, const FieldDecl* D,
 
 SVal BasicStoreManager::getLValueElement(const GRState* St, SVal Base,
                                          SVal Offset) {
-  return UnknownVal();
+  // Total hack: Just return "Base" for now.
+  return Base;
 }
 
 SVal BasicStoreManager::GetSVal(Store St, Loc LV, QualType T) {
@@ -237,25 +238,37 @@ BasicStoreManager::RemoveDeadBindings(Store store, Stmt* Loc,
   llvm::SmallPtrSet<const VarRegion*, 10> Marked;
   
   while (!RegionRoots.empty()) {
-    const VarRegion* R = cast<VarRegion>(RegionRoots.back());
+    const MemRegion* MR = RegionRoots.back();
     RegionRoots.pop_back();
     
-    if (Marked.count(R))
-      continue;
-    
-    Marked.insert(R);    
-    // FIXME: Do we need the QualType here, since regions are partially
-    // typed?
-    SVal X = GetSVal(store, loc::MemRegionVal(R), QualType());      
+    while (MR) {
+      if (const SymbolicRegion* SymR = dyn_cast<SymbolicRegion>(MR)) {
+        LSymbols.insert(SymR->getSymbol());
+        break;
+      }
+      else if (const VarRegion* R = dyn_cast<VarRegion>(MR)) {
+        if (Marked.count(R))
+          break;
+        
+        Marked.insert(R);
+        SVal X = GetRegionSVal(store, R);      
     
-    for (symbol_iterator SI=X.symbol_begin(), SE=X.symbol_end(); SI!=SE; ++SI)
-      LSymbols.insert(*SI);
+        // FIXME: We need to handle symbols nested in region definitions.
+        for (symbol_iterator SI=X.symbol_begin(), SE=X.symbol_end(); SI!=SE; ++SI)
+          LSymbols.insert(*SI);
     
-    if (!isa<loc::MemRegionVal>(X))
-      continue;
+        if (!isa<loc::MemRegionVal>(X))
+          break;
     
-    const loc::MemRegionVal& LVD = cast<loc::MemRegionVal>(X);
-    RegionRoots.push_back(cast<VarRegion>(LVD.getRegion()));
+        const loc::MemRegionVal& LVD = cast<loc::MemRegionVal>(X);
+        RegionRoots.push_back(LVD.getRegion());
+        break;
+      }
+      else if (const SubRegion* R = dyn_cast<SubRegion>(MR))
+        MR = R->getSuperRegion();
+      else
+        break;
+    }
   }
   
   // Remove dead variable bindings.