[llvm-branch-commits] [llvm] [offload][omp] Load and resolve device binaries through liboffload (PR #221947)
Alex Duran via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Sep 8 03:05:42 PDT 2026
https://github.com/adurang created https://github.com/llvm/llvm-project/pull/221947
Migrate DeviceTy::loadBinary and global/kernel symbol resolution off
GenericPluginTy::load_binary/get_global/get_function onto liboffload's
Program/Symbol API, encapsulated in a new ProgramTy abstraction that wraps
an ol_program_handle_t. Kernel symbol resolution still needs the plugin's
opaque GenericKernelTy* handle for the legacy launch path, obtained via a
temporary __ol_tgt_GetKernelFromSymbol helper rather than new public
liboffload API surface. Removes the now-dead __tgt_device_binary type and
the corresponding GenericPluginTy methods and exports entries.
---
<sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>
>From 781848dfd0a6df08592fd8f40379537b95045463 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Tue, 8 Sep 2026 03:00:05 -0700
Subject: [PATCH] [offload][omp] Load and resolve device binaries through
liboffload
Migrate DeviceTy::loadBinary and global/kernel symbol resolution off
GenericPluginTy::load_binary/get_global/get_function onto liboffload's
Program/Symbol API, encapsulated in a new ProgramTy abstraction that wraps
an ol_program_handle_t. Kernel symbol resolution still needs the plugin's
opaque GenericKernelTy* handle for the legacy launch path, obtained via a
temporary __ol_tgt_GetKernelFromSymbol helper rather than new public
liboffload API surface. Removes the now-dead __tgt_device_binary type and
the corresponding GenericPluginTy methods and exports entries.
---
offload/include/Program.h | 47 ++++++++++++
offload/include/Shared/APITypes.h | 5 --
offload/include/device.h | 10 ++-
offload/liboffload/exports | 4 +-
offload/liboffload/src/OffloadImpl.cpp | 4 +
offload/libompaccsupport/PluginManager.cpp | 30 +++++---
offload/libompaccsupport/Program.cpp | 69 ++++++++++++++++++
offload/libompaccsupport/device.cpp | 65 +++++++++++------
offload/libomptarget/CMakeLists.txt | 1 +
.../common/include/PluginInterface.h | 12 ---
.../common/src/PluginInterface.cpp | 73 -------------------
11 files changed, 194 insertions(+), 126 deletions(-)
create mode 100644 offload/include/Program.h
create mode 100644 offload/libompaccsupport/Program.cpp
diff --git a/offload/include/Program.h b/offload/include/Program.h
new file mode 100644
index 0000000000000..6d2f361071ea7
--- /dev/null
+++ b/offload/include/Program.h
@@ -0,0 +1,47 @@
+//===------------ Program.h - liboffload program abstraction ------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Declares ProgramTy, which wraps a liboffload program handle (a device
+// image loaded via olCreateProgram) along with the routines used to resolve
+// its global-variable and kernel symbols.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _OMPTARGET_PROGRAM_H
+#define _OMPTARGET_PROGRAM_H
+
+#include "OffloadAPI.h"
+#include "Shared/APITypes.h"
+#include "llvm/Support/Error.h"
+
+class ProgramTy {
+public:
+ ProgramTy() = default;
+
+ /// Load \p Img onto \p Device within \p Context via liboffload.
+ static llvm::Expected<ProgramTy> create(ol_context_handle_t Context,
+ ol_device_handle_t Device,
+ __tgt_device_image *Img);
+
+ /// Resolve the device address of the global variable \p Name. If \p Size
+ /// is non-null, it is set to the size in bytes of the global
+ llvm::Expected<void *> getGlobalAddress(const char *Name,
+ size_t *Size = nullptr) const;
+
+ /// Resolve the opaque plugin kernel handle for the kernel \p Name.
+ llvm::Expected<void *> getKernelAddress(const char *Name) const;
+
+ ol_program_handle_t getHandle() const { return Handle; }
+
+private:
+ explicit ProgramTy(ol_program_handle_t Handle) : Handle(Handle) {}
+
+ ol_program_handle_t Handle = nullptr;
+};
+
+#endif
diff --git a/offload/include/Shared/APITypes.h b/offload/include/Shared/APITypes.h
index 7a151ab4ee612..d07b3f96f0b3d 100644
--- a/offload/include/Shared/APITypes.h
+++ b/offload/include/Shared/APITypes.h
@@ -62,11 +62,6 @@ struct __tgt_target_table {
*EntriesEnd; // End of the table with all the entries (non inclusive)
};
-/// This struct contains a handle to a loaded binary in the plugin device.
-struct __tgt_device_binary {
- uintptr_t handle;
-};
-
// clang-format on
/// This struct contains information exchanged between different asynchronous
diff --git a/offload/include/device.h b/offload/include/device.h
index 61baf3252ed67..5d04eabf00f05 100644
--- a/offload/include/device.h
+++ b/offload/include/device.h
@@ -36,6 +36,7 @@
#include "GlobalHandler.h"
#include "OffloadAPI.h"
#include "PluginInterface.h"
+#include "Program.h"
using GenericPluginTy = llvm::omp::target::plugin::GenericPluginTy;
using DeviceInfo = llvm::omp::target::plugin::DeviceInfo;
@@ -69,7 +70,8 @@ struct DeviceTy {
/// Provide access to the mapping handler.
MappingInfoTy &getMappingInfo() { return MappingInfo; }
- llvm::Expected<__tgt_device_binary> loadBinary(__tgt_device_image *Img);
+ /// Load \p Img onto the device and return the resulting program.
+ llvm::Expected<ProgramTy> loadBinary(__tgt_device_image *Img);
// device memory allocation/deallocation routines
/// Allocates \p Size bytes on the device, host or shared memory space
@@ -194,4 +196,10 @@ struct DeviceTy {
bool HasPendingImages = true;
};
+/// Resolve the device address of the global variable \p Name in \p Program,
+/// recording it for kernel record/replay if recording is currently active.
+llvm::Expected<void *> getAndRecordGlobalAddress(DeviceTy &Device,
+ const ProgramTy &Program,
+ const char *Name);
+
#endif
diff --git a/offload/liboffload/exports b/offload/liboffload/exports
index f7f85e452af80..97df65cfd3ccf 100644
--- a/offload/liboffload/exports
+++ b/offload/liboffload/exports
@@ -16,13 +16,10 @@ global:
"llvm::omp::target::plugin::GenericPluginTy::data_notify_unmapped(int, void*)";
"llvm::omp::target::plugin::GenericPluginTy::data_unlock(int, void*)";
"llvm::omp::target::plugin::GenericPluginTy::flush_queue(omp_interop_val_t*)";
- "llvm::omp::target::plugin::GenericPluginTy::get_function(__tgt_device_binary, char const*, void**)";
- "llvm::omp::target::plugin::GenericPluginTy::get_global(__tgt_device_binary, unsigned long, char const*, void**)";
"llvm::omp::target::plugin::GenericPluginTy::initialize_record_replay(int, long, void*, bool, bool, bool, bool, char const*, char const*)";
"llvm::omp::target::plugin::GenericPluginTy::is_data_exchangable(int, int)";
"llvm::omp::target::plugin::GenericPluginTy::is_initialized() const";
"llvm::omp::target::plugin::GenericPluginTy::launch_kernel(int, void*, llvm::omp::target::plugin::KernelLaunchArgsTy&, __tgt_async_info*)";
- "llvm::omp::target::plugin::GenericPluginTy::load_binary(int, __tgt_device_image*, __tgt_device_binary*)";
"llvm::omp::target::plugin::GenericPluginTy::number_of_devices()";
"llvm::omp::target::plugin::GenericPluginTy::release_interop(int, omp_interop_val_t*)";
"llvm::omp::target::plugin::GenericPluginTy::set_device_identifier(int, int)";
@@ -36,6 +33,7 @@ global:
__ol_tgt_GetPluginFromPlatform;
__ol_tgt_GetPluginDeviceId;
__ol__tgt_GetAsyncInfoFromQueue;
+ __ol_tgt_GetKernelFromSymbol;
};
local:
*;
diff --git a/offload/liboffload/src/OffloadImpl.cpp b/offload/liboffload/src/OffloadImpl.cpp
index 16e1c40d273e8..25de20adcd8eb 100644
--- a/offload/liboffload/src/OffloadImpl.cpp
+++ b/offload/liboffload/src/OffloadImpl.cpp
@@ -1706,5 +1706,9 @@ __ol__tgt_GetAsyncInfoFromQueue(ol_queue_handle_t Queue) {
return Queue->AsyncInfo;
}
+extern "C" void *__ol_tgt_GetKernelFromSymbol(ol_symbol_handle_t Symbol) {
+ return std::get<GenericKernelTy *>(Symbol->PluginImpl);
+}
+
} // namespace offload
} // namespace llvm
diff --git a/offload/libompaccsupport/PluginManager.cpp b/offload/libompaccsupport/PluginManager.cpp
index d20d4ec260958..d52e2a333e519 100644
--- a/offload/libompaccsupport/PluginManager.cpp
+++ b/offload/libompaccsupport/PluginManager.cpp
@@ -474,8 +474,8 @@ static int loadImagesOntoDevice(DeviceTy &Device) {
}
// 2) Load the image onto the given device.
- auto BinaryOrErr = Device.loadBinary(Img);
- if (llvm::Error Err = BinaryOrErr.takeError()) {
+ auto LoadedOrErr = Device.loadBinary(Img);
+ if (llvm::Error Err = LoadedOrErr.takeError()) {
REPORT() << "Failed to load image " << llvm::toString(std::move(Err));
Rc = OFFLOAD_FAIL;
break;
@@ -489,14 +489,20 @@ static int loadImagesOntoDevice(DeviceTy &Device) {
if (Entry.Kind != object::OffloadKind::OFK_OpenMP)
continue;
- __tgt_device_binary &Binary = *BinaryOrErr;
+ ProgramTy &Program = *LoadedOrErr;
llvm::offloading::EntryTy DeviceEntry = Entry;
if (Entry.Size) {
- if (!(Entry.Flags & OMP_DECLARE_TARGET_INDIRECT_VTABLE))
- if (Device.RTL->get_global(Binary, Entry.Size, Entry.SymbolName,
- &DeviceEntry.Address) != OFFLOAD_SUCCESS)
- REPORT() << "Failed to load symbol " << Entry.SymbolName;
+ if (!(Entry.Flags & OMP_DECLARE_TARGET_INDIRECT_VTABLE)) {
+ auto AddrOrErr =
+ getAndRecordGlobalAddress(Device, Program, Entry.SymbolName);
+ if (!AddrOrErr) {
+ REPORT() << "Failed to load symbol " << Entry.SymbolName << ": "
+ << llvm::toString(AddrOrErr.takeError());
+ } else {
+ DeviceEntry.Address = *AddrOrErr;
+ }
+ }
// If unified memory is active, the corresponding global is a device
// reference to the host global. We need to initialize the pointer on
@@ -511,9 +517,13 @@ static int loadImagesOntoDevice(DeviceTy &Device) {
REPORT() << "Failed to write symbol for USM " << Entry.SymbolName;
}
} else if (Entry.Address) {
- if (Device.RTL->get_function(Binary, Entry.SymbolName,
- &DeviceEntry.Address) != OFFLOAD_SUCCESS)
- REPORT() << "Failed to load kernel " << Entry.SymbolName;
+ auto AddrOrErr = Program.getKernelAddress(Entry.SymbolName);
+ if (!AddrOrErr) {
+ REPORT() << "Failed to load kernel " << Entry.SymbolName << ": "
+ << llvm::toString(AddrOrErr.takeError());
+ } else {
+ DeviceEntry.Address = *AddrOrErr;
+ }
}
ODBG(ODT_Mapping) << "Entry point " << Entry.Address << " maps to"
<< (Entry.Size ? " global" : "") << " "
diff --git a/offload/libompaccsupport/Program.cpp b/offload/libompaccsupport/Program.cpp
new file mode 100644
index 0000000000000..f3842711262f9
--- /dev/null
+++ b/offload/libompaccsupport/Program.cpp
@@ -0,0 +1,69 @@
+//===------------ Program.cpp - liboffload program abstraction ----------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "Program.h"
+#include "OffloadError.h"
+
+#include <cstdint>
+
+using namespace llvm;
+
+// Temporary helper to help transition of libomptarget to liboffload: returns
+// the opaque plugin kernel handle backing a kernel symbol, for use with the
+// legacy plugin launch interface until kernel launch itself is migrated to
+// liboffload.
+extern "C" void *__ol_tgt_GetKernelFromSymbol(ol_symbol_handle_t Symbol);
+
+Expected<ProgramTy> ProgramTy::create(ol_context_handle_t Context,
+ ol_device_handle_t Device,
+ __tgt_device_image *Img) {
+ ol_program_handle_t Handle;
+ size_t ImageSize = reinterpret_cast<uintptr_t>(Img->ImageEnd) -
+ reinterpret_cast<uintptr_t>(Img->ImageStart);
+ if (auto Res =
+ olCreateProgram(Context, Device, Img->ImageStart, ImageSize, &Handle))
+ return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
+ "failed to load binary %p: %s", Img,
+ Res->Details);
+
+ return ProgramTy(Handle);
+}
+
+Expected<void *> ProgramTy::getGlobalAddress(const char *Name,
+ size_t *Size) const {
+ ol_symbol_handle_t Symbol;
+ if (auto Res =
+ olGetSymbol(Handle, Name, OL_SYMBOL_KIND_GLOBAL_VARIABLE, &Symbol))
+ return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
+ "failed to find global symbol %s: %s",
+ Name, Res->Details);
+
+ void *Address = nullptr;
+ if (auto Res = olGetSymbolInfo(Symbol, OL_SYMBOL_INFO_GLOBAL_VARIABLE_ADDRESS,
+ sizeof(Address), &Address))
+ return error::createOffloadError(
+ error::ErrorCode::INVALID_BINARY,
+ "failed to get device address of global symbol %s: %s", Name,
+ Res->Details);
+
+ if (Size && olGetSymbolInfo(Symbol, OL_SYMBOL_INFO_GLOBAL_VARIABLE_SIZE,
+ sizeof(*Size), Size))
+ *Size = 0;
+
+ return Address;
+}
+
+Expected<void *> ProgramTy::getKernelAddress(const char *Name) const {
+ ol_symbol_handle_t Symbol;
+ if (auto Res = olGetSymbol(Handle, Name, OL_SYMBOL_KIND_KERNEL, &Symbol))
+ return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
+ "failed to find kernel symbol %s: %s",
+ Name, Res->Details);
+
+ return __ol_tgt_GetKernelFromSymbol(Symbol);
+}
diff --git a/offload/libompaccsupport/device.cpp b/offload/libompaccsupport/device.cpp
index a379d183a04ae..826b3f6950c09 100644
--- a/offload/libompaccsupport/device.cpp
+++ b/offload/libompaccsupport/device.cpp
@@ -122,13 +122,31 @@ llvm::Error DeviceTy::deinit() {
return llvm::Error::success();
}
+// Resolve the device address of the global variable \p Name in \p Program,
+// recording it for kernel record/replay if recording is currently active.
+llvm::Expected<void *> getAndRecordGlobalAddress(DeviceTy &Device,
+ const ProgramTy &Program,
+ const char *Name) {
+ size_t Size = 0;
+ auto AddrOrErr = Program.getGlobalAddress(Name, &Size);
+ if (!AddrOrErr)
+ return AddrOrErr;
+
+ GenericDeviceTy &GenericDevice = Device.RTL->getDevice(Device.RTLDeviceID);
+ RecordReplayTy *RecordReplay = GenericDevice.getRecordReplay();
+ if (RecordReplay && RecordReplay->isRecording())
+ RecordReplay->addGlobal(Name, Size, *AddrOrErr);
+
+ return AddrOrErr;
+}
+
// Extract the mapping of host function pointers to device function pointers
// from the entry table. Functions marked as 'indirect' in OpenMP will have
// offloading entries generated for them which map the host's function pointer
// to a global containing the corresponding function pointer on the device.
static llvm::Expected<std::pair<void *, uint64_t>>
setupIndirectCallTable(DeviceTy &Device, __tgt_device_image *Image,
- __tgt_device_binary Binary) {
+ const ProgramTy &Program) {
AsyncInfoTy AsyncInfo(Device);
llvm::ArrayRef<llvm::offloading::EntryTy> Entries(Image->EntriesBegin,
Image->EntriesEnd);
@@ -146,11 +164,12 @@ setupIndirectCallTable(DeviceTy &Device, __tgt_device_image *Image,
// VTable and Entry.Size is the total size of the VTable. Unlike the
// indirect function case below, the Global is not of size Entry.Size and
// is instead of size PtrSize (sizeof(void*)).
- void *Vtable;
void *res;
- if (Device.RTL->get_global(Binary, PtrSize, Entry.SymbolName, &Vtable))
- return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
- "failed to load %s", Entry.SymbolName);
+ auto VtableOrErr =
+ getAndRecordGlobalAddress(Device, Program, Entry.SymbolName);
+ if (!VtableOrErr)
+ return VtableOrErr.takeError();
+ void *Vtable = *VtableOrErr;
// HstPtr = Entry.Address;
if (Device.retrieveData(&res, Vtable, PtrSize, AsyncInfo))
@@ -173,10 +192,11 @@ setupIndirectCallTable(DeviceTy &Device, __tgt_device_image *Image,
// dealing with a single function pointer (not a VTable)
assert(Entry.Size == PtrSize && "Global not a function pointer?");
auto &[HstPtr, DevPtr] = IndirectCallTable.emplace_back();
- void *Ptr;
- if (Device.RTL->get_global(Binary, Entry.Size, Entry.SymbolName, &Ptr))
- return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
- "failed to load %s", Entry.SymbolName);
+ auto PtrOrErr =
+ getAndRecordGlobalAddress(Device, Program, Entry.SymbolName);
+ if (!PtrOrErr)
+ return PtrOrErr.takeError();
+ void *Ptr = *PtrOrErr;
HstPtr = Entry.Address;
if (Device.retrieveData(&DevPtr, Ptr, Entry.Size, AsyncInfo))
@@ -215,22 +235,23 @@ setupIndirectCallTable(DeviceTy &Device, __tgt_device_image *Image,
}
// Load binary to device and perform global initialization if needed.
-llvm::Expected<__tgt_device_binary>
-DeviceTy::loadBinary(__tgt_device_image *Img) {
- __tgt_device_binary Binary;
-
- if (RTL->load_binary(RTLDeviceID, Img, &Binary) != OFFLOAD_SUCCESS)
- return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
- "failed to load binary %p", Img);
+llvm::Expected<ProgramTy> DeviceTy::loadBinary(__tgt_device_image *Img) {
+ auto ProgramOrErr = ProgramTy::create(Context, DeviceHandle, Img);
+ if (!ProgramOrErr)
+ return ProgramOrErr.takeError();
+ ProgramTy Program = std::move(*ProgramOrErr);
// This symbol is optional.
- void *DeviceEnvironmentPtr;
- if (RTL->get_global(Binary, sizeof(DeviceEnvironmentTy),
- "__omp_rtl_device_environment", &DeviceEnvironmentPtr))
- return Binary;
+ auto DeviceEnvironmentPtrOrErr =
+ getAndRecordGlobalAddress(*this, Program, "__omp_rtl_device_environment");
+ if (!DeviceEnvironmentPtrOrErr) {
+ llvm::consumeError(DeviceEnvironmentPtrOrErr.takeError());
+ return std::move(Program);
+ }
+ void *DeviceEnvironmentPtr = *DeviceEnvironmentPtrOrErr;
// Obtain a table mapping host function pointers to device function pointers.
- auto CallTablePairOrErr = setupIndirectCallTable(*this, Img, Binary);
+ auto CallTablePairOrErr = setupIndirectCallTable(*this, Img, Program);
if (!CallTablePairOrErr)
return CallTablePairOrErr.takeError();
@@ -254,7 +275,7 @@ DeviceTy::loadBinary(__tgt_device_image *Img) {
return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
"failed to copy data");
- return Binary;
+ return std::move(Program);
}
void *DeviceTy::allocData(int64_t Size, void *HstPtr, int32_t Kind) {
diff --git a/offload/libomptarget/CMakeLists.txt b/offload/libomptarget/CMakeLists.txt
index d0b24c4ff4e65..e12b1762de33b 100644
--- a/offload/libomptarget/CMakeLists.txt
+++ b/offload/libomptarget/CMakeLists.txt
@@ -18,6 +18,7 @@ add_library(omptarget SHARED
../libompaccsupport/PluginManager.cpp
../libompaccsupport/DeviceImage.cpp
../libompaccsupport/Mapping.cpp
+ ../libompaccsupport/Program.cpp
KernelLanguage/API.cpp
)
diff --git a/offload/plugins-nextgen/common/include/PluginInterface.h b/offload/plugins-nextgen/common/include/PluginInterface.h
index d53da6e1cf47d..8881f5885261e 100644
--- a/offload/plugins-nextgen/common/include/PluginInterface.h
+++ b/offload/plugins-nextgen/common/include/PluginInterface.h
@@ -1712,10 +1712,6 @@ struct GenericPluginTy {
const char *ReportFilename,
const char *OutputDirPath);
- /// Loads the associated binary into the plugin and returns a handle to it.
- int32_t load_binary(int32_t DeviceId, __tgt_device_image *TgtImage,
- __tgt_device_binary *Binary);
-
/// Allocates memory that is accessively to the given device.
void *data_alloc(int32_t DeviceId, int64_t Size, void *HostPtr, int32_t Kind);
@@ -1749,14 +1745,6 @@ struct GenericPluginTy {
/// Returns if the plugin can support automatic copy.
int32_t use_auto_zero_copy(int32_t DeviceId);
- /// Look up a global symbol in the given binary.
- int32_t get_global(__tgt_device_binary Binary, uint64_t Size,
- const char *Name, void **DevicePtr);
-
- /// Look up a kernel function in the given binary.
- int32_t get_function(__tgt_device_binary Binary, const char *Name,
- void **KernelPtr);
-
/// Return the interop specification that the plugin supports
/// It might not be one of the user specified ones.
interop_spec_t select_interop_preference(int32_t ID, int32_t InteropType,
diff --git a/offload/plugins-nextgen/common/src/PluginInterface.cpp b/offload/plugins-nextgen/common/src/PluginInterface.cpp
index b4eaa733c0c07..013ca526bcb08 100644
--- a/offload/plugins-nextgen/common/src/PluginInterface.cpp
+++ b/offload/plugins-nextgen/common/src/PluginInterface.cpp
@@ -1509,29 +1509,6 @@ int32_t GenericPluginTy::initialize_record_replay(
return OFFLOAD_SUCCESS;
}
-int32_t GenericPluginTy::load_binary(int32_t DeviceId,
- __tgt_device_image *TgtImage,
- __tgt_device_binary *Binary) {
- GenericDeviceTy &Device = getDevice(DeviceId);
-
- StringRef Buffer(reinterpret_cast<const char *>(TgtImage->ImageStart),
- utils::getPtrDiff(TgtImage->ImageEnd, TgtImage->ImageStart));
- auto ImageOrErr = Device.loadBinary(*this, Buffer, /*Context=*/nullptr);
- if (!ImageOrErr) {
- auto Err = ImageOrErr.takeError();
- REPORT() << "Failure to load binary image " << TgtImage << " on device "
- << DeviceId << ": " << toString(std::move(Err));
- return OFFLOAD_FAIL;
- }
-
- DeviceImageTy *Image = *ImageOrErr;
- assert(Image != nullptr && "Invalid Image");
-
- *Binary = __tgt_device_binary{reinterpret_cast<uint64_t>(Image)};
-
- return OFFLOAD_SUCCESS;
-}
-
void *GenericPluginTy::data_alloc(int32_t DeviceId, int64_t Size, void *HostPtr,
int32_t Kind) {
auto AllocOrErr = getDevice(DeviceId).dataAlloc(
@@ -1644,56 +1621,6 @@ int32_t GenericPluginTy::use_auto_zero_copy(int32_t DeviceId) {
return getDevice(DeviceId).useAutoZeroCopy();
}
-int32_t GenericPluginTy::get_global(__tgt_device_binary Binary, uint64_t Size,
- const char *Name, void **DevicePtr) {
- assert(Binary.handle && "Invalid device binary handle");
- DeviceImageTy &Image = *reinterpret_cast<DeviceImageTy *>(Binary.handle);
-
- GenericDeviceTy &Device = Image.getDevice();
-
- GlobalTy DeviceGlobal(Name, Size);
- GenericGlobalHandlerTy &GHandler = getGlobalHandler();
- if (auto Err =
- GHandler.getGlobalMetadataFromDevice(Device, Image, DeviceGlobal)) {
- consumeError(std::move(Err));
- return OFFLOAD_FAIL;
- }
-
- *DevicePtr = DeviceGlobal.getPtr();
- assert(DevicePtr && "Invalid device global's address");
-
- // Save the loaded globals if we are recording.
- RecordReplayTy *RecordReplay = Device.getRecordReplay();
- if (RecordReplay && RecordReplay->isRecording())
- RecordReplay->addGlobal(Name, Size, *DevicePtr);
-
- return OFFLOAD_SUCCESS;
-}
-
-int32_t GenericPluginTy::get_function(__tgt_device_binary Binary,
- const char *Name, void **KernelPtr) {
- assert(Binary.handle && "Invalid device binary handle");
- DeviceImageTy &Image = *reinterpret_cast<DeviceImageTy *>(Binary.handle);
-
- GenericDeviceTy &Device = Image.getDevice();
-
- auto KernelOrErr = Device.constructKernel(Name);
- if (Error Err = KernelOrErr.takeError()) {
- REPORT() << "Failure to look up kernel: " << toString(std::move(Err));
- return OFFLOAD_FAIL;
- }
-
- GenericKernelTy &Kernel = *KernelOrErr;
- if (auto Err = Kernel.init(Device, Image)) {
- REPORT() << "Failure to init kernel: " << toString(std::move(Err));
- return OFFLOAD_FAIL;
- }
-
- // Note that this is not the kernel's device address.
- *KernelPtr = &Kernel;
- return OFFLOAD_SUCCESS;
-}
-
/// Create OpenMP interop with the given interop context
omp_interop_val_t *
GenericPluginTy::create_interop(int32_t ID, int32_t InteropContext,
More information about the llvm-branch-commits
mailing list