diff options
| author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-03-25 05:58:37 +0000 |
|---|---|---|
| committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-03-25 05:58:37 +0000 |
| commit | 24e7eade19c023132fe73eb85dedcd5b70ecf61d (patch) | |
| tree | 4342dbec81c93b60ed1436ab41b87783666394cb /clang/lib/Analysis/SymbolManager.cpp | |
| parent | b2304ee0d191b7bb0b0c759a59ebeaa49c8b74d7 (diff) | |
| download | bcm5719-llvm-24e7eade19c023132fe73eb85dedcd5b70ecf61d.tar.gz bcm5719-llvm-24e7eade19c023132fe73eb85dedcd5b70ecf61d.zip | |
This patch adds two more SymbolData subclasses: SymIntExpr and SymSymExpr, for
representing symbolic expressions like 'x'+3 and 'x'+'y'. The design is
subjected to change later when we fix the class hierarchy of symbolic
expressions.
llvm-svn: 67678
Diffstat (limited to 'clang/lib/Analysis/SymbolManager.cpp')
| -rw-r--r-- | clang/lib/Analysis/SymbolManager.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/clang/lib/Analysis/SymbolManager.cpp b/clang/lib/Analysis/SymbolManager.cpp index efc7cd3b86f..33d6a5722e2 100644 --- a/clang/lib/Analysis/SymbolManager.cpp +++ b/clang/lib/Analysis/SymbolManager.cpp @@ -74,6 +74,47 @@ SymbolRef SymbolManager::getConjuredSymbol(const Stmt* E, QualType T, return SymbolCounter++; } +SymbolRef SymbolManager::getSymIntExpr(SymbolRef lhs,BinaryOperator::Opcode op, + const llvm::APSInt& v, QualType t) { + llvm::FoldingSetNodeID ID; + SymIntExpr::Profile(ID, lhs, op, v, t); + void* InsertPos; + + SymbolData* data = DataSet.FindNodeOrInsertPos(ID, InsertPos); + + if (data) + return data->getSymbol(); + + data = (SymIntExpr*) BPAlloc.Allocate<SymIntExpr>(); + new (data) SymIntExpr(SymbolCounter, lhs, op, v, t); + + DataSet.InsertNode(data, InsertPos); + DataMap[SymbolCounter] = data; + + return SymbolCounter++; +} + +SymbolRef SymbolManager::getSymSymExpr(SymbolRef lhs, BinaryOperator::Opcode op, + SymbolRef rhs, QualType t) { + llvm::FoldingSetNodeID ID; + SymSymExpr::Profile(ID, lhs, op, rhs, t); + void* InsertPos; + + SymbolData* data = DataSet.FindNodeOrInsertPos(ID, InsertPos); + + if (data) + return data->getSymbol(); + + data = (SymSymExpr*) BPAlloc.Allocate<SymSymExpr>(); + new (data) SymSymExpr(SymbolCounter, lhs, op, rhs, t); + + DataSet.InsertNode(data, InsertPos); + DataMap[SymbolCounter] = data; + + return SymbolCounter++; +} + + const SymbolData& SymbolManager::getSymbolData(SymbolRef Sym) const { DataMapTy::const_iterator I = DataMap.find(Sym); assert (I != DataMap.end()); |

