From 6e35f8d753e12e88a61fec227c2d433db181c8ba Mon Sep 17 00:00:00 2001 From: "Larsen, Steffen" Date: Mon, 5 Dec 2022 07:46:06 -0800 Subject: [PATCH] [SYCL] Fix weak_object on Windows 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 --- sycl/include/sycl/accessor.hpp | 40 ++++++++++---------- sycl/include/sycl/detail/common.hpp | 8 ++++ sycl/include/sycl/ext/oneapi/weak_object.hpp | 2 + sycl/test/abi/sycl_symbols_windows.dump | 34 +++++++++++++++++ 4 files changed, 63 insertions(+), 21 deletions(-) diff --git a/sycl/include/sycl/accessor.hpp b/sycl/include/sycl/accessor.hpp index d34773d42d5fa..7e2de8127d5dc 100644 --- a/sycl/include/sycl/accessor.hpp +++ b/sycl/include/sycl/accessor.hpp @@ -506,8 +506,8 @@ class __SYCL_EXPORT AccessorBaseHost { template friend decltype(Obj::impl) getSyclObjImpl(const Obj &SyclObject); - template - friend Obj detail::createSyclObjFromImpl(decltype(Obj::impl) ImplObj); + template + friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); template @@ -541,8 +541,8 @@ class __SYCL_EXPORT LocalAccessorBaseHost { template friend decltype(Obj::impl) getSyclObjImpl(const Obj &SyclObject); - template - friend Obj detail::createSyclObjFromImpl(decltype(Obj::impl) ImplObj); + template + friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); LocalAccessorImplPtr impl; }; @@ -984,7 +984,7 @@ class __image_array_slice__ { template -class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor : +class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor : #ifndef __SYCL_DEVICE_ONLY__ public detail::AccessorBaseHost, #endif @@ -1229,8 +1229,8 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor : friend class sycl::stream; friend class sycl::ext::intel::esimd::detail::AccessorPrivateProxy; - template - friend Obj detail::createSyclObjFromImpl(decltype(Obj::impl) ImplObj); + template + friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); public: // 4.7.6.9.1. Interface for buffer command accessors @@ -2501,8 +2501,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base : return Result; } - template - friend Obj detail::createSyclObjFromImpl(decltype(Obj::impl) ImplObj); + template + friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); public: using value_type = DataT; @@ -2652,8 +2652,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base : // TODO: Remove deprecated specialization once no longer needed template -class __SYCL_SPECIAL_CLASS accessor +class __SYCL_EBO __SYCL_SPECIAL_CLASS accessor< + DataT, Dimensions, AccessMode, access::target::local, IsPlaceholder> : public local_accessor_base, public detail::OwnerLessBase< accessor -class __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor +class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor : public local_accessor_base, public detail::OwnerLessBase> { @@ -2785,9 +2785,8 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor /// \ingroup sycl_api_acc template -class __SYCL_SPECIAL_CLASS -__SYCL_TYPE(accessor) accessor +class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor< + DataT, Dimensions, AccessMode, access::target::image, IsPlaceholder> : public detail::image_accessor, public detail::OwnerLessBase< @@ -2851,8 +2850,8 @@ __SYCL_TYPE(accessor) accessor -class accessor +class __SYCL_EBO accessor : public detail::image_accessor, public detail::OwnerLessBase< @@ -2885,9 +2884,8 @@ class accessor -class __SYCL_SPECIAL_CLASS -__SYCL_TYPE(accessor) accessor +class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor< + DataT, Dimensions, AccessMode, access::target::image_array, IsPlaceholder> : public detail::image_accessor, public detail::OwnerLessBase< @@ -2945,7 +2943,7 @@ __SYCL_TYPE(accessor) accessor -class host_accessor +class __SYCL_EBO host_accessor : public accessor, public detail::OwnerLessBase< diff --git a/sycl/include/sycl/detail/common.hpp b/sycl/include/sycl/detail/common.hpp index 7505be44d5e84..2266bbbeec228 100644 --- a/sycl/include/sycl/detail/common.hpp +++ b/sycl/include/sycl/detail/common.hpp @@ -221,6 +221,14 @@ static inline std::string codeToString(pi_int32 code) { __SYCL_REPORT_ERR_TO_EXC_THROW_VIA_ERRC(X, ERRC) #endif +// Helper for enabling empty-base optimizations on MSVC. +// TODO: Remove this when MSVC has this optimization enabled by default. +#ifdef _MSC_VER +#define __SYCL_EBO __declspec(empty_bases) +#else +#define __SYCL_EBO +#endif + namespace sycl { __SYCL_INLINE_VER_NAMESPACE(_V1) { namespace detail { diff --git a/sycl/include/sycl/ext/oneapi/weak_object.hpp b/sycl/include/sycl/ext/oneapi/weak_object.hpp index fdd0ef140d430..97a192afd6328 100644 --- a/sycl/include/sycl/ext/oneapi/weak_object.hpp +++ b/sycl/include/sycl/ext/oneapi/weak_object.hpp @@ -12,6 +12,8 @@ #include #include +#include + namespace sycl { __SYCL_INLINE_VER_NAMESPACE(_V1) { namespace ext { diff --git a/sycl/test/abi/sycl_symbols_windows.dump b/sycl/test/abi/sycl_symbols_windows.dump index f05ccf9d78191..a3683f962a5a7 100644 --- a/sycl/test/abi/sycl_symbols_windows.dump +++ b/sycl/test/abi/sycl_symbols_windows.dump @@ -338,12 +338,14 @@ ??$has_property@Vuse_primary_context@cuda@context@property@_V1@sycl@@@image_plain@detail@_V1@sycl@@IEBA_NXZ ??$has_property@Vuse_primary_context@cuda@context@property@_V1@sycl@@@sampler@_V1@sycl@@QEBA_NXZ ??$has_property@Vuse_primary_context@cuda@context@property@_V1@sycl@@@stream@_V1@sycl@@QEBA_NXZ +??0AccessorBaseHost@detail@_V1@sycl@@IEAA@AEBV?$shared_ptr@VAccessorImplHost@detail@_V1@sycl@@@std@@@Z ??0AccessorBaseHost@detail@_V1@sycl@@QEAA@$$QEAV0123@@Z ??0AccessorBaseHost@detail@_V1@sycl@@QEAA@AEBV0123@@Z ??0AccessorBaseHost@detail@_V1@sycl@@QEAA@V?$id@$02@23@V?$range@$02@23@1W4mode@access@23@PEAXHHH_NAEBVproperty_list@23@@Z ??0AccessorImplHost@detail@_V1@sycl@@QEAA@AEBV0123@@Z ??0AccessorImplHost@detail@_V1@sycl@@QEAA@V?$id@$02@23@V?$range@$02@23@1W4mode@access@23@PEAXHHH_NAEBVproperty_list@23@@Z ??0HostProfilingInfo@detail@_V1@sycl@@QEAA@XZ +??0LocalAccessorBaseHost@detail@_V1@sycl@@IEAA@AEBV?$shared_ptr@VLocalAccessorImplHost@detail@_V1@sycl@@@std@@@Z ??0LocalAccessorBaseHost@detail@_V1@sycl@@QEAA@$$QEAV0123@@Z ??0LocalAccessorBaseHost@detail@_V1@sycl@@QEAA@AEBV0123@@Z ??0LocalAccessorBaseHost@detail@_V1@sycl@@QEAA@V?$range@$02@23@HHAEBVproperty_list@23@@Z @@ -553,6 +555,22 @@ ??1sampler_impl@detail@_V1@sycl@@QEAA@XZ ??1stream@_V1@sycl@@QEAA@XZ ??1stream_impl@detail@_V1@sycl@@QEAA@XZ +??4?$OwnerLessBase@Vcontext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vcontext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vqueue@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vqueue@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vstream@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vstream@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z ??4AccessorBaseHost@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z ??4AccessorBaseHost@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z ??4AccessorImplHost@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z @@ -794,6 +812,22 @@ ?ext_oneapi_barrier@handler@_V1@sycl@@QEAAXXZ ?ext_oneapi_empty@queue@_V1@sycl@@QEBA_NXZ ?ext_oneapi_get_default_context@platform@_V1@sycl@@QEBA?AVcontext@23@XZ +?ext_oneapi_owner_before@?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vdevice@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVdevice@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vevent@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVevent@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vcontext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVcontext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vcontext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vcontext@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVkernel@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vkernel@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vplatform@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVplatform@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vqueue@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vqueue@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vqueue@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVqueue@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVkernel_id@34@@Z +?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 +?ext_oneapi_owner_before@?$OwnerLessBase@Vstream@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vstream@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vstream@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVstream@34@@Z ?ext_oneapi_submit_barrier@queue@_V1@sycl@@QEAA?AVevent@23@AEBUcode_location@detail@23@@Z ?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 ?extractArgsAndReqs@handler@_V1@sycl@@AEAAXXZ