[cfe-commits] r66092 - in /cfe/trunk: include/clang/Analysis/PathSensitive/SymbolManager.h lib/Analysis/SymbolManager.cpp

Ted Kremenek kremenek at apple.com
Wed Mar 4 14:53:46 PST 2009


Author: kremenek
Date: Wed Mar  4 16:53:46 2009
New Revision: 66092

URL: http://llvm.org/viewvc/llvm-project?rev=66092&view=rev
Log:
Add an optional "tag" to conjured symbols that allows us to distinguish between
multiple symbols conjured at the same location. All that is required of the tag
is that it is a fixed void* value that points to an memory address that remains
valid throughout the remainder of the lifetime of the SymbolManager.

Modified:
    cfe/trunk/include/clang/Analysis/PathSensitive/SymbolManager.h
    cfe/trunk/lib/Analysis/SymbolManager.cpp

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

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/SymbolManager.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/SymbolManager.h Wed Mar  4 16:53:46 2009
@@ -139,28 +139,33 @@
   Stmt* S;
   QualType T;
   unsigned Count;
+  const void* SymbolTag;
 
 public:
-  SymbolConjured(SymbolRef Sym, Stmt* s, QualType t, unsigned count)
-    : SymbolData(ConjuredKind, Sym), S(s), T(t), Count(count) {}
+  SymbolConjured(SymbolRef Sym, Stmt* s, QualType t, unsigned count,
+                 const void* symbolTag)
+    : SymbolData(ConjuredKind, Sym), S(s), T(t), Count(count),
+      SymbolTag(symbolTag) {}
   
   Stmt* getStmt() const { return S; }
-  unsigned getCount() const { return Count; }    
+  unsigned getCount() const { return Count; }
+  const void* getTag() const { return SymbolTag; }
+  
   QualType getType(ASTContext&) const;
   
-  static void Profile(llvm::FoldingSetNodeID& profile,
-                      Stmt* S, QualType T, unsigned Count) {
-    
+  static void Profile(llvm::FoldingSetNodeID& profile, Stmt* S, QualType T,
+                      unsigned Count, const void* SymbolTag) {    
     profile.AddInteger((unsigned) ConjuredKind);
     profile.AddPointer(S);
     profile.Add(T);
     profile.AddInteger(Count);
+    profile.AddPointer(SymbolTag);
   }
-  
+
   virtual void Profile(llvm::FoldingSetNodeID& profile) {
-    Profile(profile, S, T, Count);
+    Profile(profile, S, T, Count, SymbolTag);
   }
-  
+
   // Implement isa<T> support.
   static inline bool classof(const SymbolData* D) {
     return D->getKind() == ConjuredKind;
@@ -217,9 +222,12 @@
 
   /// Make a unique symbol for MemRegion R according to its kind.
   SymbolRef getRegionRValueSymbol(const MemRegion* R);
-  SymbolRef getConjuredSymbol(Stmt* E, QualType T, unsigned VisitCount);
-  SymbolRef getConjuredSymbol(Expr* E, unsigned VisitCount) {
-    return getConjuredSymbol(E, E->getType(), VisitCount);
+  SymbolRef getConjuredSymbol(Stmt* E, QualType T, unsigned VisitCount,
+                              const void* SymbolTag = 0);
+
+  SymbolRef getConjuredSymbol(Expr* E, unsigned VisitCount,
+                              const void* SymbolTag = 0) {    
+    return getConjuredSymbol(E, E->getType(), VisitCount, SymbolTag);
   }
   
   const SymbolData& getSymbolData(SymbolRef ID) const;

Modified: cfe/trunk/lib/Analysis/SymbolManager.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SymbolManager.cpp?rev=66092&r1=66091&r2=66092&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/SymbolManager.cpp (original)
+++ cfe/trunk/lib/Analysis/SymbolManager.cpp Wed Mar  4 16:53:46 2009
@@ -52,10 +52,11 @@
   return SymbolCounter++;
 }
 
-SymbolRef SymbolManager::getConjuredSymbol(Stmt* E, QualType T, unsigned Count){
+SymbolRef SymbolManager::getConjuredSymbol(Stmt* E, QualType T, unsigned Count,
+                                           const void* SymbolTag) {
   
   llvm::FoldingSetNodeID profile;
-  SymbolConjured::Profile(profile, E, T, Count);
+  SymbolConjured::Profile(profile, E, T, Count, SymbolTag);
   void* InsertPos;
   
   SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);
@@ -64,7 +65,7 @@
     return SD->getSymbol();
   
   SD = (SymbolData*) BPAlloc.Allocate<SymbolConjured>();
-  new (SD) SymbolConjured(SymbolCounter, E, T, Count);
+  new (SD) SymbolConjured(SymbolCounter, E, T, Count, SymbolTag);
   
   DataSet.InsertNode(SD, InsertPos);  
   DataMap[SymbolCounter] = SD;





More information about the cfe-commits mailing list