Add CompoundVal and CompoundValData for representing the value of InitListExpr.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58418 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/BasicValueFactory.cpp b/lib/Analysis/BasicValueFactory.cpp
index 0ef34b8..18fdbdf 100644
--- a/lib/Analysis/BasicValueFactory.cpp
+++ b/lib/Analysis/BasicValueFactory.cpp
@@ -18,6 +18,26 @@
 
 using namespace clang;
 
+CompoundValData::CompoundValData(QualType t, const SVal* vals, unsigned n,
+                                 llvm::BumpPtrAllocator& A)
+  : T(t), NumVals(n) {
+
+  Vals = (SVal*) A.Allocate<SVal>(n);
+
+  new (Vals) SVal[n];
+
+  for (unsigned i = 0; i < n; ++i)
+    Vals[i] = vals[i];
+}
+
+void CompoundValData::Profile(llvm::FoldingSetNodeID& ID, QualType T, 
+                              unsigned N, const SVal* Vals) {
+  T.Profile(ID);
+  ID.AddInteger(N);
+  for (unsigned i = 0; i < N; ++i)
+    Vals[i].Profile(ID);
+}
+
 typedef std::pair<SVal, uintptr_t> SValData;
 typedef std::pair<SVal, SVal> SValPair;
 
@@ -106,6 +126,24 @@
   return *C;
 }
 
+const CompoundValData* 
+BasicValueFactory::getCompoundValData(QualType T, const SVal* Vals,
+                                      unsigned NumVals) {
+  llvm::FoldingSetNodeID ID;
+  CompoundValData::Profile(ID, T, NumVals, Vals);
+  void* InsertPos;
+
+  CompoundValData* D = CompoundValDataSet.FindNodeOrInsertPos(ID, InsertPos);
+
+  if (!D) {
+    D = (CompoundValData*) BPAlloc.Allocate<CompoundValData>();
+    new (D) CompoundValData(T, Vals, NumVals, BPAlloc);
+    CompoundValDataSet.InsertNode(D, InsertPos);
+  }
+
+  return D;
+}
+
 const llvm::APSInt*
 BasicValueFactory::EvaluateAPSInt(BinaryOperator::Opcode Op,
                              const llvm::APSInt& V1, const llvm::APSInt& V2) {
diff --git a/lib/Analysis/SVals.cpp b/lib/Analysis/SVals.cpp
index 7c1098c..8d5b8ab 100644
--- a/lib/Analysis/SVals.cpp
+++ b/lib/Analysis/SVals.cpp
@@ -245,6 +245,11 @@
   return nonloc::ConcreteInt(BasicVals.getTruthValue(b));
 }
 
+NonLoc NonLoc::MakeCompoundVal(QualType T, SVal* Vals, unsigned NumSVals,
+                               BasicValueFactory& BasicVals) {
+  return nonloc::CompoundVal(BasicVals.getCompoundValData(T, Vals, NumSVals));
+}
+
 SVal SVal::GetSymbolValue(SymbolManager& SymMgr, VarDecl* D) {
 
   QualType T = D->getType();