diff --git a/offload/include/Shared/OffloadErrcodes.inc b/offload/include/Shared/OffloadErrcodes.inc new file mode 100644 index 0000000000000..217565647c4e1 --- /dev/null +++ b/offload/include/Shared/OffloadErrcodes.inc @@ -0,0 +1,37 @@ +//===- Auto-generated file, part of the LLVM/Offload project --------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef OFFLOAD_ERRC +#error Please define the macro OFFLOAD_ERRCODE(Name, Desc, Value) +#endif + +// Error codes are shared between PluginInterface and liboffload. +// To add new error codes, add them to offload/liboffload/API/Common.td and run +// the GenerateOffload target. + +OFFLOAD_ERRC(SUCCESS, "Success", 0) +OFFLOAD_ERRC(UNKNOWN, "Unknown or internal error", 1) +OFFLOAD_ERRC(INVALID_NULL_POINTER, + "A pointer argument is null when it should not be", 2) +OFFLOAD_ERRC(INVALID_ARGUMENT, "An argument is invalid", 3) +OFFLOAD_ERRC(OUT_OF_RESOURCES, "Out of resources", 4) +OFFLOAD_ERRC(UNSUPPORTED, + "generic error code for unsupported features and enums", 5) +OFFLOAD_ERRC( + INVALID_SIZE, + "invalid size or dimensions (e.g., must not be zero, or is out of bounds)", + 6) +OFFLOAD_ERRC(INVALID_ENUMERATION, "enumerator argument is not valid", 7) +OFFLOAD_ERRC(INVALID_KERNEL_NAME, + "Named kernel not found in the program binary", 8) +OFFLOAD_ERRC(INVALID_VALUE, "Invalid Value", 9) +OFFLOAD_ERRC(INVALID_PLATFORM, "Invalid platform", 10) +OFFLOAD_ERRC(INVALID_DEVICE, "Invalid device", 11) +OFFLOAD_ERRC(INVALID_QUEUE, "Invalid queue", 12) +OFFLOAD_ERRC(INVALID_EVENT, "Invalid event", 13) +OFFLOAD_ERRC(INVALID_NULL_HANDLE, "handle argument is not valid", 14) diff --git a/offload/liboffload/API/CMakeLists.txt b/offload/liboffload/API/CMakeLists.txt index 8fd6cb539374a..5f8d1435d141f 100644 --- a/offload/liboffload/API/CMakeLists.txt +++ b/offload/liboffload/API/CMakeLists.txt @@ -11,13 +11,17 @@ if (CLANG_FORMAT) tablegen(OFFLOAD OffloadFuncs.inc -gen-func-names) tablegen(OFFLOAD OffloadImplFuncDecls.inc -gen-impl-func-decls) tablegen(OFFLOAD OffloadPrint.hpp -gen-print-header) + tablegen(OFFLOAD OffloadErrcodes.inc -gen-errcodes) - set(OFFLOAD_GENERATED_FILES ${TABLEGEN_OUTPUT}) + set(FILES_TO_COPY "OffloadAPI.h;OffloadEntryPoints.inc;OffloadFuncs.inc;OffloadImplFuncDecls.inc;OffloadPrint.hpp") + set(GEN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../include/generated) add_public_tablegen_target(OffloadGenerate) add_custom_command(TARGET OffloadGenerate POST_BUILD COMMAND ${CLANG_FORMAT} - -i ${OFFLOAD_GENERATED_FILES}) + -i ${TABLEGEN_OUTPUT}) add_custom_command(TARGET OffloadGenerate POST_BUILD COMMAND ${CMAKE_COMMAND} - -E copy_if_different ${OFFLOAD_GENERATED_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/../include/generated") + -E copy_if_different ${FILES_TO_COPY} ${GEN_DIR}) + add_custom_command(TARGET OffloadGenerate POST_BUILD COMMAND ${CMAKE_COMMAND} + -E copy_if_different OffloadErrcodes.inc "${LIBOMPTARGET_INCLUDE_DIR}/Shared/OffloadErrcodes.inc") else() message(WARNING "clang-format was not found, so the OffloadGenerate target\ will not be available. Offload will still build, but you will not be\ diff --git a/offload/liboffload/API/Common.td b/offload/liboffload/API/Common.td index de7502b540618..d19c9c662faec 100644 --- a/offload/liboffload/API/Common.td +++ b/offload/liboffload/API/Common.td @@ -83,26 +83,29 @@ def : Typedef { let value = "void *"; } -def : Enum { +def ErrorCode : Enum { let name = "ol_errc_t"; let desc = "Defines Return/Error codes"; let etors =[ Etor<"SUCCESS", "Success">, + + // Universal errors + Etor<"UNKNOWN", "Unknown or internal error">, + Etor<"INVALID_NULL_POINTER", "A pointer argument is null when it should not be">, + Etor<"INVALID_ARGUMENT", "An argument is invalid">, + Etor<"OUT_OF_RESOURCES", "Out of resources">, + Etor<"UNSUPPORTED", "generic error code for unsupported features and enums">, + Etor<"INVALID_SIZE", "invalid size or dimensions (e.g., must not be zero, or is out of bounds)">, + Etor<"INVALID_ENUMERATION", "enumerator argument is not valid">, + Etor<"INVALID_KERNEL_NAME", "Named kernel not found in the program binary">, + + // Handle related errors - only makes sense for liboffload Etor<"INVALID_VALUE", "Invalid Value">, Etor<"INVALID_PLATFORM", "Invalid platform">, Etor<"INVALID_DEVICE", "Invalid device">, Etor<"INVALID_QUEUE", "Invalid queue">, Etor<"INVALID_EVENT", "Invalid event">, - Etor<"INVALID_KERNEL_NAME", "Named kernel not found in the program binary">, - Etor<"OUT_OF_RESOURCES", "Out of resources">, - Etor<"UNSUPPORTED_FEATURE", "generic error code for unsupported features">, - Etor<"INVALID_ARGUMENT", "generic error code for invalid arguments">, - Etor<"INVALID_NULL_HANDLE", "handle argument is not valid">, - Etor<"INVALID_NULL_POINTER", "pointer argument may not be nullptr">, - Etor<"INVALID_SIZE", "invalid size or dimensions (e.g., must not be zero, or is out of bounds)">, - Etor<"INVALID_ENUMERATION", "enumerator argument is not valid">, - Etor<"UNSUPPORTED_ENUMERATION", "enumerator argument is not supported by the device">, - Etor<"UNKNOWN", "Unknown or internal error"> + Etor<"INVALID_NULL_HANDLE", "handle argument is not valid"> ]; } diff --git a/offload/liboffload/CMakeLists.txt b/offload/liboffload/CMakeLists.txt index db12236ddfc7f..9927fa3c3400a 100644 --- a/offload/liboffload/CMakeLists.txt +++ b/offload/liboffload/CMakeLists.txt @@ -1,3 +1,5 @@ +set(LIBOFFLOAD_ROOT "${CMAKE_CURRENT_SOURCE_DIR}") + add_subdirectory(API) add_llvm_library( diff --git a/offload/liboffload/include/OffloadImpl.hpp b/offload/liboffload/include/OffloadImpl.hpp index 48fdc2b884199..7d2c0c53fc85b 100644 --- a/offload/liboffload/include/OffloadImpl.hpp +++ b/offload/liboffload/include/OffloadImpl.hpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #pragma once +#include "PluginInterface.h" #include #include #include @@ -93,9 +94,7 @@ struct ol_impl_result_t { ol_errc_t ErrCode; llvm::StringRef Details; llvm::handleAllErrors(std::move(Error), [&](llvm::StringError &Err) { - // TODO: PluginInterface doesn't yet have a way to communicate offload - // error codes - ErrCode = OL_ERRC_UNKNOWN; + ErrCode = GetErrorCode(Err.convertToErrorCode()); Details = errorStrs().insert(Err.getMessage()).first->getKeyData(); }); @@ -105,5 +104,14 @@ struct ol_impl_result_t { operator ol_result_t() { return Result; } private: + static ol_errc_t GetErrorCode(std::error_code Code) { + if (Code.category() == llvm::omp::target::plugin::make_error_code( + llvm::omp::target::plugin::ErrorCode::SUCCESS) + .category()) { + return static_cast(Code.value()); + } + return OL_ERRC_UNKNOWN; + } + ol_result_t Result; }; diff --git a/offload/liboffload/include/generated/OffloadAPI.h b/offload/liboffload/include/generated/OffloadAPI.h index ace31c57cf2f8..66ea48c8ca14f 100644 --- a/offload/liboffload/include/generated/OffloadAPI.h +++ b/offload/liboffload/include/generated/OffloadAPI.h @@ -17,6 +17,45 @@ extern "C" { #endif +/////////////////////////////////////////////////////////////////////////////// +/// @brief Defines Return/Error codes +typedef enum ol_errc_t { + /// Success + OL_ERRC_SUCCESS = 0, + /// Unknown or internal error + OL_ERRC_UNKNOWN = 1, + /// A pointer argument is null when it should not be + OL_ERRC_INVALID_NULL_POINTER = 2, + /// An argument is invalid + OL_ERRC_INVALID_ARGUMENT = 3, + /// Out of resources + OL_ERRC_OUT_OF_RESOURCES = 4, + /// generic error code for unsupported features and enums + OL_ERRC_UNSUPPORTED = 5, + /// invalid size or dimensions (e.g., must not be zero, or is out of bounds) + OL_ERRC_INVALID_SIZE = 6, + /// enumerator argument is not valid + OL_ERRC_INVALID_ENUMERATION = 7, + /// Named kernel not found in the program binary + OL_ERRC_INVALID_KERNEL_NAME = 8, + /// Invalid Value + OL_ERRC_INVALID_VALUE = 9, + /// Invalid platform + OL_ERRC_INVALID_PLATFORM = 10, + /// Invalid device + OL_ERRC_INVALID_DEVICE = 11, + /// Invalid queue + OL_ERRC_INVALID_QUEUE = 12, + /// Invalid event + OL_ERRC_INVALID_EVENT = 13, + /// handle argument is not valid + OL_ERRC_INVALID_NULL_HANDLE = 14, + /// @cond + OL_ERRC_FORCE_UINT32 = 0x7fffffff + /// @endcond + +} ol_errc_t; + /////////////////////////////////////////////////////////////////////////////// #ifndef OL_VERSION_MAJOR /// @brief Major version of the Offload API @@ -101,47 +140,6 @@ typedef struct ol_program_impl_t *ol_program_handle_t; /// @brief Handle of kernel object typedef void *ol_kernel_handle_t; -/////////////////////////////////////////////////////////////////////////////// -/// @brief Defines Return/Error codes -typedef enum ol_errc_t { - /// Success - OL_ERRC_SUCCESS = 0, - /// Invalid Value - OL_ERRC_INVALID_VALUE = 1, - /// Invalid platform - OL_ERRC_INVALID_PLATFORM = 2, - /// Invalid device - OL_ERRC_INVALID_DEVICE = 3, - /// Invalid queue - OL_ERRC_INVALID_QUEUE = 4, - /// Invalid event - OL_ERRC_INVALID_EVENT = 5, - /// Named kernel not found in the program binary - OL_ERRC_INVALID_KERNEL_NAME = 6, - /// Out of resources - OL_ERRC_OUT_OF_RESOURCES = 7, - /// generic error code for unsupported features - OL_ERRC_UNSUPPORTED_FEATURE = 8, - /// generic error code for invalid arguments - OL_ERRC_INVALID_ARGUMENT = 9, - /// handle argument is not valid - OL_ERRC_INVALID_NULL_HANDLE = 10, - /// pointer argument may not be nullptr - OL_ERRC_INVALID_NULL_POINTER = 11, - /// invalid size or dimensions (e.g., must not be zero, or is out of bounds) - OL_ERRC_INVALID_SIZE = 12, - /// enumerator argument is not valid - OL_ERRC_INVALID_ENUMERATION = 13, - /// enumerator argument is not supported by the device - OL_ERRC_UNSUPPORTED_ENUMERATION = 14, - /// Unknown or internal error - OL_ERRC_UNKNOWN = 15, - /// @cond - OL_ERRC_FORCE_UINT32 = 0x7fffffff - /// @endcond - -} ol_errc_t; - /////////////////////////////////////////////////////////////////////////////// /// @brief Details of the error condition returned by an API call typedef struct ol_error_struct_t { @@ -477,7 +475,8 @@ OL_APIEXPORT ol_result_t OL_APICALL olMemFree( /// @brief Enqueue a memcpy operation. /// /// @details -/// - For host pointers, use the device returned by olGetHostDevice +/// - For host pointers, use the host device belonging to the +/// OL_PLATFORM_BACKEND_HOST platform. /// - If a queue is specified, at least one device must be a non-host device /// - If a queue is not specified, the memcpy happens synchronously /// diff --git a/offload/liboffload/include/generated/OffloadPrint.hpp b/offload/liboffload/include/generated/OffloadPrint.hpp index 7f5e33aea6f73..af5ca0a96b509 100644 --- a/offload/liboffload/include/generated/OffloadPrint.hpp +++ b/offload/liboffload/include/generated/OffloadPrint.hpp @@ -49,6 +49,30 @@ inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os, case OL_ERRC_SUCCESS: os << "OL_ERRC_SUCCESS"; break; + case OL_ERRC_UNKNOWN: + os << "OL_ERRC_UNKNOWN"; + break; + case OL_ERRC_INVALID_NULL_POINTER: + os << "OL_ERRC_INVALID_NULL_POINTER"; + break; + case OL_ERRC_INVALID_ARGUMENT: + os << "OL_ERRC_INVALID_ARGUMENT"; + break; + case OL_ERRC_OUT_OF_RESOURCES: + os << "OL_ERRC_OUT_OF_RESOURCES"; + break; + case OL_ERRC_UNSUPPORTED: + os << "OL_ERRC_UNSUPPORTED"; + break; + case OL_ERRC_INVALID_SIZE: + os << "OL_ERRC_INVALID_SIZE"; + break; + case OL_ERRC_INVALID_ENUMERATION: + os << "OL_ERRC_INVALID_ENUMERATION"; + break; + case OL_ERRC_INVALID_KERNEL_NAME: + os << "OL_ERRC_INVALID_KERNEL_NAME"; + break; case OL_ERRC_INVALID_VALUE: os << "OL_ERRC_INVALID_VALUE"; break; @@ -64,36 +88,9 @@ inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os, case OL_ERRC_INVALID_EVENT: os << "OL_ERRC_INVALID_EVENT"; break; - case OL_ERRC_INVALID_KERNEL_NAME: - os << "OL_ERRC_INVALID_KERNEL_NAME"; - break; - case OL_ERRC_OUT_OF_RESOURCES: - os << "OL_ERRC_OUT_OF_RESOURCES"; - break; - case OL_ERRC_UNSUPPORTED_FEATURE: - os << "OL_ERRC_UNSUPPORTED_FEATURE"; - break; - case OL_ERRC_INVALID_ARGUMENT: - os << "OL_ERRC_INVALID_ARGUMENT"; - break; case OL_ERRC_INVALID_NULL_HANDLE: os << "OL_ERRC_INVALID_NULL_HANDLE"; break; - case OL_ERRC_INVALID_NULL_POINTER: - os << "OL_ERRC_INVALID_NULL_POINTER"; - break; - case OL_ERRC_INVALID_SIZE: - os << "OL_ERRC_INVALID_SIZE"; - break; - case OL_ERRC_INVALID_ENUMERATION: - os << "OL_ERRC_INVALID_ENUMERATION"; - break; - case OL_ERRC_UNSUPPORTED_ENUMERATION: - os << "OL_ERRC_UNSUPPORTED_ENUMERATION"; - break; - case OL_ERRC_UNKNOWN: - os << "OL_ERRC_UNKNOWN"; - break; default: os << "unknown enumerator"; break; diff --git a/offload/plugins-nextgen/common/CMakeLists.txt b/offload/plugins-nextgen/common/CMakeLists.txt index ffc431f68dbc5..2fcfaf8225a63 100644 --- a/offload/plugins-nextgen/common/CMakeLists.txt +++ b/offload/plugins-nextgen/common/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(PluginCommon OBJECT src/GlobalHandler.cpp src/JIT.cpp src/RPC.cpp + src/OffloadError.cpp src/Utils/ELF.cpp ) add_dependencies(PluginCommon intrinsics_gen) diff --git a/offload/plugins-nextgen/common/include/OffloadError.h b/offload/plugins-nextgen/common/include/OffloadError.h new file mode 100644 index 0000000000000..04f5c31b4c9e1 --- /dev/null +++ b/offload/plugins-nextgen/common/include/OffloadError.h @@ -0,0 +1,64 @@ +//===- OffloadError.h - Definition of error class -------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +//===----------------------------------------------------------------------===// + +#ifndef OPENMP_LIBOMPTARGET_PLUGINS_NEXTGEN_COMMON_OFFLOAD_ERROR_H +#define OPENMP_LIBOMPTARGET_PLUGINS_NEXTGEN_COMMON_OFFLOAD_ERROR_H + +#include "llvm/Support/Error.h" +#include "llvm/Support/ErrorHandling.h" + +namespace llvm { +namespace omp { +namespace target { +namespace plugin { + +enum class ErrorCode { +#define OFFLOAD_ERRC(Name, _, Value) Name = Value, +#include "Shared/OffloadErrcodes.inc" +#undef OFFLOAD_ERRC +}; + +} // namespace plugin +} // namespace target +} // namespace omp +} // namespace llvm + +namespace std { +template <> +struct is_error_code_enum + : std::true_type {}; +} // namespace std + +namespace llvm { +namespace omp { +namespace target { +namespace plugin { + +const std::error_category &OffloadErrCategory(); + +inline std::error_code make_error_code(ErrorCode E) { + return std::error_code(static_cast(E), OffloadErrCategory()); +} + +/// Base class for errors originating in DIA SDK, e.g. COM calls +class OffloadError : public ErrorInfo { +public: + using ErrorInfo::ErrorInfo; + + OffloadError(const Twine &S) : ErrorInfo(S, ErrorCode::UNKNOWN) {} + + static char ID; +}; +} // namespace plugin +} // namespace target +} // namespace omp +} // namespace llvm + +#endif diff --git a/offload/plugins-nextgen/common/include/PluginInterface.h b/offload/plugins-nextgen/common/include/PluginInterface.h index e54a8afdd3f4f..899ae0f9be3f5 100644 --- a/offload/plugins-nextgen/common/include/PluginInterface.h +++ b/offload/plugins-nextgen/common/include/PluginInterface.h @@ -30,6 +30,7 @@ #include "GlobalHandler.h" #include "JIT.h" #include "MemoryManager.h" +#include "OffloadError.h" #include "RPC.h" #include "omptarget.h" @@ -1382,10 +1383,25 @@ namespace Plugin { /// Plugin::check(). static inline Error success() { return Error::success(); } -/// Create a string error. +/// Create an Offload error. +template +static Error error(ErrorCode Code, const char *ErrFmt, ArgsTy... Args) { + std::string Buffer; + raw_string_ostream(Buffer) << format(ErrFmt, Args...); + return make_error(Code, Buffer); +} + template static Error error(const char *ErrFmt, ArgsTy... Args) { - return createStringError(inconvertibleErrorCode(), ErrFmt, Args...); + return error(ErrorCode::UNKNOWN, ErrFmt, Args...); +} + +inline Error error(ErrorCode Code, const char *S) { + return make_error(Code, S); +} + +inline Error error(const char *S) { + return make_error(ErrorCode::UNKNOWN, S); } /// Check the plugin-specific error code and return an error or success diff --git a/offload/plugins-nextgen/common/src/OffloadError.cpp b/offload/plugins-nextgen/common/src/OffloadError.cpp new file mode 100644 index 0000000000000..d0b05af791bc1 --- /dev/null +++ b/offload/plugins-nextgen/common/src/OffloadError.cpp @@ -0,0 +1,40 @@ +//===- OffloadError.cpp - Error extensions for offload --------------------===// +// +// 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 "OffloadError.h" +#include "llvm/Support/ErrorHandling.h" + +using namespace llvm; +using namespace llvm::omp::target::plugin; + +namespace { +// OffloadError inherits from llvm::StringError which requires a +// std::error_code. Once/if that requirement is removed, then this +// std::error_code machinery can be removed. +class OffloadErrorCategory : public std::error_category { +public: + const char *name() const noexcept override { return "llvm.offload"; } + std::string message(int Condition) const override { + switch (static_cast(Condition)) { +#define OFFLOAD_ERRC(Name, Desc, Value) \ + case ErrorCode::Name: \ + return #Desc; +#include "Shared/OffloadErrcodes.inc" +#undef OFFLOAD_ERRC + } + llvm_unreachable("Unrecognized offload ErrorCode"); + } +}; +} // namespace + +const std::error_category &llvm::omp::target::plugin::OffloadErrCategory() { + static OffloadErrorCategory MSFCategory; + return MSFCategory; +} + +char OffloadError::ID; diff --git a/offload/tools/offload-tblgen/CMakeLists.txt b/offload/tools/offload-tblgen/CMakeLists.txt index e7e7c85490543..613b166d62b4d 100644 --- a/offload/tools/offload-tblgen/CMakeLists.txt +++ b/offload/tools/offload-tblgen/CMakeLists.txt @@ -13,7 +13,7 @@ add_tablegen(offload-tblgen OFFLOAD EXPORT OFFLOAD APIGen.cpp EntryPointGen.cpp - FuncsGen.cpp + MiscGen.cpp GenCommon.hpp Generators.hpp offload-tblgen.cpp @@ -23,4 +23,3 @@ add_tablegen(offload-tblgen OFFLOAD set(OFFLOAD_TABLEGEN_EXE "${OFFLOAD_TABLEGEN_EXE}" CACHE INTERNAL "") set(OFFLOAD_TABLEGEN_TARGET "${OFFLOAD_TABLEGEN_TARGET}" CACHE INTERNAL "") - diff --git a/offload/tools/offload-tblgen/Generators.hpp b/offload/tools/offload-tblgen/Generators.hpp index 8b6104c5cd9c6..f3474dfc52e86 100644 --- a/offload/tools/offload-tblgen/Generators.hpp +++ b/offload/tools/offload-tblgen/Generators.hpp @@ -21,3 +21,5 @@ void EmitOffloadPrintHeader(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitOffloadExports(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitOffloadErrcodes(const llvm::RecordKeeper &Records, + llvm::raw_ostream &OS); diff --git a/offload/tools/offload-tblgen/FuncsGen.cpp b/offload/tools/offload-tblgen/MiscGen.cpp similarity index 77% rename from offload/tools/offload-tblgen/FuncsGen.cpp rename to offload/tools/offload-tblgen/MiscGen.cpp index 3238652176198..b73d70d58c239 100644 --- a/offload/tools/offload-tblgen/FuncsGen.cpp +++ b/offload/tools/offload-tblgen/MiscGen.cpp @@ -72,3 +72,24 @@ void EmitOffloadImplFuncDecls(const RecordKeeper &Records, raw_ostream &OS) { OS << ");\n\n"; } } + +// Emit macro calls for each error enum +void EmitOffloadErrcodes(const RecordKeeper &Records, raw_ostream &OS) { + OS << GenericHeader; + OS << R"( +#ifndef OFFLOAD_ERRC +#error Please define the macro OFFLOAD_ERRCODE(Name, Desc, Value) +#endif + +// Error codes are shared between PluginInterface and liboffload. +// To add new error codes, add them to offload/liboffload/API/Common.td and run the GenerateOffload target. + +)"; + + auto ErrorCodeEnum = EnumRec{Records.getDef("ErrorCode")}; + uint32_t EtorVal = 0; + for (const auto &EnumVal : ErrorCodeEnum.getValues()) { + OS << formatv(TAB_1 "OFFLOAD_ERRC({0}, \"{1}\", {2})\n", EnumVal.getName(), + EnumVal.getDesc(), EtorVal++); + } +} diff --git a/offload/tools/offload-tblgen/offload-tblgen.cpp b/offload/tools/offload-tblgen/offload-tblgen.cpp index 1912abf5265c7..83a4af04b8b22 100644 --- a/offload/tools/offload-tblgen/offload-tblgen.cpp +++ b/offload/tools/offload-tblgen/offload-tblgen.cpp @@ -30,7 +30,8 @@ enum ActionType { GenImplFuncDecls, GenEntryPoints, GenPrintHeader, - GenExports + GenExports, + GenErrcodes, }; namespace { @@ -52,7 +53,9 @@ cl::opt Action( clEnumValN(GenPrintHeader, "gen-print-header", "Generate Offload API print header"), clEnumValN(GenExports, "gen-exports", - "Generate export file for the Offload library"))); + "Generate export file for the Offload library"), + clEnumValN(GenErrcodes, "gen-errcodes", + "Generate Offload Error Code enum"))); } static bool OffloadTableGenMain(raw_ostream &OS, const RecordKeeper &Records) { @@ -81,6 +84,9 @@ static bool OffloadTableGenMain(raw_ostream &OS, const RecordKeeper &Records) { case GenExports: EmitOffloadExports(Records, OS); break; + case GenErrcodes: + EmitOffloadErrcodes(Records, OS); + break; } return false;