| //===-- LanguageUtils.h - Kernel Language utility functions ---------------===// |
| // |
| // 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 LLVM_OFFLOAD_LANGUAGES_KERNEL_INCLUDE_LANGUAGE_UTILS_H |
| #define LLVM_OFFLOAD_LANGUAGES_KERNEL_INCLUDE_LANGUAGE_UTILS_H |
| |
| #include "LanguageRuntime.h" |
| #include "OffloadAPI.h" |
| #include "State.h" |
| #include "Stream.h" |
| |
| namespace llvm { |
| namespace offload { |
| |
| /// Convert an ol_result_t to the active language's Error_t. |
| static inline Error_t convertResult(ol_result_t Result) { |
| if (Result == OL_SUCCESS) |
| return Success; |
| switch (Result->Code) { |
| case OL_ERRC_INVALID_VALUE: |
| case OL_ERRC_INVALID_ARGUMENT: |
| case OL_ERRC_INVALID_NULL_POINTER: |
| return ErrorInvalidValue; |
| case OL_ERRC_INVALID_SIZE: |
| return ErrorInvalidConfiguration; |
| case OL_ERRC_INVALID_NULL_HANDLE: |
| case OL_ERRC_INVALID_QUEUE: |
| case OL_ERRC_INVALID_EVENT: |
| case OL_ERRC_INVALID_CONTEXT: |
| return ErrorInvalidResourceHandle; |
| case OL_ERRC_INVALID_DEVICE: |
| return ErrorInvalidDevice; |
| default: |
| return ErrorUnknown; |
| } |
| } |
| |
| /// Set the last error for the current thread and return it. |
| static inline Error_t setLastError(Error_t Error) { |
| // TODO: find a more efficient way to set last error |
| return static_cast<Error_t>(ThreadStateTy::get().setLastError(Error)); |
| } |
| |
| /// Convert an ol_result_t to the active language's Error_t and set it as the |
| /// last error for the current thread. |
| static inline Error_t convertAndSetLastError(ol_result_t Result) { |
| return setLastError(convertResult(Result)); |
| } |
| |
| /// Convert between the language-facing opaque stream and the internal stream. |
| static inline Stream_t toLanguageStream(StreamTy *Stream) { |
| return reinterpret_cast<Stream_t>(Stream); |
| } |
| |
| static inline StreamTy *toInternalStream(Stream_t Stream) { |
| return reinterpret_cast<StreamTy *>(Stream); |
| } |
| |
| /// Convert a Stream_t to an ol_queue_handle_t. |
| static inline Error_t getQueueFromStream(Stream_t Stream, |
| ol_queue_handle_t *Queue) { |
| if (!Stream) |
| return ErrorInvalidValue; |
| |
| // TODO: add proper DEBUG/assert guarded checks |
| StreamTy *InternalStream = toInternalStream(Stream); |
| *Queue = InternalStream->Queue; |
| return Success; |
| } |
| |
| } // namespace offload |
| } // namespace llvm |
| |
| #endif // LLVM_OFFLOAD_LANGUAGES_KERNEL_INCLUDE_LANGUAGE_UTILS_H |