| /*===---- spirv_builtin_vars.h - SPIR-V built-in ---------------------------=== |
| * |
| * 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 __SPIRV_BUILTIN_VARS_H |
| #define __SPIRV_BUILTIN_VARS_H |
| |
| #if __cplusplus >= 201103L |
| #define __SPIRV_NOEXCEPT noexcept |
| #else |
| #define __SPIRV_NOEXCEPT |
| #endif |
| |
| #pragma push_macro("__size_t") |
| #pragma push_macro("__uint32_t") |
| #pragma push_macro("__uint64_t") |
| #define __size_t __SIZE_TYPE__ |
| #define __uint32_t __UINT32_TYPE__ |
| |
| #define __SPIRV_overloadable __attribute__((overloadable)) |
| #define __SPIRV_convergent __attribute__((convergent)) |
| #define __SPIRV_inline __attribute__((always_inline)) |
| |
| #define __global __attribute__((opencl_global)) |
| #define __local __attribute__((opencl_local)) |
| #define __private __attribute__((opencl_private)) |
| #define __constant __attribute__((opencl_constant)) |
| #ifdef __SYCL_DEVICE_ONLY__ |
| #define __generic |
| #else |
| #define __generic __attribute__((opencl_generic)) |
| #endif |
| |
| // Check if SPIR-V builtins are supported. |
| // As the translator doesn't use the LLVM intrinsics (which would be emitted if |
| // we use the SPIR-V builtins) we can't rely on the SPIRV32/SPIRV64 etc macros |
| // to establish if we can use the builtin alias. We disable builtin altogether |
| // if we do not intent to use the backend. So instead of use target macros, rely |
| // on a __has_builtin test. |
| #if (__has_builtin(__builtin_spirv_num_workgroups)) |
| #define __SPIRV_BUILTIN_ALIAS(builtin) \ |
| __attribute__((clang_builtin_alias(builtin))) |
| #else |
| #define __SPIRV_BUILTIN_ALIAS(builtin) |
| #endif |
| |
| // Builtin IDs and sizes |
| |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_num_workgroups) __size_t |
| __spirv_BuiltInNumWorkgroups(int); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_workgroup_size) __size_t |
| __spirv_BuiltInWorkgroupSize(int); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_workgroup_id) __size_t |
| __spirv_BuiltInWorkgroupId(int); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_local_invocation_id) __size_t |
| __spirv_BuiltInLocalInvocationId(int); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_global_invocation_id) __size_t |
| __spirv_BuiltInGlobalInvocationId(int); |
| |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_global_size) __size_t |
| __spirv_BuiltInGlobalSize(int); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_global_offset) __size_t |
| __spirv_BuiltInGlobalOffset(int); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_subgroup_size) __uint32_t |
| __spirv_BuiltInSubgroupSize(); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_subgroup_max_size) __uint32_t |
| __spirv_BuiltInSubgroupMaxSize(); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_num_subgroups) __uint32_t |
| __spirv_BuiltInNumSubgroups(); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_subgroup_id) __uint32_t |
| __spirv_BuiltInSubgroupId(); |
| extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_subgroup_local_invocation_id) |
| __uint32_t __spirv_BuiltInSubgroupLocalInvocationId(); |
| |
| // OpGenericCastToPtrExplicit |
| |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __global void *__spirv_GenericCastToPtrExplicit_ToGlobal(__generic void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __global const void * |
| __spirv_GenericCastToPtrExplicit_ToGlobal(__generic const void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __global volatile void * |
| __spirv_GenericCastToPtrExplicit_ToGlobal(__generic volatile void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __global const volatile void * |
| __spirv_GenericCastToPtrExplicit_ToGlobal(__generic const volatile void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __local void *__spirv_GenericCastToPtrExplicit_ToLocal(__generic void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __local const void * |
| __spirv_GenericCastToPtrExplicit_ToLocal(__generic const void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __local volatile void * |
| __spirv_GenericCastToPtrExplicit_ToLocal(__generic volatile void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __local const volatile void * |
| __spirv_GenericCastToPtrExplicit_ToLocal(__generic const volatile void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __private void * |
| __spirv_GenericCastToPtrExplicit_ToPrivate(__generic void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __private const void * |
| __spirv_GenericCastToPtrExplicit_ToPrivate(__generic const void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __private volatile void * |
| __spirv_GenericCastToPtrExplicit_ToPrivate(__generic volatile void *, |
| int) __SPIRV_NOEXCEPT; |
| extern __SPIRV_overloadable |
| __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) |
| __private const volatile void * |
| __spirv_GenericCastToPtrExplicit_ToPrivate(__generic const volatile void *, |
| int) __SPIRV_NOEXCEPT; |
| |
| // OpGenericCastToPtr |
| |
| static __SPIRV_overloadable __SPIRV_inline __global void * |
| __spirv_GenericCastToPtr_ToGlobal(__generic void *p, int) __SPIRV_NOEXCEPT { |
| return (__global void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __global const void * |
| __spirv_GenericCastToPtr_ToGlobal(__generic const void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__global const void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __global volatile void * |
| __spirv_GenericCastToPtr_ToGlobal(__generic volatile void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__global volatile void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __global const volatile void * |
| __spirv_GenericCastToPtr_ToGlobal(__generic const volatile void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__global const volatile void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __local void * |
| __spirv_GenericCastToPtr_ToLocal(__generic void *p, int) __SPIRV_NOEXCEPT { |
| return (__local void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __local const void * |
| __spirv_GenericCastToPtr_ToLocal(__generic const void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__local const void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __local volatile void * |
| __spirv_GenericCastToPtr_ToLocal(__generic volatile void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__local volatile void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __local const volatile void * |
| __spirv_GenericCastToPtr_ToLocal(__generic const volatile void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__local const volatile void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __private void * |
| __spirv_GenericCastToPtr_ToPrivate(__generic void *p, int) __SPIRV_NOEXCEPT { |
| return (__private void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __private const void * |
| __spirv_GenericCastToPtr_ToPrivate(__generic const void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__private const void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __private volatile void * |
| __spirv_GenericCastToPtr_ToPrivate(__generic volatile void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__private volatile void *)p; |
| } |
| static __SPIRV_overloadable __SPIRV_inline __private const volatile void * |
| __spirv_GenericCastToPtr_ToPrivate(__generic const volatile void *p, |
| int) __SPIRV_NOEXCEPT { |
| return (__private const volatile void *)p; |
| } |
| |
| #pragma pop_macro("__size_t") |
| #pragma pop_macro("__uint32_t") |
| #pragma pop_macro("__uint64_t") |
| |
| #undef __SPIRV_overloadable |
| #undef __SPIRV_convergent |
| #undef __SPIRV_inline |
| |
| #undef __global |
| #undef __local |
| #undef __constant |
| #undef __generic |
| |
| #undef __SPIRV_BUILTIN_ALIAS |
| #undef __SPIRV_NOEXCEPT |
| |
| #endif /* __SPIRV_BUILTIN_VARS_H */ |