[Offload] Check for initialization (#144370)
All entry points (except olInit) now check that offload has been initialized. If not, a new `OL_ERRC_UNINITIALIZED` error is returned.
This commit is contained in:
parent
bd36f7331a
commit
e0633d59b9
@ -106,6 +106,7 @@ def ErrorCode : Enum {
|
|||||||
Etor<"ASSEMBLE_FAILURE", "assembler failure while processing binary image">,
|
Etor<"ASSEMBLE_FAILURE", "assembler failure while processing binary image">,
|
||||||
Etor<"LINK_FAILURE", "linker 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<"BACKEND_FAILURE", "the plugin backend is in an invalid or unsupported state">,
|
||||||
|
Etor<"UNINITIALIZED", "not initialized">,
|
||||||
|
|
||||||
// Handle related errors - only makes sense for liboffload
|
// Handle related errors - only makes sense for liboffload
|
||||||
Etor<"INVALID_NULL_HANDLE", "a handle argument is null when it should not be">,
|
Etor<"INVALID_NULL_HANDLE", "a handle argument is null when it should not be">,
|
||||||
|
@ -26,6 +26,7 @@ namespace llvm {
|
|||||||
namespace offload {
|
namespace offload {
|
||||||
bool isTracingEnabled();
|
bool isTracingEnabled();
|
||||||
bool isValidationEnabled();
|
bool isValidationEnabled();
|
||||||
|
bool isOffloadInitialized();
|
||||||
} // namespace offload
|
} // namespace offload
|
||||||
} // namespace llvm
|
} // namespace llvm
|
||||||
|
|
||||||
|
@ -120,9 +120,10 @@ struct OffloadContext {
|
|||||||
|
|
||||||
// If the context is uninited, then we assume tracing is disabled
|
// If the context is uninited, then we assume tracing is disabled
|
||||||
bool isTracingEnabled() {
|
bool isTracingEnabled() {
|
||||||
return OffloadContextVal && OffloadContext::get().TracingEnabled;
|
return isOffloadInitialized() && OffloadContext::get().TracingEnabled;
|
||||||
}
|
}
|
||||||
bool isValidationEnabled() { return OffloadContext::get().ValidationEnabled; }
|
bool isValidationEnabled() { return OffloadContext::get().ValidationEnabled; }
|
||||||
|
bool isOffloadInitialized() { return OffloadContextVal != nullptr; }
|
||||||
|
|
||||||
template <typename HandleT> Error olDestroy(HandleT Handle) {
|
template <typename HandleT> Error olDestroy(HandleT Handle) {
|
||||||
delete Handle;
|
delete Handle;
|
||||||
|
@ -82,6 +82,10 @@ static void EmitEntryPointFunc(const FunctionRec &F, raw_ostream &OS) {
|
|||||||
}
|
}
|
||||||
OS << ") {\n";
|
OS << ") {\n";
|
||||||
|
|
||||||
|
// Check offload is initialized
|
||||||
|
if (F.getName() != "olInit")
|
||||||
|
OS << "if (!llvm::offload::isOffloadInitialized()) return &UninitError;";
|
||||||
|
|
||||||
// Emit pre-call prints
|
// Emit pre-call prints
|
||||||
OS << TAB_1 "if (llvm::offload::isTracingEnabled()) {\n";
|
OS << TAB_1 "if (llvm::offload::isTracingEnabled()) {\n";
|
||||||
OS << formatv(TAB_2 "llvm::errs() << \"---> {0}\";\n", F.getName());
|
OS << formatv(TAB_2 "llvm::errs() << \"---> {0}\";\n", F.getName());
|
||||||
@ -143,6 +147,14 @@ static void EmitCodeLocWrapper(const FunctionRec &F, raw_ostream &OS) {
|
|||||||
|
|
||||||
void EmitOffloadEntryPoints(const RecordKeeper &Records, raw_ostream &OS) {
|
void EmitOffloadEntryPoints(const RecordKeeper &Records, raw_ostream &OS) {
|
||||||
OS << GenericHeader;
|
OS << GenericHeader;
|
||||||
|
|
||||||
|
constexpr const char *UninitMessage =
|
||||||
|
"liboffload has not been initialized - please call olInit before using "
|
||||||
|
"this API";
|
||||||
|
OS << formatv("static {0}_error_struct_t UninitError = "
|
||||||
|
"{{{1}_ERRC_UNINITIALIZED, \"{2}\"};",
|
||||||
|
PrefixLower, PrefixUpper, UninitMessage);
|
||||||
|
|
||||||
for (auto *R : Records.getAllDerivedDefinitions("Function")) {
|
for (auto *R : Records.getAllDerivedDefinitions("Function")) {
|
||||||
EmitValidationFunc(FunctionRec{R}, OS);
|
EmitValidationFunc(FunctionRec{R}, OS);
|
||||||
EmitEntryPointFunc(FunctionRec{R}, OS);
|
EmitEntryPointFunc(FunctionRec{R}, OS);
|
||||||
|
@ -12,6 +12,10 @@ add_offload_unittest("event"
|
|||||||
event/olDestroyEvent.cpp
|
event/olDestroyEvent.cpp
|
||||||
event/olWaitEvent.cpp)
|
event/olWaitEvent.cpp)
|
||||||
|
|
||||||
|
add_offload_unittest("init"
|
||||||
|
init/olInit.cpp)
|
||||||
|
target_compile_definitions("init.unittests" PRIVATE DISABLE_WRAPPER)
|
||||||
|
|
||||||
add_offload_unittest("kernel"
|
add_offload_unittest("kernel"
|
||||||
kernel/olGetKernel.cpp
|
kernel/olGetKernel.cpp
|
||||||
kernel/olLaunchKernel.cpp)
|
kernel/olLaunchKernel.cpp)
|
||||||
|
@ -17,11 +17,13 @@ using namespace llvm;
|
|||||||
|
|
||||||
// Wrapper so we don't have to constantly init and shutdown Offload in every
|
// Wrapper so we don't have to constantly init and shutdown Offload in every
|
||||||
// test, while having sensible lifetime for the platform environment
|
// test, while having sensible lifetime for the platform environment
|
||||||
|
#ifndef DISABLE_WRAPPER
|
||||||
struct OffloadInitWrapper {
|
struct OffloadInitWrapper {
|
||||||
OffloadInitWrapper() { olInit(); }
|
OffloadInitWrapper() { olInit(); }
|
||||||
~OffloadInitWrapper() { olShutDown(); }
|
~OffloadInitWrapper() { olShutDown(); }
|
||||||
};
|
};
|
||||||
static OffloadInitWrapper Wrapper{};
|
static OffloadInitWrapper Wrapper{};
|
||||||
|
#endif
|
||||||
|
|
||||||
static cl::opt<std::string>
|
static cl::opt<std::string>
|
||||||
SelectedPlatform("platform", cl::desc("Only test the specified platform"),
|
SelectedPlatform("platform", cl::desc("Only test the specified platform"),
|
||||||
|
22
offload/unittests/OffloadAPI/init/olInit.cpp
Normal file
22
offload/unittests/OffloadAPI/init/olInit.cpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
//===------- Offload API tests - olInit -----------------------------------===//
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
// NOTE: For this test suite, the implicit olInit/olShutDown doesn't happen, so
|
||||||
|
// tests have to do it themselves
|
||||||
|
|
||||||
|
#include "../common/Fixtures.hpp"
|
||||||
|
#include <OffloadAPI.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
struct olInitTest : ::testing::Test {};
|
||||||
|
|
||||||
|
TEST_F(olInitTest, Uninitialized) {
|
||||||
|
ASSERT_ERROR(OL_ERRC_UNINITIALIZED,
|
||||||
|
olIterateDevices(
|
||||||
|
[](ol_device_handle_t, void *) { return false; }, nullptr));
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user