@@ -417,8 +417,8 @@ AggExprEmitter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
417
417
LValue Start = CGF.EmitLValueForFieldInitialization (DestLV, *Field);
418
418
llvm::Value *Zero = llvm::ConstantInt::get (CGF.PtrDiffTy , 0 );
419
419
llvm::Value *IdxStart[] = { Zero, Zero };
420
- llvm::Value *ArrayStart =
421
- Builder. CreateInBoundsGEP ( ArrayPtr.getPointer (), IdxStart, " arraystart" );
420
+ llvm::Value *ArrayStart = Builder. CreateInBoundsGEP (
421
+ ArrayPtr. getElementType (), ArrayPtr.getPointer (), IdxStart, " arraystart" );
422
422
CGF.EmitStoreThroughLValue (RValue::get (ArrayStart), Start);
423
423
++Field;
424
424
@@ -434,8 +434,8 @@ AggExprEmitter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
434
434
ArrayType->getElementType ())) {
435
435
// End pointer.
436
436
llvm::Value *IdxEnd[] = { Zero, Size };
437
- llvm::Value *ArrayEnd =
438
- Builder. CreateInBoundsGEP ( ArrayPtr.getPointer (), IdxEnd, " arrayend" );
437
+ llvm::Value *ArrayEnd = Builder. CreateInBoundsGEP (
438
+ ArrayPtr. getElementType (), ArrayPtr.getPointer (), IdxEnd, " arrayend" );
439
439
CGF.EmitStoreThroughLValue (RValue::get (ArrayEnd), EndOrLength);
440
440
} else if (Ctx.hasSameType (Field->getType (), Ctx.getSizeType ())) {
441
441
// Length.
@@ -484,12 +484,14 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
484
484
// down a level.
485
485
llvm::Value *zero = llvm::ConstantInt::get (CGF.SizeTy , 0 );
486
486
llvm::Value *indices[] = { zero, zero };
487
- llvm::Value *begin =
488
- Builder.CreateInBoundsGEP (DestPtr.getPointer (), indices, " arrayinit.begin" );
487
+ llvm::Value *begin = Builder.CreateInBoundsGEP (
488
+ DestPtr.getElementType (), DestPtr.getPointer (), indices,
489
+ " arrayinit.begin" );
489
490
490
491
CharUnits elementSize = CGF.getContext ().getTypeSizeInChars (elementType);
491
492
CharUnits elementAlign =
492
493
DestPtr.getAlignment ().alignmentOfArrayElement (elementSize);
494
+ llvm::Type *llvmElementType = begin->getType ()->getPointerElementType ();
493
495
494
496
// Consider initializing the array by copying from a global. For this to be
495
497
// more efficient than per-element initialization, the size of the elements
@@ -552,7 +554,8 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
552
554
for (uint64_t i = 0 ; i != NumInitElements; ++i) {
553
555
// Advance to the next element.
554
556
if (i > 0 ) {
555
- element = Builder.CreateInBoundsGEP (element, one, " arrayinit.element" );
557
+ element = Builder.CreateInBoundsGEP (
558
+ llvmElementType, element, one, " arrayinit.element" );
556
559
557
560
// Tell the cleanup that it needs to destroy up to this
558
561
// element. TODO: some of these stores can be trivially
@@ -581,14 +584,15 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
581
584
582
585
// Advance to the start of the rest of the array.
583
586
if (NumInitElements) {
584
- element = Builder.CreateInBoundsGEP (element, one, " arrayinit.start" );
587
+ element = Builder.CreateInBoundsGEP (
588
+ llvmElementType, element, one, " arrayinit.start" );
585
589
if (endOfInit.isValid ()) Builder.CreateStore (element, endOfInit);
586
590
}
587
591
588
592
// Compute the end of the array.
589
- llvm::Value *end = Builder.CreateInBoundsGEP (begin,
590
- llvm::ConstantInt::get (CGF. SizeTy , NumArrayElements) ,
591
- " arrayinit.end" );
593
+ llvm::Value *end = Builder.CreateInBoundsGEP (
594
+ llvmElementType, begin ,
595
+ llvm::ConstantInt::get (CGF. SizeTy , NumArrayElements), " arrayinit.end" );
592
596
593
597
llvm::BasicBlock *entryBB = Builder.GetInsertBlock ();
594
598
llvm::BasicBlock *bodyBB = CGF.createBasicBlock (" arrayinit.body" );
@@ -616,8 +620,8 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
616
620
}
617
621
618
622
// Move on to the next element.
619
- llvm::Value *nextElement =
620
- Builder. CreateInBoundsGEP ( currentElement, one, " arrayinit.next" );
623
+ llvm::Value *nextElement = Builder. CreateInBoundsGEP (
624
+ llvmElementType, currentElement, one, " arrayinit.next" );
621
625
622
626
// Tell the EH cleanup that we finished with the last element.
623
627
if (endOfInit.isValid ()) Builder.CreateStore (nextElement, endOfInit);
@@ -1779,8 +1783,9 @@ void AggExprEmitter::VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E,
1779
1783
// destPtr is an array*. Construct an elementType* by drilling down a level.
1780
1784
llvm::Value *zero = llvm::ConstantInt::get (CGF.SizeTy , 0 );
1781
1785
llvm::Value *indices[] = {zero, zero};
1782
- llvm::Value *begin = Builder.CreateInBoundsGEP (destPtr.getPointer (), indices,
1783
- " arrayinit.begin" );
1786
+ llvm::Value *begin = Builder.CreateInBoundsGEP (
1787
+ destPtr.getElementType (), destPtr.getPointer (), indices,
1788
+ " arrayinit.begin" );
1784
1789
1785
1790
// Prepare to special-case multidimensional array initialization: we avoid
1786
1791
// emitting multiple destructor loops in that case.
@@ -1802,7 +1807,8 @@ void AggExprEmitter::VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E,
1802
1807
llvm::PHINode *index =
1803
1808
Builder.CreatePHI (zero->getType (), 2 , " arrayinit.index" );
1804
1809
index ->addIncoming (zero, entryBB);
1805
- llvm::Value *element = Builder.CreateInBoundsGEP (begin, index );
1810
+ llvm::Value *element = Builder.CreateInBoundsGEP (
1811
+ begin->getType ()->getPointerElementType (), begin, index );
1806
1812
1807
1813
// Prepare for a cleanup.
1808
1814
QualType::DestructionKind dtorKind = elementType.isDestructedType ();
0 commit comments