]> granicus.if.org Git - clang/commitdiff
Introduce getConstantArrayElementCount API and use it in
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 21 Aug 2009 16:31:06 +0000 (16:31 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 21 Aug 2009 16:31:06 +0000 (16:31 +0000)
construction/destruction of array members.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79637 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp
lib/CodeGen/CGCXX.cpp

index e8b4e57ce8564ced418102e0f158455f05a7fe7e..02a002b452b97a7d6f6b0c1418f16d0765fb80af 100644 (file)
@@ -805,6 +805,9 @@ public:
   /// (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,
index cf7ad26f330bb1e15c810e1d344ffccfba7fb74a..0cfb05b12ce610e62b24de2741bd1c11c327f54d 100644 (file)
@@ -2382,6 +2382,17 @@ QualType ASTContext::getBaseElementType(const VariableArrayType *VAT) {
   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) {
index 1298feb2fd0d53aedb15ee0ef265a56531e1b6be..15979be7902903b4cd66cadaf33f3401b873bef0 100644 (file)
@@ -346,10 +346,10 @@ CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
   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 @@ CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
   // 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 @@ CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
   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 @@ CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
   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),