@@ -851,7 +851,8 @@ class KernelObjVisitor {
851
851
std::initializer_list<int >{(handlers.enterArray (), 0 )...};
852
852
for (int64_t Count = 0 ; Count < ElemCount; Count++) {
853
853
VisitElement (nullptr , FD, ET, handlers...);
854
- (void )std::initializer_list<int >{(handlers.nextElement (ET, Count), 0 )...};
854
+ (void )std::initializer_list<int >{
855
+ (handlers.nextElement (ET, Count + 1 ), 0 )...};
855
856
}
856
857
(void )std::initializer_list<int >{
857
858
(handlers.leaveArray (FD, ET, ElemCount), 0 )...};
@@ -1748,9 +1749,9 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1748
1749
return Dims;
1749
1750
}
1750
1751
1751
- int64_t getArrayIndex (int i ) {
1752
+ int64_t getArrayIndex (int Idx ) {
1752
1753
ArraySubscriptExpr *LastArrayRef =
1753
- cast<ArraySubscriptExpr>(MemberExprBases[i ]);
1754
+ cast<ArraySubscriptExpr>(MemberExprBases[Idx ]);
1754
1755
Expr *LastIdx = LastArrayRef->getIdx ();
1755
1756
llvm::APSInt Result;
1756
1757
SemaRef.VerifyIntegerConstantExpression (LastIdx, &Result);
@@ -1775,12 +1776,17 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1775
1776
// a[0][0][1], the top of stack entries are ArraySubscriptExpressions for
1776
1777
// indices 0,0 and 1, with 1 on top.
1777
1778
int Dims = getDims ();
1778
- int NIndex = MemberExprBases.size () - 1 - (Dims - 1 );
1779
+
1780
+ // MemberExprBasesIdx is used to get the index of each dimension, in correct
1781
+ // order, from MemberExprBases. For example for a[0][0][1], getArrayIndex
1782
+ // will return 0, 0 and then 1.
1783
+ int MemberExprBasesIdx = (MemberExprBases.size () - 1 ) - (Dims - 1 );
1779
1784
for (int i = 0 ; i < Dims; ++i) {
1780
1785
InitializedEntity NewEntity = InitializedEntity::InitializeElement (
1781
- SemaRef.getASTContext (), getArrayIndex (NIndex), InitEntities.back ());
1786
+ SemaRef.getASTContext (), getArrayIndex (MemberExprBasesIdx),
1787
+ InitEntities.back ());
1782
1788
InitEntities.push_back (NewEntity);
1783
- ++NIndex ;
1789
+ ++MemberExprBasesIdx ;
1784
1790
}
1785
1791
1786
1792
InitializationKind InitKind =
@@ -1802,6 +1808,14 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1802
1808
Expr *ILE = new (SemaRef.getASTContext ())
1803
1809
InitListExpr (SemaRef.getASTContext (), SourceLocation (), ArrayInitExprs,
1804
1810
SourceLocation ());
1811
+
1812
+ // We need to find the type of the element for which we are generating the
1813
+ // InitListExpr. For example, for a multi-dimensional array say a[2][3][2],
1814
+ // the types for InitListExpr of the array and its 'sub-arrays' are -
1815
+ // int [2][3][2], int [3][2] and int [2]. This loop is used to obtain this
1816
+ // information from MemberExprBases. MemberExprBases holds
1817
+ // ArraySubscriptExprs and the top of stack shows how far we have descended
1818
+ // down the array. getDims() calculates this depth.
1805
1819
QualType ILEType = FD->getType ();
1806
1820
for (int i = getDims (); i > 1 ; i--) {
1807
1821
const ConstantArrayType *CAT =
@@ -2104,7 +2118,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2104
2118
class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
2105
2119
SYCLIntegrationHeader &Header;
2106
2120
int64_t CurOffset = 0 ;
2107
- llvm::SmallVector<size_t , 16 > ArrayBases ;
2121
+ llvm::SmallVector<size_t , 16 > ArrayBaseOffsets ;
2108
2122
int StructDepth = 0 ;
2109
2123
2110
2124
void addParam (const FieldDecl *FD, QualType ArgTy,
@@ -2252,19 +2266,19 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
2252
2266
}
2253
2267
2254
2268
bool enterArray () final {
2255
- ArrayBases .push_back (CurOffset);
2269
+ ArrayBaseOffsets .push_back (CurOffset);
2256
2270
return true ;
2257
2271
}
2258
2272
2259
2273
bool nextElement (QualType ET, int64_t Index) final {
2260
2274
int64_t Size = SemaRef.getASTContext ().getTypeSizeInChars (ET).getQuantity ();
2261
- CurOffset = ArrayBases .back () + Size * (Index + 1 );
2275
+ CurOffset = ArrayBaseOffsets .back () + Size * (Index);
2262
2276
return true ;
2263
2277
}
2264
2278
2265
2279
bool leaveArray (FieldDecl *, QualType ET, int64_t ) final {
2266
- CurOffset = ArrayBases .back ();
2267
- ArrayBases .pop_back ();
2280
+ CurOffset = ArrayBaseOffsets .back ();
2281
+ ArrayBaseOffsets .pop_back ();
2268
2282
return true ;
2269
2283
}
2270
2284
using SyclKernelFieldHandler::enterStruct;
0 commit comments