diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -1222,29 +1222,18 @@ llvm::Constant *EmitArrayInitialization(InitListExpr *ILE, QualType T) { auto *CAT = CGM.getContext().getAsConstantArrayType(ILE->getType()); assert(CAT && "can't emit array init for non-constant-bound array"); - unsigned NumInitElements = ILE->getNumInits(); - unsigned NumElements = CAT->getSize().getZExtValue(); + uint64_t NumInitElements = ILE->getNumInits(); + uint64_t NumElements = CAT->getSize().getZExtValue(); + printf("hi\n"); // Initialising an array requires us to automatically // initialise any elements that have not been initialised explicitly - unsigned NumInitableElts = std::min(NumInitElements, NumElements); + uint64_t NumInitableElts = std::min(NumInitElements, NumElements); QualType EltType = CAT->getElementType(); - // Initialize remaining array elements. - llvm::Constant *fillC = nullptr; - if (Expr *filler = ILE->getArrayFiller()) { - fillC = Emitter.tryEmitAbstractForMemory(filler, EltType); - if (!fillC) - return nullptr; - } - - // Copy initializer elements. - SmallVector Elts; - if (fillC && fillC->isNullValue()) - Elts.reserve(NumInitableElts + 1); - else - Elts.reserve(NumElements); + SmallVector Inits; + Inits.reserve(NumInitableElts + 1); llvm::Type *CommonElementType = nullptr; for (unsigned i = 0; i < NumInitableElts; ++i) { @@ -1256,13 +1245,33 @@ CommonElementType = C->getType(); else if (C->getType() != CommonElementType) CommonElementType = nullptr; - Elts.push_back(C); + Inits.push_back(C); } - llvm::ArrayType *Desired = + uint64_t TrailingZeroes = NumElements - NumInitElements; + + // If all elements have the same type, just emit an array constant. + if (CommonElementType && TrailingZeroes == 0) + return llvm::ConstantArray::get( + llvm::ArrayType::get(CommonElementType, NumElements), Inits); + + llvm::ArrayType *DesiredType = cast(CGM.getTypes().ConvertType(ILE->getType())); - return EmitArrayConstant(CGM, Desired, CommonElementType, NumElements, Elts, - fillC); + + auto *FillerType = + CommonElementType ? CommonElementType : DesiredType->getElementType(); + FillerType = llvm::ArrayType::get(FillerType, TrailingZeroes); + + Inits.push_back(llvm::ConstantAggregateZero::get(FillerType)); + + llvm::SmallVector Types; + for (llvm::Constant *Elt : Inits) + Types.push_back(Elt->getType()); + + llvm::StructType *SType = + llvm::StructType::get(CGM.getLLVMContext(), Types, true); + + return llvm::ConstantStruct::get(SType, Inits); } llvm::Constant *EmitRecordInitialization(InitListExpr *ILE, QualType T) { diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -3164,7 +3164,7 @@ const Constant *BaseCV, uint64_t Offset, AsmPrinter::AliasMapTy *AliasList) { // Print the fields in successive locations. Pad to align if needed! - unsigned Size = DL.getTypeAllocSize(CS->getType()); + uint64_t Size = DL.getTypeAllocSize(CS->getType()); const StructLayout *Layout = DL.getStructLayout(CS->getType()); uint64_t SizeSoFar = 0; for (unsigned I = 0, E = CS->getNumOperands(); I != E; ++I) {