From: Fariborz Jahanian Date: Fri, 21 Aug 2009 16:31:06 +0000 (+0000) Subject: Introduce getConstantArrayElementCount API and use it in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0de78998e7bda473b408437053e48661b510d453;p=clang 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 e8b4e57ce8..02a002b452 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -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, diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index cf7ad26f33..0cfb05b12c 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -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(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 1298feb2fd..15979be790 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -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(Array->getElementType())) { - uint32_t delta = 1; - const ConstantArrayType *CAW = CAT; - do { - delta *= CAW->getSize().getZExtValue(); - CAW = dyn_cast(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(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),