]> granicus.if.org Git - clang/commitdiff
Patch by Zhongxing Xu:
authorTed Kremenek <kremenek@apple.com>
Wed, 20 Aug 2008 17:08:29 +0000 (17:08 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 20 Aug 2008 17:08:29 +0000 (17:08 +0000)
This patch moves some code in GRStateManager::RemoveDeadBindings() to EnvironmentManager::RemoveDeadBindings().

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

include/clang/Analysis/PathSensitive/Environment.h
lib/Analysis/Environment.cpp
lib/Analysis/GRState.cpp

index ba062866571830ea449700ec21ea74486d7ffa6d..9c9dc54886ad0b7f047864e4daa8ca028448814e 100644 (file)
 #ifndef LLVM_CLANG_ANALYSIS_ENVIRONMENT_H
 #define LLVM_CLANG_ANALYSIS_ENVIRONMENT_H
 
+// For using typedefs in StoreManager. Should find a better place for these
+// typedefs.
+#include "clang/Analysis/PathSensitive/Store.h"
+
 #include "llvm/ADT/ImmutableMap.h"
 #include "clang/Analysis/PathSensitive/RValues.h"
 #include "llvm/Support/Allocator.h"
@@ -23,7 +27,8 @@ namespace clang {
 
 class EnvironmentManager;
 class BasicValueFactory;
-  
+class LiveVariables;
+
 class Environment : public llvm::FoldingSetNode {
 private:
     
@@ -132,6 +137,12 @@ public:
   
   Environment SetRVal(const Environment& Env, Expr* E, RVal V,
                       bool isBlkExpr, bool Invalidate);
+
+  Environment RemoveDeadBindings(Environment Env, 
+                                 Stmt* Loc,
+                                 const LiveVariables& Liveness,
+                                 StoreManager::DeclRootsTy& DRoots,
+                                 StoreManager::LiveSymbolsTy& LSymbols);
 };
   
 } // end clang namespace
index 7f6fbd3051354530a0a64bfc903504a34c6eec3a..570a38f89e7e0ebe0bf486d13d915e4468761bbe 100644 (file)
@@ -12,7 +12,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/PathSensitive/Environment.h"
+#include "clang/Analysis/Analyses/LiveVariables.h"
 #include "llvm/ADT/ImmutableMap.h"
+#include "llvm/Support/Streams.h"
 
 using namespace clang;
 
@@ -103,3 +105,49 @@ Environment EnvironmentManager::SetRVal(const Environment& Env, Expr* E, RVal V,
 
   return isBlkExpr ? AddBlkExpr(Env, E, V) : AddSubExpr(Env, E, V);
 }
+
+Environment 
+EnvironmentManager::RemoveDeadBindings(Environment Env, 
+                                       Stmt* Loc,
+                                       const LiveVariables& Liveness,
+                                       StoreManager::DeclRootsTy& DRoots,
+                                       StoreManager::LiveSymbolsTy& LSymbols) {
+  // Drop bindings for subexpressions.
+  Env = RemoveSubExprBindings(Env);
+
+  // Iterate over the block-expr bindings.
+  for (Environment::beb_iterator I = Env.beb_begin(), E = Env.beb_end(); 
+       I != E; ++I) {
+    Expr* BlkExpr = I.getKey();
+
+    if (Liveness.isLive(Loc, BlkExpr)) {
+      RVal X = I.getData();
+
+      // If the block expr's value is the address of some Decl, then mark that
+      // Decl.
+      if (isa<lval::DeclVal>(X)) {
+        lval::DeclVal LV = cast<lval::DeclVal>(X);
+        DRoots.push_back(LV.getDecl());
+      }
+
+      // Mark all symbols in the block expr's value.
+      for (RVal::symbol_iterator SI = X.symbol_begin(), SE = X.symbol_end();
+           SI != SE; ++SI) {
+        LSymbols.insert(*SI);
+      }
+    } else {
+      // The block expr is dead.
+      RVal X = I.getData();
+
+      // Do not misclean LogicalExpr or ConditionalOperator.
+      // Why is it dead? Should look at LiveVariables.
+
+      if (X.isUndef() && cast<UndefinedVal>(X).getData())
+        continue;
+
+      Env = RemoveBlkExpr(Env, BlkExpr);
+    }
+  }
+
+  return Env;
+}
index c9494fe7ea82548a2c4ce47374416226a7333f50..1cee484357b259683df98b8942ea93ad88e818c7 100644 (file)
@@ -88,40 +88,8 @@ GRStateManager::RemoveDeadBindings(const GRState* St, Stmt* Loc,
   
   GRState NewSt = *St;
 
-  // FIXME: Put this in environment.
-  // Clean up the environment.
-  
-  // Drop bindings for subexpressions.
-  NewSt.Env = EnvMgr.RemoveSubExprBindings(NewSt.Env);
-  
-  // Iterate over the block-expr bindings.
-
-  for (GRState::beb_iterator I = St->beb_begin(), E = St->beb_end();
-                                                    I!=E ; ++I) {    
-    Expr* BlkExpr = I.getKey();
-    
-    if (Liveness.isLive(Loc, BlkExpr)) {
-      RVal X = I.getData();
-      
-      if (isa<lval::DeclVal>(X)) {
-        lval::DeclVal LV = cast<lval::DeclVal>(X);
-        DRoots.push_back(LV.getDecl());
-      }
-      
-      for (RVal::symbol_iterator SI = X.symbol_begin(), SE = X.symbol_end(); 
-                                                        SI != SE; ++SI) {        
-        LSymbols.insert(*SI);
-      }
-    }
-    else {
-      RVal X = I.getData();
-      
-      if (X.isUndef() && cast<UndefinedVal>(X).getData())
-        continue;
-      
-      NewSt.Env = EnvMgr.RemoveBlkExpr(NewSt.Env, BlkExpr);
-    }
-  }
+  NewSt.Env = EnvMgr.RemoveDeadBindings(NewSt.Env, Loc, Liveness, 
+                                        DRoots, LSymbols);
 
   // Clean up the store.
   DSymbols.clear();