Introduce getConstantArrayElementCount API and use it in
construction/destruction of array members.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79637 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h
index e8b4e57..02a002b 100644
--- a/include/clang/AST/ASTContext.h
+++ b/include/clang/AST/ASTContext.h
@@ -805,6 +805,9 @@
   /// (which needn't actually be an array type).
   QualType getBaseElementType(QualType QT);
   
+  /// getConstantArrayElementCount - Returns number of constant array elements.
+  uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const;
+  
   /// getArrayDecayedType - Return the properly qualified result of decaying the
   /// specified array type to a pointer.  This operation is non-trivial when
   /// handling typedefs etc.  The canonical type of "T" must be an array type,
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index cf7ad26..0cfb05b 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -2382,6 +2382,17 @@
   return ElemTy;
 }
 
+/// getConstantArrayElementCount - Returns number of constant array elements.
+uint64_t 
+ASTContext::getConstantArrayElementCount(const ConstantArrayType *CA)  const {
+  uint64_t ElementCount = 1;
+  do {
+    ElementCount *= CA->getSize().getZExtValue();
+    CA = dyn_cast<ConstantArrayType>(CA->getElementType());
+  } while (CA);
+  return ElementCount;
+}
+
 /// getFloatingRank - Return a relative rank for floating point types.
 /// This routine will assert if passed a built-in type that isn't a float.
 static FloatingRank getFloatingRank(QualType T) {
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp
index 1298feb..15979be 100644
--- a/lib/CodeGen/CGCXX.cpp
+++ b/lib/CodeGen/CGCXX.cpp
@@ -346,10 +346,10 @@
   assert(CA && "Do we support VLA for construction ?");
   
   // Create a temporary for the loop index and initialize it with 0.
-  llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt32Ty(VMContext),
+  llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt64Ty(VMContext),
                                            "loop.index");
   llvm::Value* zeroConstant = 
-    llvm::Constant::getNullValue(llvm::Type::getInt32Ty(VMContext));
+    llvm::Constant::getNullValue(llvm::Type::getInt64Ty(VMContext));
   Builder.CreateStore(zeroConstant, IndexPtr, false);
   
   // Start the loop with a block that tests the condition.
@@ -364,7 +364,7 @@
   // otherwise, go to the block after the for-loop.
   uint64_t NumElements = CA->getSize().getZExtValue();
   llvm::Value * NumElementsPtr = 
-  llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), NumElements);
+  llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), NumElements);
   llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
   llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElementsPtr, 
                                               "isless");
@@ -378,15 +378,10 @@
   Counter = Builder.CreateLoad(IndexPtr);
   if (const ConstantArrayType *CAT = 
       dyn_cast<ConstantArrayType>(Array->getElementType())) {
-    uint32_t delta = 1;
-    const ConstantArrayType *CAW = CAT;
-    do {
-      delta *= CAW->getSize().getZExtValue();
-      CAW = dyn_cast<ConstantArrayType>(CAW->getElementType());
-    } while (CAW);
+    uint64_t delta = getContext().getConstantArrayElementCount(CAT);
     // Address = This + delta*Counter for current loop iteration.
     llvm::Value *DeltaPtr = 
-      llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), delta);
+      llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), delta);
     DeltaPtr = Builder.CreateMul(Counter, DeltaPtr, "mul");
     llvm::Value *Address = 
       Builder.CreateInBoundsGEP(This, DeltaPtr, "arrayidx");
@@ -422,12 +417,7 @@
   assert(CA && "Do we support VLA for destruction ?");
   llvm::Value *One = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), 
                                             1);
-  uint64_t ElementCount = 1;
-  const ConstantArrayType *CAW = CA;
-  do {
-    ElementCount *= CAW->getSize().getZExtValue();
-    CAW = dyn_cast<ConstantArrayType>(CAW->getElementType());
-  } while (CAW);
+  uint64_t ElementCount = getContext().getConstantArrayElementCount(CA);
   // Create a temporary for the loop index and initialize it with count of
   // array elements.
   llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt64Ty(VMContext),