From a2e8b27e0a936181fa4fa6286d72f07bbb127853 Mon Sep 17 00:00:00 2001 From: Piotr Balcer Date: Thu, 25 Sep 2025 13:36:37 +0000 Subject: [PATCH] [Offload] Initialize all platforms before plugin device creation Devices store a raw pointer to back to their owning Platform. Platforms are stored directly inside of a vector. Modifying this vector risks invalidating all the platform pointers stored in devices. This change moves the host platform emplace to happen before device object creation, eliminating the risk of vector reallocation after platform pointers are set. --- offload/liboffload/src/OffloadImpl.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/offload/liboffload/src/OffloadImpl.cpp b/offload/liboffload/src/OffloadImpl.cpp index 08a2e25b97d85..0701ff12c4953 100644 --- a/offload/liboffload/src/OffloadImpl.cpp +++ b/offload/liboffload/src/OffloadImpl.cpp @@ -256,9 +256,18 @@ Error initPlugins(OffloadContext &Context) { pluginNameToBackend(#Name)}); \ } while (false); #include "Shared/Targets.def" + // Host platform must be added before initializing plugin devices because + // devices contain a pointer back to the owning platform, and modifying the + // Platforms vector risks reallocating the underlying storage, thus invalidating + // all the platform pointers. + Context.Platforms.emplace_back( + ol_platform_impl_t{nullptr, OL_PLATFORM_BACKEND_HOST}); // Preemptively initialize all devices in the plugin for (auto &Platform : Context.Platforms) { + if (Platform.BackendType == OL_PLATFORM_BACKEND_HOST) + continue; + auto Err = Platform.Plugin->init(); [[maybe_unused]] std::string InfoMsg = toString(std::move(Err)); for (auto DevNum = 0; DevNum < Platform.Plugin->number_of_devices(); @@ -273,10 +282,11 @@ Error initPlugins(OffloadContext &Context) { } } } + // The Context.Platforms cannot be modified after this point without updating + // all the Device.Platform pointers. // Add the special host device - auto &HostPlatform = Context.Platforms.emplace_back( - ol_platform_impl_t{nullptr, OL_PLATFORM_BACKEND_HOST}); + auto &HostPlatform = Context.Platforms.back(); HostPlatform.Devices.emplace_back( std::make_unique(-1, nullptr, nullptr, InfoTreeNode{})); Context.HostDevice()->Platform = &HostPlatform;