[cfe-commits] r46074 - in /cfe/trunk: Analysis/GRConstants.cpp Analysis/GREngine.cpp Driver/ASTConsumers.cpp Driver/ASTConsumers.h Driver/clang.cpp include/clang/Analysis/PathSensitive/ExplodedGraph.h include/clang/Analysis/PathSensitive/GREngine.h include/clang/Analysis/PathSensitive/GRWorkList.h

Ted Kremenek kremenek at apple.com
Wed Jan 16 10:18:48 PST 2008


Author: kremenek
Date: Wed Jan 16 12:18:48 2008
New Revision: 46074

URL: http://llvm.org/viewvc/llvm-project?rev=46074&view=rev
Log:
Hooked up the GRConstants analysis to the driver.
Fixed some compilation errors with GREngine that showed up during
template instantiation.

Modified:
    cfe/trunk/Analysis/GRConstants.cpp
    cfe/trunk/Analysis/GREngine.cpp
    cfe/trunk/Driver/ASTConsumers.cpp
    cfe/trunk/Driver/ASTConsumers.h
    cfe/trunk/Driver/clang.cpp
    cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h
    cfe/trunk/include/clang/Analysis/PathSensitive/GREngine.h
    cfe/trunk/include/clang/Analysis/PathSensitive/GRWorkList.h

Modified: cfe/trunk/Analysis/GRConstants.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRConstants.cpp?rev=46074&r1=46073&r2=46074&view=diff

==============================================================================
--- cfe/trunk/Analysis/GRConstants.cpp (original)
+++ cfe/trunk/Analysis/GRConstants.cpp Wed Jan 16 12:18:48 2008
@@ -288,4 +288,14 @@
 void GRConstants::VisitBinSub(BinaryOperator* B) {
   AddBinding(B, GetBinding(B->getLHS()) - GetBinding(B->getRHS()));
 }
-    
\ No newline at end of file
+
+//===----------------------------------------------------------------------===//
+// Driver.
+//===----------------------------------------------------------------------===//
+
+namespace clang {
+void RunGRConstants(CFG& cfg) {
+  GREngine<GRConstants> Engine(cfg);
+  Engine.ExecuteWorkList();  
+}
+}

Modified: cfe/trunk/Analysis/GREngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GREngine.cpp?rev=46074&r1=46073&r2=46074&view=diff

==============================================================================
--- cfe/trunk/Analysis/GREngine.cpp (original)
+++ cfe/trunk/Analysis/GREngine.cpp Wed Jan 16 12:18:48 2008
@@ -44,6 +44,10 @@
 };
 } // end anonymous namespace
 
+// Place the dstor for GRWorkList here because it contains virtual member
+// functions, and we the code for the dstor generated in one compilation unit.
+GRWorkList::~GRWorkList() {}
+
 GRWorkList* GRWorkList::MakeDFS() { return new DFS(); }
 
 /// ExecuteWorkList - Run the worklist algorithm for a maximum number of steps.

Modified: cfe/trunk/Driver/ASTConsumers.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/ASTConsumers.cpp?rev=46074&r1=46073&r2=46074&view=diff

==============================================================================
--- cfe/trunk/Driver/ASTConsumers.cpp (original)
+++ cfe/trunk/Driver/ASTConsumers.cpp Wed Jan 16 12:18:48 2008
@@ -19,6 +19,7 @@
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/CFG.h"
 #include "clang/Analysis/Analyses/LiveVariables.h"
+#include "clang/Analysis/Analyses/GRConstants.h"
 #include "clang/Analysis/LocalCheckers.h"
 #include "llvm/Support/Streams.h"
 #include <fstream>
@@ -562,22 +563,21 @@
 }
 
 //===----------------------------------------------------------------------===//
