xref: /llvm-project/offload/liboffload/src/Helpers.hpp (revision fd3907ccb583df99e9c19d2fe84e4e7c52d75de9)
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