Skip to content

Commit 9297f63

Browse files
[SYCL] Fix weak_object on Windows (#7642)
This commit makes the following fixes for weak_object and order_less for Windows: 1. Adds the new ABI symbols. 2. Adds the missing include for std::optional in weak_object.hpp. 3. Fixes a problem where MSVC could not resolve createSyclObjFromImpl for accessors due to a mismatch in template argument names between the function declaration and the friend declaration. 4. Enables empty-base optimization on accessor classes inheriting from OwnerLessBase when compiling with MSVC. This is needed as otherwise it changes the size of the corresponding classes, which would be an ABI break. Signed-off-by: Larsen, Steffen <[email protected]>
1 parent 441bffe commit 9297f63

File tree

4 files changed

+63
-21
lines changed

4 files changed

+63
-21
lines changed

sycl/include/sycl/accessor.hpp

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,8 @@ class __SYCL_EXPORT AccessorBaseHost {
506506
template <class Obj>
507507
friend decltype(Obj::impl) getSyclObjImpl(const Obj &SyclObject);
508508

509-
template <class Obj>
510-
friend Obj detail::createSyclObjFromImpl(decltype(Obj::impl) ImplObj);
509+
template <class T>
510+
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
511511

512512
template <typename, int, access::mode, access::target, access::placeholder,
513513
typename>
@@ -541,8 +541,8 @@ class __SYCL_EXPORT LocalAccessorBaseHost {
541541
template <class Obj>
542542
friend decltype(Obj::impl) getSyclObjImpl(const Obj &SyclObject);
543543

544-
template <class Obj>
545-
friend Obj detail::createSyclObjFromImpl(decltype(Obj::impl) ImplObj);
544+
template <class T>
545+
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
546546

547547
LocalAccessorImplPtr impl;
548548
};
@@ -984,7 +984,7 @@ class __image_array_slice__ {
984984
template <typename DataT, int Dimensions, access::mode AccessMode,
985985
access::target AccessTarget, access::placeholder IsPlaceholder,
986986
typename PropertyListT>
987-
class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
987+
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
988988
#ifndef __SYCL_DEVICE_ONLY__
989989
public detail::AccessorBaseHost,
990990
#endif
@@ -1226,8 +1226,8 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
12261226
friend class sycl::stream;
12271227
friend class sycl::ext::intel::esimd::detail::AccessorPrivateProxy;
12281228

1229-
template <class Obj>
1230-
friend Obj detail::createSyclObjFromImpl(decltype(Obj::impl) ImplObj);
1229+
template <class T>
1230+
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
12311231

12321232
public:
12331233
// 4.7.6.9.1. Interface for buffer command accessors
@@ -2498,8 +2498,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
24982498
return Result;
24992499
}
25002500

2501-
template <class Obj>
2502-
friend Obj detail::createSyclObjFromImpl(decltype(Obj::impl) ImplObj);
2501+
template <class T>
2502+
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
25032503

25042504
public:
25052505
using value_type = DataT;
@@ -2649,8 +2649,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
26492649
// TODO: Remove deprecated specialization once no longer needed
26502650
template <typename DataT, int Dimensions, access::mode AccessMode,
26512651
access::placeholder IsPlaceholder>
2652-
class __SYCL_SPECIAL_CLASS accessor<DataT, Dimensions, AccessMode,
2653-
access::target::local, IsPlaceholder>
2652+
class __SYCL_EBO __SYCL_SPECIAL_CLASS accessor<
2653+
DataT, Dimensions, AccessMode, access::target::local, IsPlaceholder>
26542654
: public local_accessor_base<DataT, Dimensions, AccessMode, IsPlaceholder>,
26552655
public detail::OwnerLessBase<
26562656
accessor<DataT, Dimensions, AccessMode, access::target::local,
@@ -2687,7 +2687,7 @@ class __SYCL_SPECIAL_CLASS accessor<DataT, Dimensions, AccessMode,
26872687
};
26882688

26892689
template <typename DataT, int Dimensions = 1>
2690-
class __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor
2690+
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor
26912691
: public local_accessor_base<DataT, Dimensions, access::mode::read_write,
26922692
access::placeholder::false_t>,
26932693
public detail::OwnerLessBase<local_accessor<DataT, Dimensions>> {
@@ -2782,9 +2782,8 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor
27822782
/// \ingroup sycl_api_acc
27832783
template <typename DataT, int Dimensions, access::mode AccessMode,
27842784
access::placeholder IsPlaceholder>
2785-
class __SYCL_SPECIAL_CLASS
2786-
__SYCL_TYPE(accessor) accessor<DataT, Dimensions, AccessMode,
2787-
access::target::image, IsPlaceholder>
2785+
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor<
2786+
DataT, Dimensions, AccessMode, access::target::image, IsPlaceholder>
27882787
: public detail::image_accessor<DataT, Dimensions, AccessMode,
27892788
access::target::image, IsPlaceholder>,
27902789
public detail::OwnerLessBase<
@@ -2848,8 +2847,8 @@ __SYCL_TYPE(accessor) accessor<DataT, Dimensions, AccessMode,
28482847
/// \ingroup sycl_api_acc
28492848
template <typename DataT, int Dimensions, access::mode AccessMode,
28502849
access::placeholder IsPlaceholder>
2851-
class accessor<DataT, Dimensions, AccessMode, access::target::host_image,
2852-
IsPlaceholder>
2850+
class __SYCL_EBO accessor<DataT, Dimensions, AccessMode,
2851+
access::target::host_image, IsPlaceholder>
28532852
: public detail::image_accessor<DataT, Dimensions, AccessMode,
28542853
access::target::host_image, IsPlaceholder>,
28552854
public detail::OwnerLessBase<
@@ -2882,9 +2881,8 @@ class accessor<DataT, Dimensions, AccessMode, access::target::host_image,
28822881
/// \ingroup sycl_api_acc
28832882
template <typename DataT, int Dimensions, access::mode AccessMode,
28842883
access::placeholder IsPlaceholder>
2885-
class __SYCL_SPECIAL_CLASS
2886-
__SYCL_TYPE(accessor) accessor<DataT, Dimensions, AccessMode,
2887-
access::target::image_array, IsPlaceholder>
2884+
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor<
2885+
DataT, Dimensions, AccessMode, access::target::image_array, IsPlaceholder>
28882886
: public detail::image_accessor<DataT, Dimensions + 1, AccessMode,
28892887
access::target::image, IsPlaceholder>,
28902888
public detail::OwnerLessBase<
@@ -2942,7 +2940,7 @@ __SYCL_TYPE(accessor) accessor<DataT, Dimensions, AccessMode,
29422940

29432941
template <typename DataT, int Dimensions = 1,
29442942
access_mode AccessMode = access_mode::read_write>
2945-
class host_accessor
2943+
class __SYCL_EBO host_accessor
29462944
: public accessor<DataT, Dimensions, AccessMode, target::host_buffer,
29472945
access::placeholder::false_t>,
29482946
public detail::OwnerLessBase<

sycl/include/sycl/detail/common.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,14 @@ static inline std::string codeToString(pi_int32 code) {
221221
__SYCL_REPORT_ERR_TO_EXC_THROW_VIA_ERRC(X, ERRC)
222222
#endif
223223

224+
// Helper for enabling empty-base optimizations on MSVC.
225+
// TODO: Remove this when MSVC has this optimization enabled by default.
226+
#ifdef _MSC_VER
227+
#define __SYCL_EBO __declspec(empty_bases)
228+
#else
229+
#define __SYCL_EBO
230+
#endif
231+
224232
namespace sycl {
225233
__SYCL_INLINE_VER_NAMESPACE(_V1) {
226234
namespace detail {

sycl/include/sycl/ext/oneapi/weak_object.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include <sycl/detail/defines_elementary.hpp>
1313
#include <sycl/ext/oneapi/weak_object_base.hpp>
1414

15+
#include <optional>
16+
1517
namespace sycl {
1618
__SYCL_INLINE_VER_NAMESPACE(_V1) {
1719
namespace ext {

sycl/test/abi/sycl_symbols_windows.dump

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,12 +338,14 @@
338338
??$has_property@Vuse_primary_context@cuda@context@property@_V1@sycl@@@image_plain@detail@_V1@sycl@@IEBA_NXZ
339339
??$has_property@Vuse_primary_context@cuda@context@property@_V1@sycl@@@sampler@_V1@sycl@@QEBA_NXZ
340340
??$has_property@Vuse_primary_context@cuda@context@property@_V1@sycl@@@stream@_V1@sycl@@QEBA_NXZ
341+
??0AccessorBaseHost@detail@_V1@sycl@@IEAA@AEBV?$shared_ptr@VAccessorImplHost@detail@_V1@sycl@@@std@@@Z
341342
??0AccessorBaseHost@detail@_V1@sycl@@QEAA@$$QEAV0123@@Z
342343
??0AccessorBaseHost@detail@_V1@sycl@@QEAA@AEBV0123@@Z
343344
??0AccessorBaseHost@detail@_V1@sycl@@QEAA@V?$id@$02@23@V?$range@$02@23@1W4mode@access@23@PEAXHHH_NAEBVproperty_list@23@@Z
344345
??0AccessorImplHost@detail@_V1@sycl@@QEAA@AEBV0123@@Z
345346
??0AccessorImplHost@detail@_V1@sycl@@QEAA@V?$id@$02@23@V?$range@$02@23@1W4mode@access@23@PEAXHHH_NAEBVproperty_list@23@@Z
346347
??0HostProfilingInfo@detail@_V1@sycl@@QEAA@XZ
348+
??0LocalAccessorBaseHost@detail@_V1@sycl@@IEAA@AEBV?$shared_ptr@VLocalAccessorImplHost@detail@_V1@sycl@@@std@@@Z
347349
??0LocalAccessorBaseHost@detail@_V1@sycl@@QEAA@$$QEAV0123@@Z
348350
??0LocalAccessorBaseHost@detail@_V1@sycl@@QEAA@AEBV0123@@Z
349351
??0LocalAccessorBaseHost@detail@_V1@sycl@@QEAA@V?$range@$02@23@HHAEBVproperty_list@23@@Z
@@ -553,6 +555,22 @@
553555
??1sampler_impl@detail@_V1@sycl@@QEAA@XZ
554556
??1stream@_V1@sycl@@QEAA@XZ
555557
??1stream_impl@detail@_V1@sycl@@QEAA@XZ
558+
??4?$OwnerLessBase@Vcontext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
559+
??4?$OwnerLessBase@Vcontext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
560+
??4?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
561+
??4?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
562+
??4?$OwnerLessBase@Vqueue@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
563+
??4?$OwnerLessBase@Vqueue@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
564+
??4?$OwnerLessBase@Vstream@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
565+
??4?$OwnerLessBase@Vstream@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
566+
??4?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
567+
??4?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
568+
??4?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
569+
??4?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
570+
??4?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
571+
??4?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
572+
??4?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
573+
??4?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
556574
??4AccessorBaseHost@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z
557575
??4AccessorBaseHost@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
558576
??4AccessorImplHost@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z
@@ -794,6 +812,22 @@
794812
?ext_oneapi_barrier@handler@_V1@sycl@@QEAAXXZ
795813
?ext_oneapi_empty@queue@_V1@sycl@@QEBA_NXZ
796814
?ext_oneapi_get_default_context@platform@_V1@sycl@@QEBA?AVcontext@23@XZ
815+
?ext_oneapi_owner_before@?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vdevice@_V1@sycl@@@2oneapi@ext@34@@Z
816+
?ext_oneapi_owner_before@?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVdevice@34@@Z
817+
?ext_oneapi_owner_before@?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vevent@_V1@sycl@@@2oneapi@ext@34@@Z
818+
?ext_oneapi_owner_before@?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVevent@34@@Z
819+
?ext_oneapi_owner_before@?$OwnerLessBase@Vcontext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVcontext@34@@Z
820+
?ext_oneapi_owner_before@?$OwnerLessBase@Vcontext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vcontext@_V1@sycl@@@2oneapi@ext@34@@Z
821+
?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVkernel@34@@Z
822+
?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vkernel@_V1@sycl@@@2oneapi@ext@34@@Z
823+
?ext_oneapi_owner_before@?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vplatform@_V1@sycl@@@2oneapi@ext@34@@Z
824+
?ext_oneapi_owner_before@?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVplatform@34@@Z
825+
?ext_oneapi_owner_before@?$OwnerLessBase@Vqueue@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vqueue@_V1@sycl@@@2oneapi@ext@34@@Z
826+
?ext_oneapi_owner_before@?$OwnerLessBase@Vqueue@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVqueue@34@@Z
827+
?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVkernel_id@34@@Z
828+
?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vkernel_id@_V1@sycl@@@2oneapi@ext@34@@Z
829+
?ext_oneapi_owner_before@?$OwnerLessBase@Vstream@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vstream@_V1@sycl@@@2oneapi@ext@34@@Z
830+
?ext_oneapi_owner_before@?$OwnerLessBase@Vstream@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVstream@34@@Z
797831
?ext_oneapi_submit_barrier@queue@_V1@sycl@@QEAA?AVevent@23@AEBUcode_location@detail@23@@Z
798832
?ext_oneapi_submit_barrier@queue@_V1@sycl@@QEAA?AVevent@23@AEBV?$vector@Vevent@_V1@sycl@@V?$allocator@Vevent@_V1@sycl@@@std@@@std@@AEBUcode_location@detail@23@@Z
799833
?extractArgsAndReqs@handler@_V1@sycl@@AEAAXXZ

0 commit comments

Comments
 (0)