summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/SymbolManager.cpp
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2009-03-25 05:58:37 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2009-03-25 05:58:37 +0000
commit24e7eade19c023132fe73eb85dedcd5b70ecf61d (patch)
tree4342dbec81c93b60ed1436ab41b87783666394cb /clang/lib/Analysis/SymbolManager.cpp
parentb2304ee0d191b7bb0b0c759a59ebeaa49c8b74d7 (diff)
downloadbcm5719-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.cpp41
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());
OpenPOWER on IntegriCloud