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(__AMDGPU__) || defined(__NVPTX__)
143#define RT_GPU_TARGET 1
154#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
155#define RT_DEVICE_AVOID_RECURSION 1
157#undef RT_DEVICE_AVOID_RECURSION
160#if defined(__CUDACC__)
161#define RT_DIAG_PUSH _Pragma("nv_diagnostic push")
162#define RT_DIAG_POP _Pragma("nv_diagnostic pop")
163#define RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN \
164 _Pragma("nv_diag_suppress 20011") _Pragma("nv_diag_suppress 20014")
168#define RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN
177#ifndef __has_attribute
178#define __has_attribute(x) 0
180#if __has_attribute(noinline)
181#define RT_NOINLINE_ATTR __attribute__((noinline))
183#define RT_NOINLINE_ATTR
185#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
186#define RT_DEVICE_NOINLINE RT_NOINLINE_ATTR
187#define RT_DEVICE_NOINLINE_HOST_INLINE
189#define RT_DEVICE_NOINLINE
190#define RT_DEVICE_NOINLINE_HOST_INLINE inline
194#if __has_attribute(optimize)
196#define RT_OPTNONE_ATTR __attribute__((optimize("O0")))
197#elif __has_attribute(optnone)
199#define RT_OPTNONE_ATTR __attribute__((optnone))
201#define RT_OPTNONE_ATTR
205#if !defined(FLANG_LITTLE_ENDIAN) && !defined(FLANG_BIG_ENDIAN)
209#if defined(_MSC_VER) || defined(_WIN32)
210#define FLANG_LITTLE_ENDIAN 1
211#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
212#define FLANG_LITTLE_ENDIAN 1
213#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
214#define FLANG_BIG_ENDIAN 1
216#error "Unknown or unsupported endianness."