[cfe-commits] r47926 - /cfe/trunk/include/clang/Analysis/ProgramPoint.h

Ted Kremenek kremenek at apple.com
Tue Mar 4 16:59:43 PST 2008


Author: kremenek
Date: Tue Mar  4 18:59:43 2008
New Revision: 47926

URL: http://llvm.org/viewvc/llvm-project?rev=47926&view=rev
Log:
Added support for ProgramPoints to represent ExplodedNodes in another
ExplodedGraph. This allows us to build "layered" ExplodedGraphs where one
simulation is layered on another.

Modified:
    cfe/trunk/include/clang/Analysis/ProgramPoint.h

Modified: cfe/trunk/include/clang/Analysis/ProgramPoint.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/ProgramPoint.h?rev=47926&r1=47925&r2=47926&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/ProgramPoint.h (original)
+++ cfe/trunk/include/clang/Analysis/ProgramPoint.h Tue Mar  4 18:59:43 2008
@@ -25,8 +25,13 @@
     
 class ProgramPoint {
 public:
-  enum Kind { BlockEntranceKind=0, PostStmtKind=1, BlockExitKind=2,
-              BlockEdgeSrcKind=3, BlockEdgeDstKind=4, BlockEdgeAuxKind=5 }; 
+  enum Kind { LayeredNodeKind  =  0x0,
+              BlockEntranceKind = 0x1,
+              PostStmtKind      = 0x2,
+              BlockExitKind     = 0x3,
+              BlockEdgeSrcKind  = 0x5, // Skip 0x4.
+              BlockEdgeDstKind  = 0x6,
+              BlockEdgeAuxKind  = 0x7 }; 
 protected:
   uintptr_t Data;
 
@@ -40,8 +45,16 @@
   ProgramPoint() : Data(0) {}
   
 public:    
-  unsigned getKind() const { return Data & 0x7; }  
-  void* getRawPtr() const { return reinterpret_cast<void*>(Data & ~0x7); }
+  
+  unsigned getKind() const { 
+    unsigned x = Data & 0x7;
+    return x & 0x3 ? x : 0;  // Use only lower 2 bits for 0x0.
+  }  
+  
+  void* getRawPtr() const {
+    return (void*) (getKind() ? Data & ~0x7 : Data & ~0x3);
+  }
+
   void* getRawData() const { return reinterpret_cast<void*>(Data); }
   
   static bool classof(const ProgramPoint*) { return true; }
@@ -53,6 +66,27 @@
     ID.AddPointer(getRawPtr());
   }    
 };
+  
+class ExplodedNodeImpl;
+template <typename StateTy> class ExplodedNode;
+  
+class LayeredNode : public ProgramPoint {
+public:
+  LayeredNode(ExplodedNodeImpl* N) : ProgramPoint(N, LayeredNodeKind) {
+    assert (reinterpret_cast<uintptr_t>(N) & 0x3 == 0 &&
+            "Address of ExplodedNode must have 4-byte alignment.");
+  }
+  
+  ExplodedNodeImpl* getNodeImpl() const {
+    return (ExplodedNodeImpl*) getRawPtr();
+  }
+
+  template <typename StateTy>
+  ExplodedNode<StateTy>* getNode() const {
+    return (ExplodedNode<StateTy>*) getRawPtr();
+  }
+
+};
                
 class BlockEntrance : public ProgramPoint {
 public:





More information about the cfe-commits mailing list