16#ifndef FORTRAN_RUNTIME_API_ATTRS_H_
17#define FORTRAN_RUNTIME_API_ATTRS_H_
26#ifndef RT_EXT_API_GROUP_BEGIN
27#if defined(OMP_NOHOST_BUILD)
28#define RT_EXT_API_GROUP_BEGIN \
29 _Pragma("omp begin declare target device_type(nohost)")
30#elif defined(OMP_OFFLOAD_BUILD)
31#define RT_EXT_API_GROUP_BEGIN _Pragma("omp declare target")
33#define RT_EXT_API_GROUP_BEGIN
37#ifndef RT_EXT_API_GROUP_END
38#if defined(OMP_NOHOST_BUILD) || defined(OMP_OFFLOAD_BUILD)
39#define RT_EXT_API_GROUP_END _Pragma("omp end declare target")
41#define RT_EXT_API_GROUP_END
54#define RT_OFFLOAD_API_GROUP_BEGIN RT_EXT_API_GROUP_BEGIN
55#define RT_OFFLOAD_API_GROUP_END RT_EXT_API_GROUP_END
63#define RT_OFFLOAD_VAR_GROUP_BEGIN RT_EXT_API_GROUP_BEGIN
64#define RT_OFFLOAD_VAR_GROUP_END RT_EXT_API_GROUP_END
73#ifndef RT_VAR_GROUP_BEGIN
74#define RT_VAR_GROUP_BEGIN RT_EXT_API_GROUP_BEGIN
77#ifndef RT_VAR_GROUP_END
78#define RT_VAR_GROUP_END RT_EXT_API_GROUP_END
90#if defined(__CUDACC__) || defined(__CUDA__)
91#define RT_API_ATTRS __host__ __device__
104#ifndef RT_CONST_VAR_ATTRS
105#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
106#define RT_CONST_VAR_ATTRS __constant__
108#define RT_CONST_VAR_ATTRS
117#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
118#define RT_VAR_ATTRS __device__
129#if ((defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)) || \
130 (defined(_OPENMP) && (defined(__AMDGCN__) || defined(__NVPTX__)))
131#define RT_DEVICE_COMPILATION 1
133#undef RT_DEVICE_COMPILATION
142#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
143#define RT_DEVICE_AVOID_RECURSION 1
145#undef RT_DEVICE_AVOID_RECURSION
148#if defined(__CUDACC__)
149#define RT_DIAG_PUSH _Pragma("nv_diagnostic push")
150#define RT_DIAG_POP _Pragma("nv_diagnostic pop")
151#define RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN \
152 _Pragma("nv_diag_suppress 20011") _Pragma("nv_diag_suppress 20014")
156#define RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN
165#ifndef __has_attribute
166#define __has_attribute(x) 0
168#if __has_attribute(noinline)
169#define RT_NOINLINE_ATTR __attribute__((noinline))
171#define RT_NOINLINE_ATTR
173#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
174#define RT_DEVICE_NOINLINE RT_NOINLINE_ATTR
175#define RT_DEVICE_NOINLINE_HOST_INLINE
177#define RT_DEVICE_NOINLINE
178#define RT_DEVICE_NOINLINE_HOST_INLINE inline
182#if __has_attribute(optimize)
184#define RT_OPTNONE_ATTR __attribute__((optimize("O0")))
185#elif __has_attribute(optnone)
187#define RT_OPTNONE_ATTR __attribute__((optnone))
189#define RT_OPTNONE_ATTR
193#if !defined(FLANG_LITTLE_ENDIAN) && !defined(FLANG_BIG_ENDIAN)
197#if defined(_MSC_VER) || defined(_WIN32)
198#define FLANG_LITTLE_ENDIAN 1
199#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
200#define FLANG_LITTLE_ENDIAN 1
201#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
202#define FLANG_BIG_ENDIAN 1
204#error "Unknown or unsupported endianness."