diff options
-rw-r--r-- | include/clang/Analysis/PathSensitive/SymbolManager.h | 32 | ||||
-rw-r--r-- | lib/Analysis/SymbolManager.cpp | 7 |
2 files changed, 24 insertions, 15 deletions
diff --git a/include/clang/Analysis/PathSensitive/SymbolManager.h b/include/clang/Analysis/PathSensitive/SymbolManager.h index 91d3b348b9..62dadd338f 100644 --- a/include/clang/Analysis/PathSensitive/SymbolManager.h +++ b/include/clang/Analysis/PathSensitive/SymbolManager.h @@ -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; diff --git a/lib/Analysis/SymbolManager.cpp b/lib/Analysis/SymbolManager.cpp index 45e1aae23b..589178fecb 100644 --- a/lib/Analysis/SymbolManager.cpp +++ b/lib/Analysis/SymbolManager.cpp @@ -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; |