diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-03-12 01:21:45 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-03-12 01:21:45 +0000 |
commit | 68d73d19f1be5c3810ce5778f23abcdb6188bc79 (patch) | |
tree | de3d7b70675f251be35876e8abe4a782b0047eb9 /clang/Analysis/SymbolManager.cpp | |
parent | 251084d03e53dbad8eff9c15f99f3932c5e8c516 (diff) | |
download | bcm5719-llvm-68d73d19f1be5c3810ce5778f23abcdb6188bc79.tar.gz bcm5719-llvm-68d73d19f1be5c3810ce5778f23abcdb6188bc79.zip |
Prototype (pre-alpha) implementation of CFRef checker.
llvm-svn: 48272
Diffstat (limited to 'clang/Analysis/SymbolManager.cpp')
-rw-r--r-- | clang/Analysis/SymbolManager.cpp | 92 |
1 files changed, 74 insertions, 18 deletions
diff --git a/clang/Analysis/SymbolManager.cpp b/clang/Analysis/SymbolManager.cpp index 95fbbb937a5..54546494435 100644 --- a/clang/Analysis/SymbolManager.cpp +++ b/clang/Analysis/SymbolManager.cpp @@ -20,30 +20,84 @@ SymbolID SymbolManager::getSymbol(VarDecl* D) { assert (isa<ParmVarDecl>(D) || D->hasGlobalStorage()); - SymbolID& X = DataToSymbol[getKey(D)]; - - if (!X.isInitialized()) { - X = SymbolToData.size(); - - if (ParmVarDecl* VD = dyn_cast<ParmVarDecl>(D)) - SymbolToData.push_back(SymbolDataParmVar(VD)); - else - SymbolToData.push_back(SymbolDataGlobalVar(D)); + llvm::FoldingSetNodeID profile; + + ParmVarDecl* PD = dyn_cast<ParmVarDecl>(D); + + if (PD) + SymbolDataParmVar::Profile(profile, PD); + else + SymbolDataGlobalVar::Profile(profile, D); + + void* InsertPos; + + SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); + + if (SD) + return SD->getSymbol(); + + if (PD) { + SD = (SymbolData*) BPAlloc.Allocate<SymbolDataParmVar>(); + new (SD) SymbolDataParmVar(SymbolCounter, PD); + } + else { + SD = (SymbolData*) BPAlloc.Allocate<SymbolDataGlobalVar>(); + new (SD) SymbolDataGlobalVar(SymbolCounter, D); } - return X; + DataSet.InsertNode(SD, InsertPos); + + DataMap[SymbolCounter] = SD; + return SymbolCounter++; } SymbolID SymbolManager::getContentsOfSymbol(SymbolID sym) { - SymbolID& X = DataToSymbol[getKey(sym)]; - if (!X.isInitialized()) { - X = SymbolToData.size(); - SymbolToData.push_back(SymbolDataContentsOf(sym)); - } + llvm::FoldingSetNodeID profile; + SymbolDataContentsOf::Profile(profile, sym); + void* InsertPos; + + SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); + + if (SD) + return SD->getSymbol(); + + SD = (SymbolData*) BPAlloc.Allocate<SymbolDataContentsOf>(); + new (SD) SymbolDataContentsOf(SymbolCounter, sym); + + + DataSet.InsertNode(SD, InsertPos); + DataMap[SymbolCounter] = SD; - return X; + return SymbolCounter++; } + +SymbolID SymbolManager::getCallRetValSymbol(CallExpr* CE, unsigned Count) { + + llvm::FoldingSetNodeID profile; + SymbolDataCallRetVal::Profile(profile, CE, Count); + void* InsertPos; + + SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); + + if (SD) + return SD->getSymbol(); + + SD = (SymbolData*) BPAlloc.Allocate<SymbolDataCallRetVal>(); + new (SD) SymbolDataCallRetVal(SymbolCounter, CE, Count); + + DataSet.InsertNode(SD, InsertPos); + DataMap[SymbolCounter] = SD; + + return SymbolCounter++; +} + +const SymbolData& SymbolManager::getSymbolData(SymbolID Sym) const { + DataMapTy::const_iterator I = DataMap.find(Sym); + assert (I != DataMap.end()); + return *I->second; +} + QualType SymbolData::getType(const SymbolManager& SymMgr) const { switch (getKind()) { @@ -57,12 +111,14 @@ QualType SymbolData::getType(const SymbolManager& SymMgr) const { return cast<SymbolDataGlobalVar>(this)->getDecl()->getType(); case ContentsOfKind: { - SymbolID x = cast<SymbolDataContentsOf>(this)->getSymbol(); + SymbolID x = cast<SymbolDataContentsOf>(this)->getContainerSymbol(); QualType T = SymMgr.getSymbolData(x).getType(SymMgr); return T->getAsPointerType()->getPointeeType(); } + + case CallRetValKind: + return cast<SymbolDataCallRetVal>(this)->getCallExpr()->getType(); } } -SymbolManager::SymbolManager() {} SymbolManager::~SymbolManager() {} |