CompoundVal now uses an ImmutableList<SVal> to store its set of SVals.  This change was motivated by the need to allow state-splitting in GRExprEngine::VisitInitListExpr.  As a side-benefit, we no longer need to perform any copies of SVals when creating a CompoundSVal, and the profiling of CompoundSVal is now constant time.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58437 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/BasicValueFactory.cpp b/lib/Analysis/BasicValueFactory.cpp
index 18fdbdf..5b7041b 100644
--- a/lib/Analysis/BasicValueFactory.cpp
+++ b/lib/Analysis/BasicValueFactory.cpp
@@ -14,34 +14,18 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/PathSensitive/BasicValueFactory.h"
-#include "clang/Analysis/PathSensitive/SVals.h"
 
 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) {
+                              llvm::ImmutableList<SVal> L) {
   T.Profile(ID);
-  ID.AddInteger(N);
-  for (unsigned i = 0; i < N; ++i)
-    Vals[i].Profile(ID);
+  ID.AddPointer(L.getInternalPointer());
 }
 
 typedef std::pair<SVal, uintptr_t> SValData;
 typedef std::pair<SVal, SVal> SValPair;
 
-
 namespace llvm {
 template<> struct FoldingSetTrait<SValData> {
   static inline void Profile(const SValData& X, llvm::FoldingSetNodeID& ID) {
@@ -127,17 +111,18 @@
 }
 
 const CompoundValData* 
-BasicValueFactory::getCompoundValData(QualType T, const SVal* Vals,
-                                      unsigned NumVals) {
+BasicValueFactory::getCompoundValData(QualType T,
+                                      llvm::ImmutableList<SVal> Vals) {
+  
   llvm::FoldingSetNodeID ID;
-  CompoundValData::Profile(ID, T, NumVals, Vals);
+  CompoundValData::Profile(ID, T, Vals);
   void* InsertPos;
 
   CompoundValData* D = CompoundValDataSet.FindNodeOrInsertPos(ID, InsertPos);
 
   if (!D) {
     D = (CompoundValData*) BPAlloc.Allocate<CompoundValData>();
-    new (D) CompoundValData(T, Vals, NumVals, BPAlloc);
+    new (D) CompoundValData(T, Vals);
     CompoundValDataSet.InsertNode(D, InsertPos);
   }