aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Analysis/PathSensitive/SymbolManager.h32
-rw-r--r--lib/Analysis/SymbolManager.cpp7
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;