1*fd3907ccSCallum Fare //===- helpers.hpp- GetInfo return helpers for the new LLVM/Offload API ---===// 2*fd3907ccSCallum Fare // 3*fd3907ccSCallum Fare // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*fd3907ccSCallum Fare // See https://llvm.org/LICENSE.txt for license information. 5*fd3907ccSCallum Fare // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*fd3907ccSCallum Fare // 7*fd3907ccSCallum Fare //===----------------------------------------------------------------------===// 8*fd3907ccSCallum Fare // 9*fd3907ccSCallum Fare // The getInfo*/ReturnHelper facilities provide shortcut way of writing return 10*fd3907ccSCallum Fare // data + size for the various getInfo APIs. Based on the equivalent 11*fd3907ccSCallum Fare // implementations in Unified Runtime. 12*fd3907ccSCallum Fare // 13*fd3907ccSCallum Fare //===----------------------------------------------------------------------===// 14*fd3907ccSCallum Fare 15*fd3907ccSCallum Fare #include "OffloadAPI.h" 16*fd3907ccSCallum Fare 17*fd3907ccSCallum Fare #include <cstring> 18*fd3907ccSCallum Fare 19*fd3907ccSCallum Fare template <typename T, typename Assign> 20*fd3907ccSCallum Fare ol_errc_t getInfoImpl(size_t ParamValueSize, void *ParamValue, 21*fd3907ccSCallum Fare size_t *ParamValueSizeRet, T Value, size_t ValueSize, 22*fd3907ccSCallum Fare Assign &&AssignFunc) { 23*fd3907ccSCallum Fare if (!ParamValue && !ParamValueSizeRet) { 24*fd3907ccSCallum Fare return OL_ERRC_INVALID_NULL_POINTER; 25*fd3907ccSCallum Fare } 26*fd3907ccSCallum Fare 27*fd3907ccSCallum Fare if (ParamValue != nullptr) { 28*fd3907ccSCallum Fare if (ParamValueSize < ValueSize) { 29*fd3907ccSCallum Fare return OL_ERRC_INVALID_SIZE; 30*fd3907ccSCallum Fare } 31*fd3907ccSCallum Fare AssignFunc(ParamValue, Value, ValueSize); 32*fd3907ccSCallum Fare } 33*fd3907ccSCallum Fare 34*fd3907ccSCallum Fare if (ParamValueSizeRet != nullptr) { 35*fd3907ccSCallum Fare *ParamValueSizeRet = ValueSize; 36*fd3907ccSCallum Fare } 37*fd3907ccSCallum Fare 38*fd3907ccSCallum Fare return OL_ERRC_SUCCESS; 39*fd3907ccSCallum Fare } 40*fd3907ccSCallum Fare 41*fd3907ccSCallum Fare template <typename T> 42*fd3907ccSCallum Fare ol_errc_t getInfo(size_t ParamValueSize, void *ParamValue, 43*fd3907ccSCallum Fare size_t *ParamValueSizeRet, T Value) { 44*fd3907ccSCallum Fare auto Assignment = [](void *ParamValue, T Value, size_t) { 45*fd3907ccSCallum Fare *static_cast<T *>(ParamValue) = Value; 46*fd3907ccSCallum Fare }; 47*fd3907ccSCallum Fare 48*fd3907ccSCallum Fare return getInfoImpl(ParamValueSize, ParamValue, ParamValueSizeRet, Value, 49*fd3907ccSCallum Fare sizeof(T), Assignment); 50*fd3907ccSCallum Fare } 51*fd3907ccSCallum Fare 52*fd3907ccSCallum Fare template <typename T> 53*fd3907ccSCallum Fare ol_errc_t getInfoArray(size_t array_length, size_t ParamValueSize, 54*fd3907ccSCallum Fare void *ParamValue, size_t *ParamValueSizeRet, 55*fd3907ccSCallum Fare const T *Value) { 56*fd3907ccSCallum Fare return getInfoImpl(ParamValueSize, ParamValue, ParamValueSizeRet, Value, 57*fd3907ccSCallum Fare array_length * sizeof(T), memcpy); 58*fd3907ccSCallum Fare } 59*fd3907ccSCallum Fare 60*fd3907ccSCallum Fare template <> 61*fd3907ccSCallum Fare inline ol_errc_t getInfo<const char *>(size_t ParamValueSize, void *ParamValue, 62*fd3907ccSCallum Fare size_t *ParamValueSizeRet, 63*fd3907ccSCallum Fare const char *Value) { 64*fd3907ccSCallum Fare return getInfoArray(strlen(Value) + 1, ParamValueSize, ParamValue, 65*fd3907ccSCallum Fare ParamValueSizeRet, Value); 66*fd3907ccSCallum Fare } 67*fd3907ccSCallum Fare 68*fd3907ccSCallum Fare class ReturnHelper { 69*fd3907ccSCallum Fare public: 70*fd3907ccSCallum Fare ReturnHelper(size_t ParamValueSize, void *ParamValue, 71*fd3907ccSCallum Fare size_t *ParamValueSizeRet) 72*fd3907ccSCallum Fare : ParamValueSize(ParamValueSize), ParamValue(ParamValue), 73*fd3907ccSCallum Fare ParamValueSizeRet(ParamValueSizeRet) {} 74*fd3907ccSCallum Fare 75*fd3907ccSCallum Fare // A version where in/out info size is represented by a single pointer 76*fd3907ccSCallum Fare // to a value which is updated on return 77*fd3907ccSCallum Fare ReturnHelper(size_t *ParamValueSize, void *ParamValue) 78*fd3907ccSCallum Fare : ParamValueSize(*ParamValueSize), ParamValue(ParamValue), 79*fd3907ccSCallum Fare ParamValueSizeRet(ParamValueSize) {} 80*fd3907ccSCallum Fare 81*fd3907ccSCallum Fare // Scalar return Value 82*fd3907ccSCallum Fare template <class T> ol_errc_t operator()(const T &t) { 83*fd3907ccSCallum Fare return getInfo(ParamValueSize, ParamValue, ParamValueSizeRet, t); 84*fd3907ccSCallum Fare } 85*fd3907ccSCallum Fare 86*fd3907ccSCallum Fare // Array return Value 87*fd3907ccSCallum Fare template <class T> ol_errc_t operator()(const T *t, size_t s) { 88*fd3907ccSCallum Fare return getInfoArray(s, ParamValueSize, ParamValue, ParamValueSizeRet, t); 89*fd3907ccSCallum Fare } 90*fd3907ccSCallum Fare 91*fd3907ccSCallum Fare protected: 92*fd3907ccSCallum Fare size_t ParamValueSize; 93*fd3907ccSCallum Fare void *ParamValue; 94*fd3907ccSCallum Fare size_t *ParamValueSizeRet; 95*fd3907ccSCallum Fare }; 96