[cfe-commits] r45298 - /cfe/trunk/include/clang/Analysis/PathSensitive/SimulGraph.h

Ted Kremenek kremenek at apple.com
Fri Dec 21 15:21:58 PST 2007


Author: kremenek
Date: Fri Dec 21 17:21:58 2007
New Revision: 45298

URL: http://llvm.org/viewvc/llvm-project?rev=45298&view=rev
Log:
Added preliminary implementation of SimulGraph, which represents the
intra-procedural supergraph of a path-sensitive dataflow analysis.

Added:
    cfe/trunk/include/clang/Analysis/PathSensitive/SimulGraph.h

Added: cfe/trunk/include/clang/Analysis/PathSensitive/SimulGraph.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/SimulGraph.h?rev=45298&view=auto

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/SimulGraph.h (added)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/SimulGraph.h Fri Dec 21 17:21:58 2007
@@ -0,0 +1,116 @@
+//==-- SimulGraph.h - Local, Path-Sensitive Supergraph -*- C++ ---------*---==//
+//
+//                     The LLVM Compiler Infrastructure
+//
+//        This file is distributed under the University of Illinois 
+//        Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  This file defines the template class SimulVGraph, which represents a
+//  path-sensitive, intra-procedural dataflow supergraph.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_ANALYSIS_PS_LOCAL_SUPERGRAPH
+#define LLVM_CLANG_ANALYSIS_PS_LOCAL_SUPERGRAPH
+
+#include "clang/Analysis/PathSensitive/SimulVertex.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/FoldingSet.h"
+#include "llvm/ADT/DenseMap.h"
+
+namespace clang {
+  
+tempalte <typename VertexTy>
+class SimulGraph {
+  // Type definitions.
+  typedef llvm::FoldingSet<VertexTy> VertexSet;
+  typedef llvm::DenseMap<ProgramEdge,VertexSet> EdgeVertexSetMap;
+  
+  /// VertexCounter - The number of vertices that have been created, although
+  ///  this need not be the current number of vertices in the graph that
+  ///  are reachable from the roots.  This counter is used to assign a unique
+  ///  number to each vertex (which is useful for debugging).
+  unsigned VertexCounter;
+  
+  /// 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
+  /// different roots reach the same state at the same program location.
+  typedef llvm::SmallVector<2,VertexTy*> RootsTy;
+  RootsTy Roots;
+
+  /// EndVertices - The vertices in the simulation graph which have been
+  ///  specially marked as the endpoint of an abstract simulation path.
+  llvm::SmallVector<10,VertexTy*> EndVerticesTy
+  EndVerticesTy EndVertices;
+    
+  /// VerticesOfEdge - A mapping from edges to vertices.
+  EdgeVertexSetMap VerticesOfEdge;
+
+public:
+  SimulGraph() : VertexCounter(0) {}
+  
+  /// getVertex - Retrieve the vertex associated with a (Location,State) pair,
+  ///  where the 'Location' is a ProgramEdge in the CFG.  If no vertex for
+  ///  this pair exists, it is created.
+  VertexTy* getVertex(ProgramEdge Loc, typename VertexTy::StateTy* State) {
+    // Retrieve the vertex set associated with Loc.
+    VertexSet& VSet = VerticesOfEdge[Loc];
+
+    // Profile 'State' to determine if we already have an existing vertex.
+    // Note: this assumes that a vertex's profile matches with its state,
+    //  which is the case when VertexTy == SimulVertex. (other implementations
+    //  must guarantee this invariant)
+    FoldingSetNodeID profile;    
+    void* InsertPos = 0;
+    VertexTy* V = 0;
+        
+    typename VertexTy::StateTy::Profile(profile,State);
+    
+    if (V = VSet::FindNodeOrInsertPos(profile,InsertPos))
+      return V;
+      
+    // FIXME: Allocate from a BumpPtrAllocator.
+    V = new VertexTy(VertexCounter++,Loc,State);
+
+    // Insert the vertex in the vertex set and return it.
+    VSet.InserNode(V,InsertPos);
+    
+    return V;
+  }
+  
+  /// addRoot - Add a vertex to the set of roots.
+  void addRoot(VertexTy* V) {
+    Roots.push_back(V);    
+  }
+  
+  void addEndOfPath(VertexTy* V) {
+    EndVertices.push_back(V);
+  }
+
+  unsigned num_roots() const { return Roots.size(); }
+  unsigned num_eops() const { return EndVertices.size(); }
+  
+  // Iterators.
+  typedef RootsTy::iterator roots_iterator;
+  typedef RootsTy::const_iterator const_roots_iterator;
+  
+  roots_iterator roots_begin() { return Roots.begin(); }
+  roots_iterator roots_end() { return Roots.end(); }  
+  const_roots_iterator roots_begin() const { return Roots.begin(); }
+  const_roots_iterator roots_end() const { return Roots.end(); }
+  
+  typedef EndVerticesTy::iterator eop_iterator;
+  typedef EndVerticesTy::const_iterator const_eop_iterator;
+  
+  eop_iterator eop_begin() { return EndVertices.begin(); }
+  eop_iterator eop_end() { return EndVertices.end(); }
+  const_eop_iterator eop_begin() const { return EndVertices.begin(); }
+  const_eop_iterator eop_end() const { return EndVertices.end(); }    
+};
+  
+} // end clang namespace
+
+#endif





More information about the cfe-commits mailing list