Skip to content

Commit a108e93

Browse files
author
Alexander Batashev
authored
[SYCL][NFC] Add class layout ABI tests for memory objects (#2559)
1 parent eac16d8 commit a108e93

File tree

2 files changed

+194
-0
lines changed

2 files changed

+194
-0
lines changed

sycl/test/abi/layout_buffer.cpp

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// RUN: %clangxx -fsycl -c -fno-color-diagnostics -Xclang -fdump-record-layouts %s | FileCheck %s
2+
// REQUIRES: linux
3+
4+
// clang-format off
5+
6+
#include <CL/sycl/buffer.hpp>
7+
8+
void foo(sycl::buffer<int, 2>) {}
9+
// CHECK: 0 | class cl::sycl::detail::buffer_impl
10+
// CHECK-NEXT: 0 | class cl::sycl::detail::SYCLMemObjT (primary base)
11+
// CHECK-NEXT: 0 | class cl::sycl::detail::SYCLMemObjI (primary base)
12+
// CHECK-NEXT: 0 | (SYCLMemObjI vtable pointer)
13+
// CHECK-NEXT: 8 | class std::shared_ptr<struct cl::sycl::detail::MemObjRecord> MRecord
14+
// CHECK-NEXT: 8 | class std::__shared_ptr<struct cl::sycl::detail::MemObjRecord, __gnu_cxx::_S_atomic> (base)
15+
// CHECK-NEXT: 8 | class std::__shared_ptr_access<struct cl::sycl::detail::MemObjRecord, __gnu_cxx::_S_atomic, false, false> (base) (empty)
16+
// CHECK-NEXT: 8 | std::__shared_ptr<struct cl::sycl::detail::MemObjRecord, __gnu_cxx::_S_atomic>::element_type * _M_ptr
17+
// CHECK-NEXT: 16 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
18+
// CHECK-NEXT: 16 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
19+
// CHECK-NEXT: 24 | class std::unique_ptr<class cl::sycl::detail::SYCLMemObjAllocator, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> > MAllocator
20+
// CHECK: 24 | class std::__uniq_ptr_impl<class cl::sycl::detail::SYCLMemObjAllocator, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> >
21+
// CHECK-NEXT: 24 | class std::tuple<class cl::sycl::detail::SYCLMemObjAllocator *, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> > _M_t
22+
// CHECK-NEXT: 24 | struct std::_Tuple_impl<0, class cl::sycl::detail::SYCLMemObjAllocator *, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> > (base)
23+
// CHECK-NEXT: 24 | struct std::_Tuple_impl<1, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> > (base) (empty)
24+
// CHECK-NEXT: 24 | struct std::_Head_base<1, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator>, true> (base) (empty)
25+
// CHECK-NEXT: 24 | struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> (base) (empty)
26+
// CHECK-NEXT: 24 | struct std::_Head_base<0, class cl::sycl::detail::SYCLMemObjAllocator *, false> (base)
27+
// CHECK-NEXT: 24 | class cl::sycl::detail::SYCLMemObjAllocator * _M_head_impl
28+
// CHECK-NEXT: 32 | class cl::sycl::property_list MProps
29+
// CHECK-NEXT: 32 | class cl::sycl::detail::PropertyListBase (base)
30+
// CHECK-NEXT: 32 | class std::bitset<7> MDataLessProps
31+
// CHECK-NEXT: 32 | struct std::_Base_bitset<1> (base)
32+
// CHECK-NEXT: 32 | std::_Base_bitset<1>::_WordT _M_w
33+
// CHECK-NEXT: 40 | class std::vector<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > > MPropsWithData
34+
// CHECK-NEXT: 40 | struct std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > > (base)
35+
// CHECK-NEXT: 40 | struct std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > >::_Vector_impl _M_impl
36+
// CHECK-NEXT: 40 | class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > (base) (empty)
37+
// CHECK-NEXT: 40 | class __gnu_cxx::new_allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > (base) (empty)
38+
// CHECK: 40 | std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > >::pointer _M_start
39+
// CHECK-NEXT: 48 | std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > >::pointer _M_finish
40+
// CHECK-NEXT: 56 | std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > >::pointer _M_end_of_storage
41+
// CHECK-NEXT: 64 | class std::shared_ptr<class cl::sycl::detail::event_impl> MInteropEvent
42+
// CHECK-NEXT: 64 | class std::__shared_ptr<class cl::sycl::detail::event_impl, __gnu_cxx::_S_atomic> (base)
43+
// CHECK-NEXT: 64 | class std::__shared_ptr_access<class cl::sycl::detail::event_impl, __gnu_cxx::_S_atomic, false, false> (base) (empty)
44+
// CHECK-NEXT: 64 | std::__shared_ptr<class cl::sycl::detail::event_impl, __gnu_cxx::_S_atomic>::element_type * _M_ptr
45+
// CHECK-NEXT: 72 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
46+
// CHECK-NEXT: 72 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
47+
// CHECK-NEXT: 80 | class std::shared_ptr<class cl::sycl::detail::context_impl> MInteropContext
48+
// CHECK-NEXT: 80 | class std::__shared_ptr<class cl::sycl::detail::context_impl, __gnu_cxx::_S_atomic> (base)
49+
// CHECK-NEXT: 80 | class std::__shared_ptr_access<class cl::sycl::detail::context_impl, __gnu_cxx::_S_atomic, false, false> (base) (empty)
50+
// CHECK-NEXT: 80 | std::__shared_ptr<class cl::sycl::detail::context_impl, __gnu_cxx::_S_atomic>::element_type * _M_ptr
51+
// CHECK-NEXT: 88 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
52+
// CHECK-NEXT: 88 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
53+
// CHECK-NEXT: 96 | cl_mem MInteropMemObject
54+
// CHECK-NEXT: 104 | _Bool MOpenCLInterop
55+
// CHECK-NEXT: 105 | _Bool MHostPtrReadOnly
56+
// CHECK-NEXT: 106 | _Bool MNeedWriteBack
57+
// CHECK-NEXT: 112 | size_t MSizeInBytes
58+
// CHECK-NEXT: 120 | void * MUserPtr
59+
// CHECK-NEXT: 128 | void * MShadowCopy
60+
// CHECK-NEXT: 136 | class std::function<void (void)> MUploadDataFunctor
61+
// CHECK-NEXT: 136 | struct std::_Maybe_unary_or_binary_function<void> (base) (empty)
62+
// CHECK-NEXT: 136 | class std::_Function_base (base)
63+
// CHECK-NEXT: 136 | union std::_Any_data _M_functor
64+
// CHECK-NEXT: 136 | union std::_Nocopy_types _M_unused
65+
// CHECK-NEXT: 136 | void * _M_object
66+
// CHECK-NEXT: 136 | const void * _M_const_object
67+
// CHECK-NEXT: 136 | void (*)(void) _M_function_pointer
68+
// CHECK-NEXT: 136 | void (class std::_Undefined_class::*)(void) _M_member_pointer
69+
// CHECK-NEXT: 136 | char [16] _M_pod_data
70+
// CHECK-NEXT: 152 | std::_Function_base::_Manager_type _M_manager
71+
// CHECK-NEXT: 160 | std::function<void (void)>::_Invoker_type _M_invoker
72+
// CHECK-NEXT: 168 | class std::shared_ptr<const void> MSharedPtrStorage
73+
// CHECK-NEXT: 168 | class std::__shared_ptr<const void, __gnu_cxx::_S_atomic> (base)
74+
// CHECK-NEXT: 168 | class std::__shared_ptr_access<const void, __gnu_cxx::_S_atomic, false, true> (base) (empty)
75+
// CHECK-NEXT: 168 | std::__shared_ptr<const void, __gnu_cxx::_S_atomic>::element_type * _M_ptr
76+
// CHECK-NEXT: 176 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
77+
// CHECK-NEXT: 176 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
78+
// CHECK-NEXT: | [sizeof=184, dsize=184, align=8,
79+
// CHECK-NEXT: | nvsize=184, nvalign=8]
80+
81+
// CHECK: 0 | class cl::sycl::buffer<int, 2, class cl::sycl::detail::aligned_allocator<char>, void>
82+
// CHECK-NEXT: 0 | class std::shared_ptr<class cl::sycl::detail::buffer_impl> impl
83+
// CHECK-NEXT: 0 | class std::__shared_ptr<class cl::sycl::detail::buffer_impl, __gnu_cxx::_S_atomic> (base)
84+
// CHECK-NEXT: 0 | class std::__shared_ptr_access<class cl::sycl::detail::buffer_impl, __gnu_cxx::_S_atomic, false, false> (base) (empty)
85+
// CHECK-NEXT: 0 | std::__shared_ptr<class cl::sycl::detail::buffer_impl, __gnu_cxx::_S_atomic>::element_type * _M_ptr
86+
// CHECK-NEXT: 8 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
87+
// CHECK-NEXT: 8 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
88+
// CHECK-NEXT: 16 | class cl::sycl::range<2> Range
89+
// CHECK-NEXT: 16 | class cl::sycl::detail::array<2> (base)
90+
// CHECK-NEXT: 16 | size_t [2] common_array
91+
// CHECK-NEXT: 32 | size_t OffsetInBytes
92+
// CHECK-NEXT: 40 | _Bool IsSubBuffer
93+
// CHECK-NEXT: | [sizeof=48, dsize=41, align=8,
94+
// CHECK-NEXT: | nvsize=41, nvalign=8]

sycl/test/abi/layout_image.cpp

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// RUN: %clangxx -fsycl -c -fno-color-diagnostics -Xclang -fdump-record-layouts %s | FileCheck %s
2+
// REQUIRES: linux
3+
4+
// clang-format off
5+
6+
#include <CL/sycl/image.hpp>
7+
8+
sycl::image<2> Img{sycl::image_channel_order::rgba, sycl::image_channel_type::fp16, sycl::range<2>{10, 10}};
9+
10+
// CHECK: 0 | class cl::sycl::detail::image_impl<2>
11+
// CHECK-NEXT: 0 | class cl::sycl::detail::SYCLMemObjT (primary base)
12+
// CHECK-NEXT: 0 | class cl::sycl::detail::SYCLMemObjI (primary base)
13+
// CHECK-NEXT: 0 | (SYCLMemObjI vtable pointer)
14+
// CHECK-NEXT: 8 | class std::shared_ptr<struct cl::sycl::detail::MemObjRecord> MRecord
15+
// CHECK-NEXT: 8 | class std::__shared_ptr<struct cl::sycl::detail::MemObjRecord, __gnu_cxx::_S_atomic> (base)
16+
// CHECK-NEXT: 8 | class std::__shared_ptr_access<struct cl::sycl::detail::MemObjRecord, __gnu_cxx::_S_atomic, false, false> (base) (empty)
17+
// CHECK-NEXT: 8 | std::__shared_ptr<struct cl::sycl::detail::MemObjRecord, __gnu_cxx::_S_atomic>::element_type * _M_ptr
18+
// CHECK-NEXT: 16 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
19+
// CHECK-NEXT: 16 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
20+
// CHECK-NEXT: 24 | class std::unique_ptr<class cl::sycl::detail::SYCLMemObjAllocator, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> > MAllocator
21+
// CHECK: 24 | class std::__uniq_ptr_impl<class cl::sycl::detail::SYCLMemObjAllocator, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> >
22+
// CHECK-NEXT: 24 | class std::tuple<class cl::sycl::detail::SYCLMemObjAllocator *, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> > _M_t
23+
// CHECK-NEXT: 24 | struct std::_Tuple_impl<0, class cl::sycl::detail::SYCLMemObjAllocator *, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> > (base)
24+
// CHECK-NEXT: 24 | struct std::_Tuple_impl<1, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> > (base) (empty)
25+
// CHECK-NEXT: 24 | struct std::_Head_base<1, struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator>, true> (base) (empty)
26+
// CHECK-NEXT: 24 | struct std::default_delete<class cl::sycl::detail::SYCLMemObjAllocator> (base) (empty)
27+
// CHECK-NEXT: 24 | struct std::_Head_base<0, class cl::sycl::detail::SYCLMemObjAllocator *, false> (base)
28+
// CHECK-NEXT: 24 | class cl::sycl::detail::SYCLMemObjAllocator * _M_head_impl
29+
// CHECK-NEXT: 32 | class cl::sycl::property_list MProps
30+
// CHECK-NEXT: 32 | class cl::sycl::detail::PropertyListBase (base)
31+
// CHECK-NEXT: 32 | class std::bitset<7> MDataLessProps
32+
// CHECK-NEXT: 32 | struct std::_Base_bitset<1> (base)
33+
// CHECK-NEXT: 32 | std::_Base_bitset<1>::_WordT _M_w
34+
// CHECK-NEXT: 40 | class std::vector<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > > MPropsWithData
35+
// CHECK-NEXT: 40 | struct std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > > (base)
36+
// CHECK-NEXT: 40 | struct std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > >::_Vector_impl _M_impl
37+
// CHECK-NEXT: 40 | class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > (base) (empty)
38+
// CHECK-NEXT: 40 | class __gnu_cxx::new_allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > (base) (empty)
39+
// CHECK: 40 | std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > >::pointer _M_start
40+
// CHECK-NEXT: 48 | std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > >::pointer _M_finish
41+
// CHECK-NEXT: 56 | std::_Vector_base<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase>, class std::allocator<class std::shared_ptr<class cl::sycl::detail::PropertyWithDataBase> > >::pointer _M_end_of_storage
42+
// CHECK-NEXT: 64 | class std::shared_ptr<class cl::sycl::detail::event_impl> MInteropEvent
43+
// CHECK-NEXT: 64 | class std::__shared_ptr<class cl::sycl::detail::event_impl, __gnu_cxx::_S_atomic> (base)
44+
// CHECK-NEXT: 64 | class std::__shared_ptr_access<class cl::sycl::detail::event_impl, __gnu_cxx::_S_atomic, false, false> (base) (empty)
45+
// CHECK-NEXT: 64 | std::__shared_ptr<class cl::sycl::detail::event_impl, __gnu_cxx::_S_atomic>::element_type * _M_ptr
46+
// CHECK-NEXT: 72 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
47+
// CHECK-NEXT: 72 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
48+
// CHECK-NEXT: 80 | class std::shared_ptr<class cl::sycl::detail::context_impl> MInteropContext
49+
// CHECK-NEXT: 80 | class std::__shared_ptr<class cl::sycl::detail::context_impl, __gnu_cxx::_S_atomic> (base)
50+
// CHECK-NEXT: 80 | class std::__shared_ptr_access<class cl::sycl::detail::context_impl, __gnu_cxx::_S_atomic, false, false> (base) (empty)
51+
// CHECK-NEXT: 80 | std::__shared_ptr<class cl::sycl::detail::context_impl, __gnu_cxx::_S_atomic>::element_type * _M_ptr
52+
// CHECK-NEXT: 88 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
53+
// CHECK-NEXT: 88 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
54+
// CHECK-NEXT: 96 | cl_mem MInteropMemObject
55+
// CHECK-NEXT: 104 | _Bool MOpenCLInterop
56+
// CHECK-NEXT: 105 | _Bool MHostPtrReadOnly
57+
// CHECK-NEXT: 106 | _Bool MNeedWriteBack
58+
// CHECK-NEXT: 112 | size_t MSizeInBytes
59+
// CHECK-NEXT: 120 | void * MUserPtr
60+
// CHECK-NEXT: 128 | void * MShadowCopy
61+
// CHECK-NEXT: 136 | class std::function<void (void)> MUploadDataFunctor
62+
// CHECK-NEXT: 136 | struct std::_Maybe_unary_or_binary_function<void> (base) (empty)
63+
// CHECK-NEXT: 136 | class std::_Function_base (base)
64+
// CHECK-NEXT: 136 | union std::_Any_data _M_functor
65+
// CHECK-NEXT: 136 | union std::_Nocopy_types _M_unused
66+
// CHECK-NEXT: 136 | void * _M_object
67+
// CHECK-NEXT: 136 | const void * _M_const_object
68+
// CHECK-NEXT: 136 | void (*)(void) _M_function_pointer
69+
// CHECK-NEXT: 136 | void (class std::_Undefined_class::*)(void) _M_member_pointer
70+
// CHECK-NEXT: 136 | char [16] _M_pod_data
71+
// CHECK-NEXT: 152 | std::_Function_base::_Manager_type _M_manager
72+
// CHECK-NEXT: 160 | std::function<void (void)>::_Invoker_type _M_invoker
73+
// CHECK-NEXT: 168 | class std::shared_ptr<const void> MSharedPtrStorage
74+
// CHECK-NEXT: 168 | class std::__shared_ptr<const void, __gnu_cxx::_S_atomic> (base)
75+
// CHECK-NEXT: 168 | class std::__shared_ptr_access<const void, __gnu_cxx::_S_atomic, false, true> (base) (empty)
76+
// CHECK-NEXT: 168 | std::__shared_ptr<const void, __gnu_cxx::_S_atomic>::element_type * _M_ptr
77+
// CHECK-NEXT: 176 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
78+
// CHECK-NEXT: 176 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
79+
// CHECK-NEXT: 184 | _Bool MIsArrayImage
80+
// CHECK-NEXT: 192 | class cl::sycl::range<2> MRange
81+
// CHECK-NEXT: 192 | class cl::sycl::detail::array<2> (base)
82+
// CHECK-NEXT: 192 | size_t [2] common_array
83+
// CHECK-NEXT: 208 | enum cl::sycl::image_channel_order MOrder
84+
// CHECK-NEXT: 212 | enum cl::sycl::image_channel_type MType
85+
// CHECK-NEXT: 216 | uint8_t MNumChannels
86+
// CHECK-NEXT: 224 | size_t MElementSize
87+
// CHECK-NEXT: 232 | size_t MRowPitch
88+
// CHECK-NEXT: 240 | size_t MSlicePitch
89+
// CHECK-NEXT: | [sizeof=248, dsize=248, align=8,
90+
// CHECK-NEXT: | nvsize=248, nvalign=8]
91+
92+
// CHECK: 0 | class cl::sycl::image<2, class cl::sycl::detail::aligned_allocator<unsigned char> >
93+
// CHECK-NEXT: 0 | class std::shared_ptr<class cl::sycl::detail::image_impl<2> > impl
94+
// CHECK-NEXT: 0 | class std::__shared_ptr<class cl::sycl::detail::image_impl<2>, __gnu_cxx::_S_atomic> (base)
95+
// CHECK-NEXT: 0 | class std::__shared_ptr_access<class cl::sycl::detail::image_impl<2>, __gnu_cxx::_S_atomic, false, false> (base) (empty)
96+
// CHECK-NEXT: 0 | std::__shared_ptr<class cl::sycl::detail::image_impl<2>, __gnu_cxx::_S_atomic>::element_type * _M_ptr
97+
// CHECK-NEXT: 8 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount
98+
// CHECK-NEXT: 8 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi
99+
// CHECK-NEXT: | [sizeof=16, dsize=16, align=8,
100+
// CHECK-NEXT: | nvsize=16, nvalign=8]

0 commit comments

Comments
 (0)