diff --git a/sycl/include/sycl/accessor.hpp b/sycl/include/sycl/accessor.hpp index 9d431533a0d1d..0b9e53ee83082 100644 --- a/sycl/include/sycl/accessor.hpp +++ b/sycl/include/sycl/accessor.hpp @@ -551,7 +551,7 @@ class __SYCL_EXPORT AccessorBaseHost { void *getMemoryObject() const; template - friend decltype(Obj::impl) getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -586,7 +586,8 @@ class __SYCL_EXPORT LocalAccessorBaseHost { protected: template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -844,7 +845,8 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor : friend class sycl::ext::intel::esimd::detail::AccessorPrivateProxy; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -2236,7 +2238,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base : } template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -2654,7 +2657,7 @@ class __SYCL_EBO host_accessor access::placeholder::false_t>{Impl} {} template - friend decltype(Obj::impl) getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); diff --git a/sycl/include/sycl/accessor_image.hpp b/sycl/include/sycl/accessor_image.hpp index 01415502e818a..420e3468d22ab 100644 --- a/sycl/include/sycl/accessor_image.hpp +++ b/sycl/include/sycl/accessor_image.hpp @@ -97,7 +97,8 @@ class __SYCL_EXPORT UnsampledImageAccessorBaseHost { protected: template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -167,7 +168,8 @@ class __SYCL_EXPORT SampledImageAccessorBaseHost { protected: template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -931,7 +933,8 @@ class __SYCL_EBO unsampled_image_accessor : } template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -1067,7 +1070,8 @@ class __SYCL_EBO host_unsampled_image_accessor : base_class{Impl} {} template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -1210,7 +1214,8 @@ class __SYCL_EBO sampled_image_accessor : } template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -1313,7 +1318,8 @@ class __SYCL_EBO host_sampled_image_accessor : base_class{Impl} {} template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); diff --git a/sycl/include/sycl/buffer.hpp b/sycl/include/sycl/buffer.hpp index acb6f223b6b02..752ac70878282 100644 --- a/sycl/include/sycl/buffer.hpp +++ b/sycl/include/sycl/buffer.hpp @@ -723,7 +723,8 @@ class buffer : public detail::buffer_plain, private: template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend class buffer; template { friend auto get_native(const SyclT &Obj) -> backend_return_t; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); - - template - friend typename std::add_pointer_t - detail::getRawSyclObjImpl(const T &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); diff --git a/sycl/include/sycl/detail/impl_utils.hpp b/sycl/include/sycl/detail/impl_utils.hpp index 17da417843541..fc5a297e20476 100644 --- a/sycl/include/sycl/detail/impl_utils.hpp +++ b/sycl/include/sycl/detail/impl_utils.hpp @@ -27,20 +27,12 @@ namespace detail { // would trigger that error in MSVC: // template // friend decltype(T::impl) detail::getSyclObjImpl(const T &SyclObject); -template decltype(Obj::impl) getSyclObjImpl(const Obj &SyclObject) { +template +const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject) { assert(SyclObject.impl && "every constructor should create an impl"); return SyclObject.impl; } -// Returns the raw pointer to the impl object of given face object. The caller -// must make sure the returned pointer is not captured in a field or otherwise -// stored - i.e. must live only as on-stack value. -template -typename std::add_pointer_t -getRawSyclObjImpl(const T &SyclObject) { - return SyclObject.impl.get(); -} - // Helper function for creation SYCL interface objects from implementations. // Note! This function relies on the fact that all SYCL interface classes // contain "impl" field that points to implementation object. "impl" field diff --git a/sycl/include/sycl/device.hpp b/sycl/include/sycl/device.hpp index 80bf15bd10583..355eb227e8b69 100644 --- a/sycl/include/sycl/device.hpp +++ b/sycl/include/sycl/device.hpp @@ -344,11 +344,8 @@ class __SYCL_EXPORT device : public detail::OwnerLessBase { pi_native_handle getNative() const; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); - - template - friend typename std::add_pointer_t - detail::getRawSyclObjImpl(const T &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); diff --git a/sycl/include/sycl/event.hpp b/sycl/include/sycl/event.hpp index a37a798d1086d..ded2794c6c603 100644 --- a/sycl/include/sycl/event.hpp +++ b/sycl/include/sycl/event.hpp @@ -145,7 +145,8 @@ class __SYCL_EXPORT event : public detail::OwnerLessBase { std::shared_ptr impl; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); diff --git a/sycl/include/sycl/ext/oneapi/bindless_images_memory.hpp b/sycl/include/sycl/ext/oneapi/bindless_images_memory.hpp index 72ecfc4f33b98..cb8c44020ab21 100644 --- a/sycl/include/sycl/ext/oneapi/bindless_images_memory.hpp +++ b/sycl/include/sycl/ext/oneapi/bindless_images_memory.hpp @@ -92,7 +92,7 @@ class __SYCL_EXPORT image_mem { std::shared_ptr impl; template - friend decltype(Obj::impl) + friend const decltype(Obj::impl) & sycl::detail::getSyclObjImpl(const Obj &SyclObject); }; diff --git a/sycl/include/sycl/ext/oneapi/experimental/graph.hpp b/sycl/include/sycl/ext/oneapi/experimental/graph.hpp index 62a772eb362d5..8b2b36f17401c 100644 --- a/sycl/include/sycl/ext/oneapi/experimental/graph.hpp +++ b/sycl/include/sycl/ext/oneapi/experimental/graph.hpp @@ -133,7 +133,7 @@ class __SYCL_EXPORT node { node(const std::shared_ptr &Impl) : impl(Impl) {} template - friend decltype(Obj::impl) + friend const decltype(Obj::impl) & sycl::detail::getSyclObjImpl(const Obj &SyclObject); template friend T sycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -342,7 +342,7 @@ class __SYCL_EXPORT modifiable_command_graph { void addGraphLeafDependencies(node Node); template - friend decltype(Obj::impl) + friend const decltype(Obj::impl) & sycl::detail::getSyclObjImpl(const Obj &SyclObject); template friend T sycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -380,7 +380,7 @@ class __SYCL_EXPORT executable_command_graph { const property_list &PropList = {}); template - friend decltype(Obj::impl) + friend const decltype(Obj::impl) & sycl::detail::getSyclObjImpl(const Obj &SyclObject); /// Creates a backend representation of the graph in \p impl member variable. @@ -442,7 +442,7 @@ class __SYCL_EXPORT dynamic_parameter_base { std::shared_ptr impl; template - friend decltype(Obj::impl) + friend const decltype(Obj::impl) & sycl::detail::getSyclObjImpl(const Obj &SyclObject); }; } // namespace detail diff --git a/sycl/include/sycl/ext/oneapi/virtual_mem/physical_mem.hpp b/sycl/include/sycl/ext/oneapi/virtual_mem/physical_mem.hpp index 24d371fe8c6fd..d5152716495d1 100644 --- a/sycl/include/sycl/ext/oneapi/virtual_mem/physical_mem.hpp +++ b/sycl/include/sycl/ext/oneapi/virtual_mem/physical_mem.hpp @@ -59,7 +59,7 @@ class __SYCL_EXPORT physical_mem std::shared_ptr impl; template - friend decltype(Obj::impl) + friend const decltype(Obj::impl) & sycl::detail::getSyclObjImpl(const Obj &SyclObject); template diff --git a/sycl/include/sycl/ext/oneapi/weak_object_base.hpp b/sycl/include/sycl/ext/oneapi/weak_object_base.hpp index 57e6aed30b0df..0a037d31f5fe8 100644 --- a/sycl/include/sycl/ext/oneapi/weak_object_base.hpp +++ b/sycl/include/sycl/ext/oneapi/weak_object_base.hpp @@ -63,8 +63,9 @@ template class weak_object_base { protected: #ifndef __SYCL_DEVICE_ONLY__ // Store a weak variant of the impl in the SYCLObjT. - typename decltype(sycl::detail::getSyclObjImpl( - std::declval()))::weak_type MObjWeakPtr; + typename std::remove_reference()))>::type::weak_type MObjWeakPtr; + // relies on from impl_utils.h static decltype(MObjWeakPtr) GetWeakImpl(const SYCLObjT &SYCLObj) { return sycl::detail::getSyclObjImpl(SYCLObj); diff --git a/sycl/include/sycl/handler.hpp b/sycl/include/sycl/handler.hpp index 188202c2f61e5..525185feb5601 100644 --- a/sycl/include/sycl/handler.hpp +++ b/sycl/include/sycl/handler.hpp @@ -3369,7 +3369,7 @@ class __SYCL_EXPORT handler { friend class ext::intel::experimental::pipe; template - friend decltype(Obj::impl) + friend const decltype(Obj::impl) & sycl::detail::getSyclObjImpl(const Obj &SyclObject); /// Read from a host pipe given a host address and diff --git a/sycl/include/sycl/image.hpp b/sycl/include/sycl/image.hpp index 09386f9e98064..3103231404f46 100644 --- a/sycl/include/sycl/image.hpp +++ b/sycl/include/sycl/image.hpp @@ -716,7 +716,8 @@ class image : public detail::unsampled_image_common { const context &TargetContext, event AvailableEvent); template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -1137,7 +1139,8 @@ class sampled_image private: template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); diff --git a/sycl/include/sycl/kernel.hpp b/sycl/include/sycl/kernel.hpp index dec5e9547a7ae..241e94aad6bcc 100644 --- a/sycl/include/sycl/kernel.hpp +++ b/sycl/include/sycl/kernel.hpp @@ -180,7 +180,8 @@ class __SYCL_EXPORT kernel : public detail::OwnerLessBase { std::shared_ptr impl; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); template diff --git a/sycl/include/sycl/kernel_bundle.hpp b/sycl/include/sycl/kernel_bundle.hpp index 99663183ad8d3..e3d893f25742f 100644 --- a/sycl/include/sycl/kernel_bundle.hpp +++ b/sycl/include/sycl/kernel_bundle.hpp @@ -75,7 +75,8 @@ class __SYCL_EXPORT kernel_id : public detail::OwnerLessBase { std::shared_ptr impl; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -110,7 +111,8 @@ class __SYCL_EXPORT device_image_plain { detail::DeviceImageImplPtr impl; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -141,7 +143,8 @@ class device_image : public detail::device_image_plain, : device_image_plain(std::move(Impl)) {} template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); @@ -415,7 +418,8 @@ class kernel_bundle : public detail::kernel_bundle_plain, : kernel_bundle_plain(std::move(Impl)) {} template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); diff --git a/sycl/include/sycl/platform.hpp b/sycl/include/sycl/platform.hpp index 7d174f18a291d..05d606790cb5e 100644 --- a/sycl/include/sycl/platform.hpp +++ b/sycl/include/sycl/platform.hpp @@ -239,7 +239,8 @@ class __SYCL_EXPORT platform : public detail::OwnerLessBase { template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); template friend auto get_native(const SyclObjectT &Obj) diff --git a/sycl/include/sycl/queue.hpp b/sycl/include/sycl/queue.hpp index edadeb454e453..d2b71787448b8 100644 --- a/sycl/include/sycl/queue.hpp +++ b/sycl/include/sycl/queue.hpp @@ -2678,7 +2678,7 @@ class __SYCL_EXPORT queue : public detail::OwnerLessBase { queue(std::shared_ptr impl) : impl(impl) {} template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl)& detail::getSyclObjImpl(const Obj &SyclObject); template friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj); diff --git a/sycl/include/sycl/sampler.hpp b/sycl/include/sycl/sampler.hpp index 4b37d8cddcf5a..c4d02ae5b8c39 100644 --- a/sycl/include/sycl/sampler.hpp +++ b/sycl/include/sycl/sampler.hpp @@ -125,7 +125,8 @@ class __SYCL_EXPORT __SYCL_SPECIAL_CLASS __SYCL_TYPE(sampler) sampler { #else std::shared_ptr impl; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); #endif template impl; template - friend decltype(Obj::impl) detail::getSyclObjImpl(const Obj &SyclObject); + friend const decltype(Obj::impl) & + detail::getSyclObjImpl(const Obj &SyclObject); #endif // NOTE: Some members are required for reconstructing the stream, but are not diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index 94e3e062a0d83..d3d9544ca5873 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -177,8 +177,8 @@ ProgramManager::createPIProgram(const RTDeviceBinaryImage &Img, const context &Context, const device &Device) { if (DbgProgMgr > 0) std::cerr << ">>> ProgramManager::createPIProgram(" << &Img << ", " - << getRawSyclObjImpl(Context) << ", " << getRawSyclObjImpl(Device) - << ")\n"; + << getSyclObjImpl(Context).get() << ", " + << getSyclObjImpl(Device).get() << ")\n"; const pi_device_binary_struct &RawImg = Img.getRawData(); // perform minimal sanity checks on the device image and the descriptor @@ -349,7 +349,7 @@ static void appendCompileOptionsFromImage(std::string &CompileOpts, appendCompileOptionsForGRFSizeProperties(CompileOpts, Img, isEsimdImage); - const auto &PlatformImpl = detail::getSyclObjImpl(Devs[0].get_platform()); + const auto PlatformImpl = detail::getSyclObjImpl(Devs[0].get_platform()); // Add optimization flags. auto str = getUint32PropAsOptStr(Img, "optLevel"); @@ -716,7 +716,7 @@ sycl::detail::pi::PiProgram ProgramManager::getBuiltPIProgram( } ProgramPtr BuiltProgram = build(std::move(ProgramManaged), ContextImpl, CompileOpts, LinkOpts, - getRawSyclObjImpl(Device)->getHandleRef(), DeviceLibReqMask, + getSyclObjImpl(Device).get()->getHandleRef(), DeviceLibReqMask, ProgramsToLink); // Those extra programs won't be used anymore, just the final linked result for (sycl::detail::pi::PiProgram Prg : ProgramsToLink) @@ -1152,8 +1152,9 @@ ProgramManager::getDeviceImage(const std::string &KernelName, bool JITCompilationIsRequired) { if (DbgProgMgr > 0) { std::cerr << ">>> ProgramManager::getDeviceImage(\"" << KernelName << "\", " - << getRawSyclObjImpl(Context) << ", " << getRawSyclObjImpl(Device) - << ", " << JITCompilationIsRequired << ")\n"; + << getSyclObjImpl(Context).get() << ", " + << getSyclObjImpl(Device).get() << ", " + << JITCompilationIsRequired << ")\n"; std::cerr << "available device images:\n"; debugPrintBinaryImages(); @@ -1202,8 +1203,9 @@ RTDeviceBinaryImage &ProgramManager::getDeviceImage( if (DbgProgMgr > 0) { std::cerr << ">>> ProgramManager::getDeviceImage(Custom SPV file " - << getRawSyclObjImpl(Context) << ", " << getRawSyclObjImpl(Device) - << ", " << JITCompilationIsRequired << ")\n"; + << getSyclObjImpl(Context).get() << ", " + << getSyclObjImpl(Device).get() << ", " + << JITCompilationIsRequired << ")\n"; std::cerr << "available device images:\n"; debugPrintBinaryImages(); @@ -2369,7 +2371,7 @@ device_image_plain ProgramManager::build(const device_image_plain &DeviceImage, std::vector ExtraProgramsToLink; ProgramPtr BuiltProgram = build(std::move(ProgramManaged), ContextImpl, CompileOpts, LinkOpts, - getRawSyclObjImpl(Devs[0])->getHandleRef(), DeviceLibReqMask, + getSyclObjImpl(Devs[0]).get()->getHandleRef(), DeviceLibReqMask, ExtraProgramsToLink); emitBuiltProgramInfo(BuiltProgram.get(), ContextImpl); @@ -2402,7 +2404,7 @@ device_image_plain ProgramManager::build(const device_image_plain &DeviceImage, uint32_t ImgId = Img.getImageID(); const sycl::detail::pi::PiDevice PiDevice = - getRawSyclObjImpl(Devs[0])->getHandleRef(); + getSyclObjImpl(Devs[0]).get()->getHandleRef(); auto CacheKey = std::make_pair(std::make_pair(std::move(SpecConsts), ImgId), PiDevice); @@ -2431,7 +2433,7 @@ device_image_plain ProgramManager::build(const device_image_plain &DeviceImage, // call to getOrBuild, so starting with "1" for (size_t Idx = 1; Idx < Devs.size(); ++Idx) { const sycl::detail::pi::PiDevice PiDeviceAdd = - getRawSyclObjImpl(Devs[Idx])->getHandleRef(); + getSyclObjImpl(Devs[Idx]).get()->getHandleRef(); // Change device in the cache key to reduce copying of spec const data. CacheKey.second = PiDeviceAdd;