]> granicus.if.org Git - clang/commitdiff
Fixed LiveVariables bug where we didn't consider block-level expressions that functio...
authorTed Kremenek <kremenek@apple.com>
Tue, 9 Dec 2008 00:14:14 +0000 (00:14 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 9 Dec 2008 00:14:14 +0000 (00:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60730 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/Analyses/LiveVariables.h
include/clang/Analysis/Analyses/UninitializedValues.h
include/clang/Analysis/Support/BlkExprDeclBitVector.h
lib/Analysis/LiveVariables.cpp

index 451e202dd2805c6eeba6d43dd506a832603ff5c4..b41cd684e951c3ab9e47a898c150f7a898bcc4b5 100644 (file)
@@ -66,7 +66,7 @@ class LiveVariables : public DataflowValues<LiveVariables_ValueTypes,
 public:
   typedef LiveVariables_ValueTypes::ObserverTy ObserverTy;
     
-  LiveVariables(CFG& cfg);
+  LiveVariables(ASTContext& Ctx, CFG& cfg);
   
   /// IsLive - Return true if a variable is live at beginning of a
   /// specified block.
index 33205d0eb286b93a2f71310a2c933950957db21f..7a9da03e4bd287c227ed8b97615cb4e2eb774f92 100644 (file)
@@ -63,7 +63,7 @@ class UninitializedValues :
 public:
   typedef UninitializedValues_ValueTypes::ObserverTy ObserverTy;
 
-  UninitializedValues(CFG &cfg) { getAnalysisData().setCFG(&cfg); }
+  UninitializedValues(CFG &cfg) { getAnalysisData().setCFG(cfg); }
   
   /// IntializeValues - Create initial dataflow values and meta data for
   ///  a given CFG.  This is intended to be called by the dataflow solver.
index 00513a5aedda1c819181acc8d40caebe515bbef7..675e3548b23ced359e540adb3f76857cf4f7b623 100644 (file)
@@ -25,6 +25,7 @@
 namespace clang {
   
   class Stmt;
+  class ASTContext;
 
 struct DeclBitVector_Types {
   
@@ -170,12 +171,19 @@ struct StmtDeclBitVector_Types {
   //===--------------------------------------------------------------------===//
 
   class AnalysisDataTy : public DeclBitVector_Types::AnalysisDataTy {
+    ASTContext* ctx;
     CFG* cfg;
   public:
-    AnalysisDataTy() {}
+    AnalysisDataTy() : ctx(0), cfg(0) {}
     virtual ~AnalysisDataTy() {}
 
-    void setCFG(CFG* c) { cfg = c; }
+    void setContext(ASTContext& c) { ctx = &c; }
+    ASTContext& getContext() {
+      assert(ctx && "ASTContext should not be NULL."); 
+      return *ctx;
+    }
+
+    void setCFG(CFG& c) { cfg = &c; }
     CFG& getCFG() { assert(cfg && "CFG should not be NULL."); return *cfg; }
     
     bool isTracked(const Stmt* S) { return cfg->isBlkExpr(S); }
index 4b181a954c0e9cee42587ca9ff1ee1905b9c4f83..8105e38b674cba863355d22b4e7b2c08997b18e3 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "clang/Analysis/Analyses/LiveVariables.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/AST/ASTContext.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/CFG.h"
 #include "clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h"
@@ -95,9 +96,11 @@ public:
 } // end anonymous namespace
 
 
-LiveVariables::LiveVariables(CFG& cfg) {
+LiveVariables::LiveVariables(ASTContext& Ctx, CFG& cfg) {
   // Register all referenced VarDecls.
-  getAnalysisData().setCFG(&cfg);
+  getAnalysisData().setCFG(cfg);
+  getAnalysisData().setContext(Ctx);
+  
   RegisterDecls R(getAnalysisData());
   cfg.VisitBlockStmts(R);
 }
@@ -270,6 +273,13 @@ void TransferFuncs::VisitDeclStmt(DeclStmt* DS) {
       if (Expr* Init = VD->getInit())
         Visit(Init);
       
+      if (const VariableArrayType* VT =
+            AD.getContext().getAsVariableArrayType(VD->getType())) {
+        StmtIterator I(const_cast<VariableArrayType*>(VT));
+        StmtIterator E;        
+        for (; I != E; ++I) Visit(*I);
+      }
+      
       // Update liveness information by killing the VarDecl.
       unsigned bit = AD.getIdx(VD);
       LiveState.getDeclBit(bit) = Dead | AD.AlwaysLive.getDeclBit(bit);