summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-03-04 22:53:46 +0000
committerTed Kremenek <kremenek@apple.com>2009-03-04 22:53:46 +0000
commit6ee8f8bcb51b353d2ad2f256b3f840c39e90efe3 (patch)
treedfa62e0d9d9c8cf008f25ead716218a975d891a3 /clang
parent2d33d6300cd2cda457d993d03c8179cc72f6af4f (diff)
downloadbcm5719-llvm-6ee8f8bcb51b353d2ad2f256b3f840c39e90efe3.tar.gz
bcm5719-llvm-6ee8f8bcb51b353d2ad2f256b3f840c39e90efe3.zip
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. llvm-svn: 66092
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Analysis/PathSensitive/SymbolManager.h32
-rw-r--r--clang/lib/Analysis/SymbolManager.cpp7
2 files changed, 24 insertions, 15 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/SymbolManager.h b/clang/include/clang/Analysis/PathSensitive/SymbolManager.h
index 91d3b348b96..62dadd338fc 100644
--- a/clang/include/clang/Analysis/PathSensitive/SymbolManager.h
+++ b/clang/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/clang/lib/Analysis/SymbolManager.cpp b/clang/lib/Analysis/SymbolManager.cpp
index 45e1aae23bc..589178fecb1 100644
--- a/clang/lib/Analysis/SymbolManager.cpp
+++ b/clang/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;
OpenPOWER on IntegriCloud