-// GRConstProp - Perform intra-procedural, path-sensitive constant propagation.
+// GRConstants - Perform intra-procedural, path-sensitive constant propagation.
 
 namespace {
-  class GRConstPropVisitor : public CFGVisitor {
+  class GRConstantsVisitor : public CFGVisitor {
   public:
     virtual void Initialize(ASTContext &Context) {}
     
     virtual void VisitCFG(CFG& C) {
-      // FIXME: Implement.
-      assert (false && "Not yet implemented.");
+      RunGRConstants(C);
     }
   };
 } // end anonymous namespace
 
-ASTConsumer *clang::CreateGRConstProp() {
-  return new GRConstPropVisitor();
+ASTConsumer *clang::CreateGRConstants() {
+  return new GRConstantsVisitor();
 }
 
 //===----------------------------------------------------------------------===//

Modified: cfe/trunk/Driver/ASTConsumers.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/ASTConsumers.h?rev=46074&r1=46073&r2=46074&view=diff

==============================================================================
--- cfe/trunk/Driver/ASTConsumers.h (original)
+++ cfe/trunk/Driver/ASTConsumers.h Wed Jan 16 12:18:48 2008
@@ -39,7 +39,7 @@
 
 ASTConsumer *CreateUnitValsChecker(Diagnostic &Diags);
   
-ASTConsumer *CreateGRConstProp();
+ASTConsumer *CreateGRConstants();
 
 ASTConsumer *CreateLLVMEmitter(Diagnostic &Diags, const LangOptions &Features);
 

Modified: cfe/trunk/Driver/clang.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/clang.cpp?rev=46074&r1=46073&r2=46074&view=diff

==============================================================================
--- cfe/trunk/Driver/clang.cpp (original)
+++ cfe/trunk/Driver/clang.cpp Wed Jan 16 12:18:48 2008
@@ -64,7 +64,7 @@
   ParseCFGDump,                 // Parse ASTS. Build CFGs. Print CFGs.
   ParseCFGView,                 // Parse ASTS. Build CFGs. View CFGs.
   AnalysisLiveVariables,        // Print results of live-variable analysis.
-  AnalysisGRConstProp,          // Perform graph-reachability constant prop.
+  AnalysisGRConstants,          // Perform graph-reachability constant prop.
   WarnDeadStores,               // Run DeadStores checker on parsed ASTs.
   WarnDeadStoresCheck,          // Check diagnostics for "DeadStores".
   WarnUninitVals,               // Run UnitializedVariables checker.
@@ -109,7 +109,7 @@
                         "Flag warnings of stores to dead variables."),
              clEnumValN(WarnUninitVals, "warn-uninit-values",
                         "Flag warnings of uses of unitialized variables."),
-             clEnumValN(AnalysisGRConstProp, "gr-const-prop",
+             clEnumValN(AnalysisGRConstants, "gr-const-prop",
                         "Perform path-sensitive constant propagation."),
              clEnumValN(TestSerialization, "test-pickling",
                         "Run prototype serializtion code."),
@@ -947,8 +947,8 @@
     case WarnUninitVals:
       return CreateUnitValsChecker(Diag);
       
-    case AnalysisGRConstProp:
-      return CreateGRConstProp();
+    case AnalysisGRConstants:
+      return CreateGRConstants();
       
     case TestSerialization:
       return CreateSerializationTest(Diag, FileMgr, LangOpts);

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h?rev=46074&r1=46073&r2=46074&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedGraph.h Wed Jan 16 12:18:48 2008
@@ -40,9 +40,17 @@
     enum { Size1 = 0x0, SizeOther = 0x1, Infeasible = 0x2, Flags = 0x3 };
     uintptr_t P;
     
-    unsigned getKind() const { return P & Flags; }
-    void* getPtr() const { return reinterpret_cast<void*>(P & ~Flags); }
-    ExplodedNodeImpl* getNode() const;
+    unsigned getKind() const {
+      return P & Flags;
+    }
+    
+    void* getPtr() const {
+      return reinterpret_cast<void*>(P & ~Flags);
+    }
+
+    ExplodedNodeImpl* getNode() const {
+      return reinterpret_cast<ExplodedNodeImpl*>(getPtr());
+    }
     
   public:
     NodeGroup() : P(0) {}
@@ -136,8 +144,8 @@
 public:
   /// Construct a ExplodedNodeImpl with the given node ID, program edge,
   ///  and state.
-  explicit ExplodedNode(unsigned ID, const ProgramPoint& loc, StateTy state)
-  : ExplodedNodeImpl(ID, loc, GRTrait<StateTy>::toPtr(state)) {}
+  explicit ExplodedNode(const ProgramPoint& loc, StateTy state)
+  : ExplodedNodeImpl(loc, GRTrait<StateTy>::toPtr(state)) {}
   
   /// getState - Returns the state associated with the node.  
   inline StateTy getState() const {
@@ -186,13 +194,7 @@
   typedef llvm::DenseMap<ProgramPoint,void*>        EdgeNodeSetMap;
   typedef llvm::SmallVector<ExplodedNodeImpl*,2>    RootsTy;
   typedef llvm::SmallVector<ExplodedNodeImpl*,10>   EndNodesTy;
-  
-  /// NodeCounter - The number of nodes that have been created, although
-  ///  this need not be the current number of nodes in the graph that
-  ///  are reachable from the roots.  This counter is used to assign a unique
-  ///  number to each node (which is useful for debugging).
-  unsigned NodeCounter;
-  
+    
   /// Roots - The roots of the simulation graph. Usually there will be only
   /// one, but clients are free to establish multiple subgraphs within a single
   /// SimulGraph. Moreover, these subgraphs can often merge when paths from
@@ -232,7 +234,6 @@
 
   unsigned num_roots() const { return Roots.size(); }
   unsigned num_eops() const { return EndNodes.size(); }
-  unsigned getCounter() const { return NodeCounter; }
 };
   
 template <typename CHECKER>
@@ -248,7 +249,7 @@
 protected:
   virtual ExplodedNodeImpl*
   getNodeImpl(const ProgramPoint& L, void* State, bool* IsNew) {
-    return getNode(L,GRTrait<StateTy>::toState(State),IsNew);
+    return getNode(L, GRTrait<StateTy>::toState(State), IsNew);
   }
     
 public:
@@ -275,15 +276,15 @@
     void* InsertPos = 0;
     
     StateTy::Profile(profile, State);
-    NodeTy* V = VSet.FindNodeOrInsertPos(profile, InsertPos);
+    NodeTy* V = VSet->FindNodeOrInsertPos(profile, InsertPos);
 
     if (!V) {
       // Allocate a new node.
       V = (NodeTy*) Allocator.Allocate<NodeTy>();
-      new (V) NodeTy(NodeCounter++, L, State);
+      new (V) NodeTy(L, State);
       
       // Insert the node into the node set and return it.
-      VSet.InsertNode(V, InsertPos);
+      VSet->InsertNode(V, InsertPos);
       
       if (IsNew) *IsNew = true;
     }

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GREngine.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GREngine.h?rev=46074&r1=46073&r2=46074&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GREngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GREngine.h Wed Jan 16 12:18:48 2008
@@ -173,7 +173,7 @@
   
   
   virtual void* getInitialState() {
-    return GRTrait<StateTy>::toPtr(getCheckerState()->getInitialState());
+    return GRTrait<StateTy>::toPtr(getCheckerState().getInitialState());
   }
   
   virtual void* ProcessEOP(CFGBlock* Blk, void* State) {

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRWorkList.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRWorkList.h?rev=46074&r1=46073&r2=46074&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRWorkList.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRWorkList.h Wed Jan 16 12:18:48 2008
@@ -38,7 +38,7 @@
 
 class GRWorkList {
 public:
-  virtual ~GRWorkList() = 0;
+  virtual ~GRWorkList();
   virtual bool hasWork() const = 0;
   virtual void Enqueue(const GRWorkListUnit& U) = 0;
 





More information about the cfe-commits mailing list