]> granicus.if.org Git - clang/commitdiff
Add an optional "tag" to conjured symbols that allows us to distinguish between
authorTed Kremenek <kremenek@apple.com>
Wed, 4 Mar 2009 22:53:46 +0000 (22:53 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 4 Mar 2009 22:53:46 +0000 (22:53 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66092 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/SymbolManager.h
lib/Analysis/SymbolManager.cpp

index 91d3b348b9615f2f15e5e116d2e025425a514415..62dadd338fc62fff475531a5e0c40fcaf22b298e 100644 (file)
@@ -139,28 +139,33 @@ class SymbolConjured : public SymbolData {
   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 @@ public:
 
   /// 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;
index 45e1aae23bc59614dc8b665ca849879f820b23e9..589178fecb123fa38af786e83909064dc3314777 100644 (file)
@@ -52,10 +52,11 @@ SymbolRef SymbolManager::getRegionRValueSymbol(const MemRegion* R) {
   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 @@ SymbolRef SymbolManager::getConjuredSymbol(Stmt* E, QualType T, unsigned Count){
     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;