From 4359e55838cd29d4aa344f15543f725da25e940f Mon Sep 17 00:00:00 2001 From: Ross Brunton Date: Tue, 24 Jun 2025 16:27:12 +0100 Subject: [PATCH] [Offload] Properly report errors when jit compiling (#145498) Previously, if a binary failed to load due to failures when jit compiling, the function would return success with nullptr. Now it returns a new plugin error, `COMPILE_FAILURE`. --- offload/liboffload/API/Common.td | 1 + offload/liboffload/src/OffloadImpl.cpp | 1 + offload/plugins-nextgen/common/src/PluginInterface.cpp | 5 +++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/offload/liboffload/API/Common.td b/offload/liboffload/API/Common.td index cd8c3c63fde8..79c3bd46f198 100644 --- a/offload/liboffload/API/Common.td +++ b/offload/liboffload/API/Common.td @@ -104,6 +104,7 @@ def ErrorCode : Enum { Etor<"UNIMPLEMENTED", "generic error code for features currently unimplemented by the device/backend">, Etor<"UNSUPPORTED", "generic error code for features unsupported by the device/backend">, Etor<"ASSEMBLE_FAILURE", "assembler failure while processing binary image">, + Etor<"COMPILE_FAILURE", "jit compile failure while processing binary image">, Etor<"LINK_FAILURE", "linker failure while processing binary image">, Etor<"BACKEND_FAILURE", "the plugin backend is in an invalid or unsupported state">, Etor<"UNINITIALIZED", "not initialized">, diff --git a/offload/liboffload/src/OffloadImpl.cpp b/offload/liboffload/src/OffloadImpl.cpp index eba8e91ed688..da2101529ffe 100644 --- a/offload/liboffload/src/OffloadImpl.cpp +++ b/offload/liboffload/src/OffloadImpl.cpp @@ -471,6 +471,7 @@ Error olCreateProgram_impl(ol_device_handle_t Device, const void *ProgData, delete Prog; return Res.takeError(); } + assert(*Res != nullptr && "loadBinary returned nullptr"); Prog->Image = *Res; *Program = Prog; diff --git a/offload/plugins-nextgen/common/src/PluginInterface.cpp b/offload/plugins-nextgen/common/src/PluginInterface.cpp index 6fd3405d03af..3e9a62f57095 100644 --- a/offload/plugins-nextgen/common/src/PluginInterface.cpp +++ b/offload/plugins-nextgen/common/src/PluginInterface.cpp @@ -909,8 +909,9 @@ GenericDeviceTy::loadBinary(GenericPluginTy &Plugin, if (!PostJITImageOrErr) { auto Err = PostJITImageOrErr.takeError(); REPORT("Failure to jit IR image %p on device %d: %s\n", InputTgtImage, - DeviceId, toString(std::move(Err)).data()); - return nullptr; + DeviceId, toStringWithoutConsuming(Err).data()); + return Plugin::error(ErrorCode::COMPILE_FAILURE, std::move(Err), + "failure to jit IR image"); } // Load the binary and allocate the image object. Use the next available id