@@ -971,20 +971,25 @@ llvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty,
971
971
auto *DescTy = DBuilder.createPointerType (EltTy, Size );
972
972
973
973
FieldOffset = 0 ;
974
- FType = CGM.getContext ().getPointerType (CGM.getContext ().VoidTy );
975
- EltTys.push_back (CreateMemberType (Unit, FType, " __isa" , &FieldOffset));
976
- FType = CGM.getContext ().IntTy ;
977
- EltTys.push_back (CreateMemberType (Unit, FType, " __flags" , &FieldOffset));
978
- EltTys.push_back (CreateMemberType (Unit, FType, " __reserved" , &FieldOffset));
979
- FType = CGM.getContext ().getPointerType (Ty->getPointeeType ());
980
- EltTys.push_back (CreateMemberType (Unit, FType, " __FuncPtr" , &FieldOffset));
981
-
982
- FType = CGM.getContext ().getPointerType (CGM.getContext ().VoidTy );
983
- FieldSize = CGM.getContext ().getTypeSize (Ty);
984
- FieldAlign = CGM.getContext ().getTypeAlign (Ty);
985
- EltTys.push_back (DBuilder.createMemberType (
986
- Unit, " __descriptor" , nullptr , LineNo, FieldSize, FieldAlign, FieldOffset,
987
- llvm::DINode::FlagZero, DescTy));
974
+ if (CGM.getLangOpts ().OpenCL ) {
975
+ FType = CGM.getContext ().IntTy ;
976
+ EltTys.push_back (CreateMemberType (Unit, FType, " __size" , &FieldOffset));
977
+ EltTys.push_back (CreateMemberType (Unit, FType, " __align" , &FieldOffset));
978
+ } else {
979
+ FType = CGM.getContext ().getPointerType (CGM.getContext ().VoidTy );
980
+ EltTys.push_back (CreateMemberType (Unit, FType, " __isa" , &FieldOffset));
981
+ FType = CGM.getContext ().IntTy ;
982
+ EltTys.push_back (CreateMemberType (Unit, FType, " __flags" , &FieldOffset));
983
+ EltTys.push_back (CreateMemberType (Unit, FType, " __reserved" , &FieldOffset));
984
+ FType = CGM.getContext ().getPointerType (Ty->getPointeeType ());
985
+ EltTys.push_back (CreateMemberType (Unit, FType, " __FuncPtr" , &FieldOffset));
986
+ FType = CGM.getContext ().getPointerType (CGM.getContext ().VoidTy );
987
+ FieldSize = CGM.getContext ().getTypeSize (Ty);
988
+ FieldAlign = CGM.getContext ().getTypeAlign (Ty);
989
+ EltTys.push_back (DBuilder.createMemberType (
990
+ Unit, " __descriptor" , nullptr , LineNo, FieldSize, FieldAlign, FieldOffset,
991
+ llvm::DINode::FlagZero, DescTy));
992
+ }
988
993
989
994
FieldOffset += FieldSize;
990
995
Elements = DBuilder.getOrCreateArray (EltTys);
@@ -3847,26 +3852,35 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
3847
3852
CGM.getDataLayout ().getStructLayout (block.StructureType );
3848
3853
3849
3854
SmallVector<llvm::Metadata *, 16 > fields;
3850
- fields.push_back (createFieldType (" __isa" , C.VoidPtrTy , loc, AS_public,
3851
- blockLayout->getElementOffsetInBits (0 ),
3852
- tunit, tunit));
3853
- fields.push_back (createFieldType (" __flags" , C.IntTy , loc, AS_public,
3854
- blockLayout->getElementOffsetInBits (1 ),
3855
- tunit, tunit));
3856
- fields.push_back (createFieldType (" __reserved" , C.IntTy , loc, AS_public,
3857
- blockLayout->getElementOffsetInBits (2 ),
3858
- tunit, tunit));
3859
- auto *FnTy = block.getBlockExpr ()->getFunctionType ();
3860
- auto FnPtrType = CGM.getContext ().getPointerType (FnTy->desugar ());
3861
- fields.push_back (createFieldType (" __FuncPtr" , FnPtrType, loc, AS_public,
3862
- blockLayout->getElementOffsetInBits (3 ),
3863
- tunit, tunit));
3864
- fields.push_back (createFieldType (
3865
- " __descriptor" ,
3866
- C.getPointerType (block.NeedsCopyDispose
3867
- ? C.getBlockDescriptorExtendedType ()
3868
- : C.getBlockDescriptorType ()),
3869
- loc, AS_public, blockLayout->getElementOffsetInBits (4 ), tunit, tunit));
3855
+ if (CGM.getLangOpts ().OpenCL ) {
3856
+ fields.push_back (createFieldType (" __size" , C.IntTy , loc, AS_public,
3857
+ blockLayout->getElementOffsetInBits (0 ),
3858
+ tunit, tunit));
3859
+ fields.push_back (createFieldType (" __align" , C.IntTy , loc, AS_public,
3860
+ blockLayout->getElementOffsetInBits (1 ),
3861
+ tunit, tunit));
3862
+ } else {
3863
+ fields.push_back (createFieldType (" __isa" , C.VoidPtrTy , loc, AS_public,
3864
+ blockLayout->getElementOffsetInBits (0 ),
3865
+ tunit, tunit));
3866
+ fields.push_back (createFieldType (" __flags" , C.IntTy , loc, AS_public,
3867
+ blockLayout->getElementOffsetInBits (1 ),
3868
+ tunit, tunit));
3869
+ fields.push_back (createFieldType (" __reserved" , C.IntTy , loc, AS_public,
3870
+ blockLayout->getElementOffsetInBits (2 ),
3871
+ tunit, tunit));
3872
+ auto *FnTy = block.getBlockExpr ()->getFunctionType ();
3873
+ auto FnPtrType = CGM.getContext ().getPointerType (FnTy->desugar ());
3874
+ fields.push_back (createFieldType (" __FuncPtr" , FnPtrType, loc, AS_public,
3875
+ blockLayout->getElementOffsetInBits (3 ),
3876
+ tunit, tunit));
3877
+ fields.push_back (createFieldType (
3878
+ " __descriptor" ,
3879
+ C.getPointerType (block.NeedsCopyDispose
3880
+ ? C.getBlockDescriptorExtendedType ()
3881
+ : C.getBlockDescriptorType ()),
3882
+ loc, AS_public, blockLayout->getElementOffsetInBits (4 ), tunit, tunit));
3883
+ }
3870
3884
3871
3885
// We want to sort the captures by offset, not because DWARF
3872
3886
// requires this, but because we're paranoid about debuggers.
0 commit comments