]> granicus.if.org Git - clang/commitdiff
The LiveVariables analysis no longer requires a FunctionDecl&; this allows it
authorTed Kremenek <kremenek@apple.com>
Thu, 13 Mar 2008 16:55:07 +0000 (16:55 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 13 Mar 2008 16:55:07 +0000 (16:55 +0000)
to be run on other declarations of blocks of code (e.g., Objective-C methods.)

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

Analysis/DeadStores.cpp
Analysis/LiveVariables.cpp
Driver/ASTConsumers.cpp
include/clang/Analysis/Analyses/LiveVariables.h
include/clang/Analysis/LocalCheckers.h
include/clang/Analysis/PathSensitive/GRExprEngine.h
include/clang/Analysis/Support/ExprDeclBitVector.h

index 0c0548443224245361f8e3e6f82d691ffa19a32d..0848336e586e6556b4c4439a11127ea307f2f349 100644 (file)
@@ -76,13 +76,12 @@ public:
 
 namespace clang {
 
-void CheckDeadStores(CFG& cfg, FunctionDecl& FD, ASTContext &Ctx, 
-                     Diagnostic &Diags) {
+void CheckDeadStores(CFG& cfg, ASTContext &Ctx, Diagnostic &Diags) {
   
-  LiveVariables L(cfg, FD);
+  LiveVariables L(cfg);
   L.runOnCFG(cfg);
   DeadStoreObs A(Ctx, Diags);
-  L.runOnAllBlocks(cfg,&A);
+  L.runOnAllBlocks(cfg, &A);
 }
 
 } // end namespace clang
index 52f7f4d19bf98abe8e8ceb34583944b24640e491..e59a48859119980b5cfa3eb7144a0e8baaf2d49c 100644 (file)
@@ -43,14 +43,9 @@ public:
 } // end anonymous namespace
 
 
-LiveVariables::LiveVariables(CFG& cfg, FunctionDecl& FD) {
+LiveVariables::LiveVariables(CFG& cfg) {
+  // Register all referenced VarDecls.
   getAnalysisData().setCFG(&cfg);
-
-  for (FunctionDecl::param_iterator I=FD.param_begin(), E=FD.param_end();
-       I !=E; ++I)
-    getAnalysisData().Register(*I);
-  
-  // Now register all the other VarDecls;
   RegisterDecls R(getAnalysisData());
   cfg.VisitBlockStmts(R);
 }
@@ -201,11 +196,13 @@ void LiveVariables::runOnAllBlocks(const CFG& cfg,
 //
 
 bool LiveVariables::isLive(const CFGBlock* B, const VarDecl* D) const {
-  return getBlockData(B)(D,getAnalysisData());
+  DeclBitVector_Types::Idx i = getAnalysisData().getIdx(D);
+  return i.isValid() ? getBlockData(B).getBit(i) : false;
 }
 
 bool LiveVariables::isLive(const ValTy& Live, const VarDecl* D) const {
-  return Live(D,getAnalysisData());
+  DeclBitVector_Types::Idx i = getAnalysisData().getIdx(D);
+  return i.isValid() ? Live.getBit(i) : false;
 }
 
 bool LiveVariables::isLive(const Stmt* Loc, const Stmt* StmtVal) const {
index 1e40495815c6db821208739bac58c71172d39310..8e99878f666d8dfc3f2211f6bd2e0cff58c941c8 100644 (file)
@@ -528,7 +528,7 @@ namespace {
     }
 
     virtual void VisitCFG(CFG& C, FunctionDecl& FD) {
-      LiveVariables L(C, FD);
+      LiveVariables L(C);
       L.runOnCFG(C);
       L.dumpBlockLiveness(*SM);
     }
@@ -553,7 +553,7 @@ namespace {
     }
     
     virtual void VisitCFG(CFG& C, FunctionDecl& FD) {
-      CheckDeadStores(C, FD, *Ctx, Diags);
+      CheckDeadStores(C, *Ctx, Diags);
     }
     
     virtual bool printFuncDeclStart() { return false; }
index c048cbbc4eb2f61cb48bd015e56c9e80aedb045a..f172df62e8169bc882e8c2d3a801385892153807 100644 (file)
@@ -64,7 +64,7 @@ class LiveVariables : public DataflowValues<LiveVariables_ValueTypes,
 public:
   typedef LiveVariables_ValueTypes::ObserverTy ObserverTy;
     
-  LiveVariables(CFG& cfg, FunctionDecl& FD);
+  LiveVariables(CFG& cfg);
   
   /// IsLive - Return true if a variable is live at beginning of a
   /// specified block.
index 510e9a3cdef8692612eb104ac5dda2de54a2d361..3ae41f4ce99675bcf6ad1c3fec5513c7ae79041d 100644 (file)
@@ -22,8 +22,7 @@ class FunctionDecl;
 class Diagnostic;
 class ASTContext;
 
-void CheckDeadStores(CFG& cfg, FunctionDecl& FD, ASTContext &Ctx,
-                     Diagnostic &Diags); 
+void CheckDeadStores(CFG& cfg, ASTContext &Ctx, Diagnostic &Diags); 
   
 void CheckUninitializedValues(CFG& cfg, ASTContext& Ctx, Diagnostic& Diags,
                               bool FullUninitTaint=false);
index 405dada9954689a60ebc738d4b46ca378891d917..0c3aa847e6fdc6a8ba5577a473f0021c5f0097f8 100644 (file)
@@ -126,7 +126,7 @@ protected:
   
 public:
   GRExprEngine(GraphTy& g) : 
-    G(g), Liveness(G.getCFG(), G.getFunctionDecl()),
+    G(g), Liveness(G.getCFG()),
     Builder(NULL),
     StateMgr(G.getContext(), G.getAllocator()),
     BasicVals(StateMgr.getBasicValueFactory()),
index dc634df5edb073317e93243d30dd7ebcdecf94a2..558331e32ebb1ff63769cb73cc83abba62dedd19 100644 (file)
@@ -28,6 +28,21 @@ namespace clang {
   
 struct DeclBitVector_Types {
   
+  class Idx {
+    unsigned I;
+  public:
+    Idx(unsigned i) : I(i) {}
+    explicit Idx() : I(~0U) {}
+    
+    bool isValid() const {
+      return I != ~0U;
+    }
+    operator unsigned() const {
+      assert (isValid());
+      return I;
+    }
+  };    
+    
   //===--------------------------------------------------------------------===//
   // AnalysisDataTy - Whole-function meta data.
   //===--------------------------------------------------------------------===//
@@ -48,10 +63,9 @@ struct DeclBitVector_Types {
     
     bool isTracked(const ScopedDecl* SD) { return DMap.find(SD) != DMap.end(); }
     
-    unsigned getIdx(const ScopedDecl* SD) const {
+    Idx getIdx(const ScopedDecl* SD) const {
       DMapTy::const_iterator I = DMap.find(SD);
-      assert (I != DMap.end());
-      return I->second;
+      return I == DMap.end() ? Idx() : Idx(I->second);
     }
 
     unsigned getNumDecls() const { return NDecls; }
@@ -84,13 +98,21 @@ struct DeclBitVector_Types {
     
     void copyValues(const ValTy& RHS) { DeclBV = RHS.DeclBV; }
     
+    llvm::BitVector::reference getBit(unsigned i) {
+      return DeclBV[i];
+    }
+    
+    const bool getBit(unsigned i) const {
+      return DeclBV[i];
+    }
+    
     llvm::BitVector::reference
     operator()(const ScopedDecl* SD, const AnalysisDataTy& AD) {
-      return DeclBV[AD.getIdx(SD)];      
+      return getBit(AD.getIdx(SD));
     }
-    const llvm::BitVector::reference
-    operator()(const ScopedDecl* SD, const AnalysisDataTy& AD) const {
-      return const_cast<ValTy&>(*this)(SD,AD);
+
+    bool operator()(const ScopedDecl* SD, const AnalysisDataTy& AD) const {
+      return getBit(AD.getIdx(SD));
     }
     
     llvm::BitVector::reference getDeclBit(unsigned i) { return DeclBV[i]; }