clang 24.0.0git
__clang_spirv_builtins.h
Go to the documentation of this file.
1/*===---- spirv_builtin_vars.h - SPIR-V built-in ---------------------------===
2 *
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 * See https://llvm.org/LICENSE.txt for license information.
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 *
7 *===-----------------------------------------------------------------------===
8 */
9
10#ifndef __SPIRV_BUILTIN_VARS_H
11#define __SPIRV_BUILTIN_VARS_H
12
13#if __cplusplus >= 201103L
14#define __SPIRV_NOEXCEPT noexcept
15#else
16#define __SPIRV_NOEXCEPT
17#endif
18
19#pragma push_macro("__size_t")
20#pragma push_macro("__uint32_t")
21#pragma push_macro("__uint64_t")
22#define __size_t __SIZE_TYPE__
23#define __uint32_t __UINT32_TYPE__
24
25#define __SPIRV_overloadable __attribute__((overloadable))
26#define __SPIRV_convergent __attribute__((convergent))
27#define __SPIRV_inline __attribute__((always_inline))
28
29#ifdef SYCL_LANGUAGE_VERSION
30#define __SPIRV_GLOBALAS [[clang::sycl_global]]
31#define __SPIRV_LOCALAS [[clang::sycl_local]]
32#define __SPIRV_PRIVATEAS [[clang::sycl_private]]
33#define __SPIRV_GENERICAS [[clang::sycl_generic]]
34#else
35#define __SPIRV_GLOBALAS __attribute__((opencl_global))
36#define __SPIRV_LOCALAS __attribute__((opencl_local))
37#define __SPIRV_PRIVATEAS __attribute__((opencl_private))
38#define __SPIRV_GENERICAS __attribute__((opencl_generic))
39#endif
40
41// Check if SPIR-V builtins are supported.
42// As the translator doesn't use the LLVM intrinsics (which would be emitted if
43// we use the SPIR-V builtins) we can't rely on the SPIRV32/SPIRV64 etc macros
44// to establish if we can use the builtin alias. We disable builtin altogether
45// if we do not intent to use the backend. So instead of use target macros, rely
46// on a __has_builtin test.
47#if (__has_builtin(__builtin_spirv_num_workgroups))
48#define __SPIRV_BUILTIN_ALIAS(builtin) \
49 __attribute__((clang_builtin_alias(builtin)))
50#else
51#define __SPIRV_BUILTIN_ALIAS(builtin)
52#endif
53
54// Builtin IDs and sizes
55
56extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_num_workgroups) __size_t
57 __spirv_BuiltInNumWorkgroups(int);
58extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_workgroup_size) __size_t
59 __spirv_BuiltInWorkgroupSize(int);
60extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_workgroup_id) __size_t
61 __spirv_BuiltInWorkgroupId(int);
62extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_local_invocation_id) __size_t
63 __spirv_BuiltInLocalInvocationId(int);
64extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_global_invocation_id) __size_t
65 __spirv_BuiltInGlobalInvocationId(int);
66
67extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_global_size) __size_t
68 __spirv_BuiltInGlobalSize(int);
69extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_global_offset) __size_t
70 __spirv_BuiltInGlobalOffset(int);
71extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_subgroup_size) __uint32_t
72 __spirv_BuiltInSubgroupSize();
73extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_subgroup_max_size) __uint32_t
74 __spirv_BuiltInSubgroupMaxSize();
75extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_num_subgroups) __uint32_t
76 __spirv_BuiltInNumSubgroups();
77extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_subgroup_id) __uint32_t
78 __spirv_BuiltInSubgroupId();
79extern __SPIRV_BUILTIN_ALIAS(__builtin_spirv_subgroup_local_invocation_id)
80 __uint32_t __spirv_BuiltInSubgroupLocalInvocationId();
81
82// OpGenericCastToPtrExplicit
83
85 __builtin_spirv_generic_cast_to_ptr_explicit) void __SPIRV_GLOBALAS
86 *__spirv_GenericCastToPtrExplicit_ToGlobal(void __SPIRV_GENERICAS *,
89 __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) const
90 void __SPIRV_GLOBALAS *__spirv_GenericCastToPtrExplicit_ToGlobal(
91 const void __SPIRV_GENERICAS *, int) __SPIRV_NOEXCEPT;
93 __builtin_spirv_generic_cast_to_ptr_explicit) volatile void __SPIRV_GLOBALAS
94 *__spirv_GenericCastToPtrExplicit_ToGlobal(
95 volatile void __SPIRV_GENERICAS *, int) __SPIRV_NOEXCEPT;
97 __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) const
98 volatile void __SPIRV_GLOBALAS *__spirv_GenericCastToPtrExplicit_ToGlobal(
99 const volatile void __SPIRV_GENERICAS *, int) __SPIRV_NOEXCEPT;
101 __builtin_spirv_generic_cast_to_ptr_explicit) void __SPIRV_LOCALAS
102 *__spirv_GenericCastToPtrExplicit_ToLocal(void __SPIRV_GENERICAS *,
103 int) __SPIRV_NOEXCEPT;
105 __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) const
106 void __SPIRV_LOCALAS *__spirv_GenericCastToPtrExplicit_ToLocal(
107 const void __SPIRV_GENERICAS *, int) __SPIRV_NOEXCEPT;
109 __builtin_spirv_generic_cast_to_ptr_explicit) volatile void __SPIRV_LOCALAS
110 *__spirv_GenericCastToPtrExplicit_ToLocal(volatile void __SPIRV_GENERICAS *,
111 int) __SPIRV_NOEXCEPT;
113 __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) const
114 volatile void __SPIRV_LOCALAS *__spirv_GenericCastToPtrExplicit_ToLocal(
115 const volatile void __SPIRV_GENERICAS *, int) __SPIRV_NOEXCEPT;
117 __builtin_spirv_generic_cast_to_ptr_explicit) void __SPIRV_PRIVATEAS
118 *__spirv_GenericCastToPtrExplicit_ToPrivate(void __SPIRV_GENERICAS *,
119 int) __SPIRV_NOEXCEPT;
121 __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) const
122 void __SPIRV_PRIVATEAS *__spirv_GenericCastToPtrExplicit_ToPrivate(
123 const void __SPIRV_GENERICAS *, int) __SPIRV_NOEXCEPT;
125 __builtin_spirv_generic_cast_to_ptr_explicit) volatile void __SPIRV_PRIVATEAS
126 *__spirv_GenericCastToPtrExplicit_ToPrivate(
127 volatile void __SPIRV_GENERICAS *, int) __SPIRV_NOEXCEPT;
129 __SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit) const
130 volatile void __SPIRV_PRIVATEAS *__spirv_GenericCastToPtrExplicit_ToPrivate(
131 const volatile void __SPIRV_GENERICAS *, int) __SPIRV_NOEXCEPT;
132
133// OpGenericCastToPtr
134
142 int) __SPIRV_NOEXCEPT {
143 return (const void __SPIRV_GLOBALAS *)p;
144}
147 int) __SPIRV_NOEXCEPT {
148 return (volatile void __SPIRV_GLOBALAS *)p;
149}
151 __SPIRV_inline const volatile void __SPIRV_GLOBALAS *
153 int) __SPIRV_NOEXCEPT {
154 return (const volatile void __SPIRV_GLOBALAS *)p;
155}
163 int) __SPIRV_NOEXCEPT {
164 return (const void __SPIRV_LOCALAS *)p;
165}
168 int) __SPIRV_NOEXCEPT {
169 return (volatile void __SPIRV_LOCALAS *)p;
170}
171static __SPIRV_overloadable __SPIRV_inline const volatile void __SPIRV_LOCALAS *
173 int) __SPIRV_NOEXCEPT {
174 return (const volatile void __SPIRV_LOCALAS *)p;
175}
183 int) __SPIRV_NOEXCEPT {
184 return (const void __SPIRV_PRIVATEAS *)p;
185}
188 int) __SPIRV_NOEXCEPT {
189 return (volatile void __SPIRV_PRIVATEAS *)p;
190}
192 __SPIRV_inline const volatile void __SPIRV_PRIVATEAS *
194 int) __SPIRV_NOEXCEPT {
195 return (const volatile void __SPIRV_PRIVATEAS *)p;
196}
197
198#pragma pop_macro("__size_t")
199#pragma pop_macro("__uint32_t")
200#pragma pop_macro("__uint64_t")
201
202#undef __SPIRV_overloadable
203#undef __SPIRV_convergent
204#undef __SPIRV_inline
205
206#undef __SPIRV_GLOBALAS
207#undef __SPIRV_LOCALAS
208#undef __SPIRV_PRIVATEAS
209#undef __SPIRV_GENERICAS
210
211#undef __SPIRV_BUILTIN_ALIAS
212#undef __SPIRV_NOEXCEPT
213
214#endif /* __SPIRV_BUILTIN_VARS_H */
#define __SPIRV_BUILTIN_ALIAS(builtin)
static __SPIRV_overloadable __SPIRV_inline void __SPIRV_PRIVATEAS * __spirv_GenericCastToPtr_ToPrivate(void __SPIRV_GENERICAS *p, int) __SPIRV_NOEXCEPT
#define __SPIRV_GENERICAS
#define __SPIRV_inline
#define __uint32_t
#define __SPIRV_LOCALAS
#define __SPIRV_GLOBALAS
static __SPIRV_overloadable __SPIRV_inline void __SPIRV_GLOBALAS * __spirv_GenericCastToPtr_ToGlobal(void __SPIRV_GENERICAS *p, int) __SPIRV_NOEXCEPT
#define __SPIRV_PRIVATEAS
#define __SPIRV_NOEXCEPT
#define __SPIRV_overloadable
#define __size_t
static __SPIRV_overloadable __SPIRV_inline void __SPIRV_LOCALAS * __spirv_GenericCastToPtr_ToLocal(void __SPIRV_GENERICAS *p, int) __SPIRV_NOEXCEPT