@@ -1796,20 +1796,10 @@ class SyclKernelDecompMarker : public SyclKernelFieldHandler {
1796
1796
CollectionStack.back () = true ;
1797
1797
PointerStack.pop_back ();
1798
1798
} else if (PointerStack.pop_back_val ()) {
1799
- // FIXME: Stop triggering decomposition for non-trivial types with
1800
- // pointers
1801
- if (RD->isTrivial ()) {
1802
- PointerStack.back () = true ;
1803
- if (!RD->hasAttr <SYCLGenerateNewTypeAttr>())
1804
- RD->addAttr (
1805
- SYCLGenerateNewTypeAttr::CreateImplicit (SemaRef.getASTContext ()));
1806
- } else {
1807
- // We are visiting a non-trivial type with pointer.
1808
- CollectionStack.back () = true ;
1809
- if (!RD->hasAttr <SYCLRequiresDecompositionAttr>())
1810
- RD->addAttr (SYCLRequiresDecompositionAttr::CreateImplicit (
1811
- SemaRef.getASTContext ()));
1812
- }
1799
+ PointerStack.back () = true ;
1800
+ if (!RD->hasAttr <SYCLGenerateNewTypeAttr>())
1801
+ RD->addAttr (
1802
+ SYCLGenerateNewTypeAttr::CreateImplicit (SemaRef.getASTContext ()));
1813
1803
}
1814
1804
return true ;
1815
1805
}
@@ -2916,6 +2906,18 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2916
2906
Init.get ());
2917
2907
}
2918
2908
2909
+ void addBaseInit (const CXXBaseSpecifier &BS, QualType Ty,
2910
+ InitializationKind InitKind, MultiExprArg Args) {
2911
+ InitializedEntity Entity = InitializedEntity::InitializeBase (
2912
+ SemaRef.Context , &BS, /* IsInheritedVirtualBase*/ false , &VarEntity);
2913
+ InitializationSequence InitSeq (SemaRef, Entity, InitKind, Args);
2914
+ ExprResult Init = InitSeq.Perform (SemaRef, Entity, InitKind, Args);
2915
+
2916
+ InitListExpr *ParentILE = CollectionInitExprs.back ();
2917
+ ParentILE->updateInit (SemaRef.getASTContext (), ParentILE->getNumInits (),
2918
+ Init.get ());
2919
+ }
2920
+
2919
2921
void addSimpleBaseInit (const CXXBaseSpecifier &BS, QualType Ty) {
2920
2922
InitializationKind InitKind =
2921
2923
InitializationKind::CreateCopy (KernelCallerSrcLoc, KernelCallerSrcLoc);
@@ -2961,6 +2963,13 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2961
2963
false , SemaRef.CurFPFeatureOverrides ());
2962
2964
}
2963
2965
2966
+ Expr *createDerefOp (Expr *E) {
2967
+ return UnaryOperator::Create (SemaRef.Context , E, UO_Deref,
2968
+ E->getType ()->getPointeeType (),
2969
+ VK_LValue, OK_Ordinary, KernelCallerSrcLoc,
2970
+ false , SemaRef.CurFPFeatureOverrides ());
2971
+ }
2972
+
2964
2973
Expr *buildMemCpyCall (Expr *From, Expr *To, QualType T) {
2965
2974
// Compute the size of the memory buffer to be copied.
2966
2975
QualType SizeType = SemaRef.Context .getSizeType ();
@@ -2992,31 +3001,40 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2992
3001
return Call.getAs <Expr>();
2993
3002
}
2994
3003
2995
- // Adds default initializer for generated type and creates
2996
- // a call to __builtin_memcpy to initialize local clone from
2997
- // kernel argument.
2998
3004
void handleGeneratedType (FieldDecl *FD, QualType Ty) {
2999
- addFieldInit (FD, Ty, None,
3000
- InitializationKind::CreateDefault (KernelCallerSrcLoc));
3001
- addFieldMemberExpr (FD, Ty);
3002
- Expr *ParamRef = createGetAddressOf (createParamReferenceExpr ());
3003
- Expr *LocalCloneRef = createGetAddressOf (MemberExprBases.back ());
3004
- Expr *MemCpyCallExpr = buildMemCpyCall (ParamRef, LocalCloneRef, Ty);
3005
- BodyStmts.push_back (MemCpyCallExpr);
3006
- removeFieldMemberExpr (FD, Ty);
3005
+ // Equivalent of the following code is generated here:
3006
+ // void ocl_kernel(__generated_type GT) {
3007
+ // Kernel KernelObjClone { *(reinterpret_cast<UsersType*>(>)) };
3008
+ // }
3009
+
3010
+ Expr *ParamRef = createParamReferenceExpr ();
3011
+ Expr *ParamAddress = createGetAddressOf (ParamRef);
3012
+
3013
+ QualType ResultType = SemaRef.Context .getPointerType (Ty);
3014
+ TypeSourceInfo *TSI = SemaRef.Context .CreateTypeSourceInfo (ResultType);
3015
+ CXXReinterpretCastExpr *RCE = CXXReinterpretCastExpr::Create (
3016
+ SemaRef.Context , ResultType, VK_PRValue, CK_BitCast, ParamAddress,
3017
+ /* Path=*/ nullptr , TSI, SourceLocation (), SourceLocation (),
3018
+ SourceRange ());
3019
+ Expr *Initializer = createDerefOp (RCE);
3020
+ addFieldInit (FD, Ty, Initializer);
3007
3021
}
3008
3022
3009
- // Adds default initializer for generated base and creates
3010
- // a call to __builtin_memcpy to initialize the base of local clone
3011
- // from kernel argument.
3012
3023
void handleGeneratedType (const CXXRecordDecl *RD, const CXXBaseSpecifier &BS,
3013
3024
QualType Ty) {
3014
- addBaseInit (BS, Ty, InitializationKind::CreateDefault (KernelCallerSrcLoc));
3015
- Expr *ParamRef = createGetAddressOf (createParamReferenceExpr ());
3016
- Expr *LocalCloneRef = createGetAddressOf (MemberExprBases.back ());
3017
- LocalCloneRef = addDerivedToBaseCastExpr (RD, BS, LocalCloneRef);
3018
- Expr *MemCpyCallExpr = buildMemCpyCall (ParamRef, LocalCloneRef, Ty);
3019
- BodyStmts.push_back (MemCpyCallExpr);
3025
+ Expr *ParamRef = createParamReferenceExpr ();
3026
+ Expr *ParamAddress = createGetAddressOf (ParamRef);
3027
+
3028
+ QualType ResultType = SemaRef.Context .getPointerType (Ty);
3029
+ TypeSourceInfo *TSI = SemaRef.Context .CreateTypeSourceInfo (ResultType);
3030
+ CXXReinterpretCastExpr *RCE = CXXReinterpretCastExpr::Create (
3031
+ SemaRef.Context , ResultType, VK_PRValue, CK_BitCast, ParamAddress,
3032
+ /* Path=*/ nullptr , TSI, SourceLocation (), SourceLocation (),
3033
+ SourceRange ());
3034
+ Expr *Initializer = createDerefOp (RCE);
3035
+ InitializationKind InitKind =
3036
+ InitializationKind::CreateCopy (KernelCallerSrcLoc, KernelCallerSrcLoc);
3037
+ addBaseInit (BS, Ty, InitKind, Initializer);
3020
3038
}
3021
3039
3022
3040
MemberExpr *buildMemberExpr (Expr *Base, ValueDecl *Member) {
0 commit comments