1//===--- OMPKinds.def - OpenMP directives, clauses, rt-calls -*- C++ -*-===//
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/// \file
9///
10/// This file defines the list of supported OpenMP directives, clauses, runtime
11/// calls, and other things that need to be listed in enums.
12///
13//===----------------------------------------------------------------------===//
14
15/// OpenMP Directives and combined directives
16///
17///{
18
19#ifndef OMP_DIRECTIVE
20#define OMP_DIRECTIVE(Enum, Str)
21#endif
22
23#define __OMP_DIRECTIVE_EXT(Name, Str) OMP_DIRECTIVE(OMPD_##Name, Str)
24#define __OMP_DIRECTIVE(Name) __OMP_DIRECTIVE_EXT(Name, #Name)
25
26__OMP_DIRECTIVE(threadprivate)
27__OMP_DIRECTIVE(parallel)
28__OMP_DIRECTIVE(task)
29__OMP_DIRECTIVE(simd)
30__OMP_DIRECTIVE(for)
31__OMP_DIRECTIVE(sections)
32__OMP_DIRECTIVE(section)
33__OMP_DIRECTIVE(single)
34__OMP_DIRECTIVE(master)
35__OMP_DIRECTIVE(critical)
36__OMP_DIRECTIVE(taskyield)
37__OMP_DIRECTIVE(barrier)
38__OMP_DIRECTIVE(taskwait)
39__OMP_DIRECTIVE(taskgroup)
40__OMP_DIRECTIVE(flush)
41__OMP_DIRECTIVE(ordered)
42__OMP_DIRECTIVE(atomic)
43__OMP_DIRECTIVE(target)
44__OMP_DIRECTIVE(teams)
45__OMP_DIRECTIVE(cancel)
46__OMP_DIRECTIVE(requires)
47__OMP_DIRECTIVE_EXT(target_data, "target data")
48__OMP_DIRECTIVE_EXT(target_enter_data, "target enter data")
49__OMP_DIRECTIVE_EXT(target_exit_data, "target exit data")
50__OMP_DIRECTIVE_EXT(target_parallel, "target parallel")
51__OMP_DIRECTIVE_EXT(target_parallel_for, "target parallel for")
52__OMP_DIRECTIVE_EXT(target_update, "target update")
53__OMP_DIRECTIVE_EXT(parallel_for, "parallel for")
54__OMP_DIRECTIVE_EXT(parallel_for_simd, "parallel for simd")
55__OMP_DIRECTIVE_EXT(parallel_master, "parallel master")
56__OMP_DIRECTIVE_EXT(parallel_sections, "parallel sections")
57__OMP_DIRECTIVE_EXT(for_simd, "for simd")
58__OMP_DIRECTIVE_EXT(cancellation_point, "cancellation point")
59__OMP_DIRECTIVE_EXT(declare_reduction, "declare reduction")
60__OMP_DIRECTIVE_EXT(declare_mapper, "declare mapper")
61__OMP_DIRECTIVE_EXT(declare_simd, "declare simd")
62__OMP_DIRECTIVE(taskloop)
63__OMP_DIRECTIVE_EXT(taskloop_simd, "taskloop simd")
64__OMP_DIRECTIVE(distribute)
65__OMP_DIRECTIVE_EXT(declare_target, "declare target")
66__OMP_DIRECTIVE_EXT(end_declare_target, "end declare target")
67__OMP_DIRECTIVE_EXT(distribute_parallel_for, "distribute parallel for")
68__OMP_DIRECTIVE_EXT(distribute_parallel_for_simd,
69                    "distribute parallel for simd")
70__OMP_DIRECTIVE_EXT(distribute_simd, "distribute simd")
71__OMP_DIRECTIVE_EXT(target_parallel_for_simd, "target parallel for simd")
72__OMP_DIRECTIVE_EXT(target_simd, "target simd")
73__OMP_DIRECTIVE_EXT(teams_distribute, "teams distribute")
74__OMP_DIRECTIVE_EXT(teams_distribute_simd, "teams distribute simd")
75__OMP_DIRECTIVE_EXT(teams_distribute_parallel_for_simd,
76                    "teams distribute parallel for simd")
77__OMP_DIRECTIVE_EXT(teams_distribute_parallel_for,
78                    "teams distribute parallel for")
79__OMP_DIRECTIVE_EXT(target_teams, "target teams")
80__OMP_DIRECTIVE_EXT(target_teams_distribute, "target teams distribute")
81__OMP_DIRECTIVE_EXT(target_teams_distribute_parallel_for,
82                    "target teams distribute parallel for")
83__OMP_DIRECTIVE_EXT(target_teams_distribute_parallel_for_simd,
84                    "target teams distribute parallel for simd")
85__OMP_DIRECTIVE_EXT(target_teams_distribute_simd,
86                    "target teams distribute simd")
87__OMP_DIRECTIVE(allocate)
88__OMP_DIRECTIVE_EXT(declare_variant, "declare variant")
89__OMP_DIRECTIVE_EXT(master_taskloop, "master taskloop")
90__OMP_DIRECTIVE_EXT(parallel_master_taskloop, "parallel master taskloop")
91__OMP_DIRECTIVE_EXT(master_taskloop_simd, "master taskloop simd")
92__OMP_DIRECTIVE_EXT(parallel_master_taskloop_simd,
93                    "parallel master taskloop simd")
94
95// Has to be the last because Clang implicitly expects it to be.
96__OMP_DIRECTIVE(unknown)
97
98#undef __OMP_DIRECTIVE_EXT
99#undef __OMP_DIRECTIVE
100#undef OMP_DIRECTIVE
101
102///}
103
104/// Types used in runtime structs or runtime functions
105///
106///{
107
108#ifndef OMP_TYPE
109#define OMP_TYPE(VarName, InitValue)
110#endif
111
112#define __OMP_TYPE(VarName) OMP_TYPE(VarName, Type::get##VarName##Ty(Ctx))
113
114__OMP_TYPE(Void)
115__OMP_TYPE(Int8)
116__OMP_TYPE(Int32)
117__OMP_TYPE(Int8Ptr)
118__OMP_TYPE(Int32Ptr)
119
120#undef __OMP_TYPE
121#undef OMP_TYPE
122
123///}
124
125/// Struct and function types
126///
127///{
128
129#ifndef OMP_STRUCT_TYPE
130#define OMP_STRUCT_TYPE(VarName, StructName, ...)
131#endif
132
133#define __OMP_STRUCT_TYPE(VarName, Name, ...)                                  \
134  OMP_STRUCT_TYPE(VarName, "struct." #Name, __VA_ARGS__)
135
136__OMP_STRUCT_TYPE(Ident, ident_t, Int32, Int32, Int32, Int32, Int8Ptr)
137
138#undef __OMP_STRUCT_TYPE
139#undef OMP_STRUCT_TYPE
140
141#ifndef OMP_FUNCTION_TYPE
142#define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...)
143#endif
144
145#define __OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...)                \
146  OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, __VA_ARGS__)
147
148__OMP_FUNCTION_TYPE(ParallelTask, true, Void, Int32Ptr, Int32Ptr)
149
150#undef __OMP_FUNCTION_TYPE
151#undef OMP_FUNCTION_TYPE
152
153///}
154
155/// Runtime library function (and their attributes)
156///
157///{
158
159#ifndef OMP_RTL
160#define OMP_RTL(Enum, Str, IsVarArg, ReturnType, ...)
161#endif
162
163#define __OMP_RTL(Name, IsVarArg, ReturnType, ...)                             \
164  OMP_RTL(OMPRTL_##Name, #Name, IsVarArg, ReturnType, __VA_ARGS__)
165
166__OMP_RTL(__kmpc_barrier, false, Void, IdentPtr, Int32)
167__OMP_RTL(__kmpc_cancel, false, Int32, IdentPtr, Int32, Int32)
168__OMP_RTL(__kmpc_cancel_barrier, false, Int32, IdentPtr, Int32)
169__OMP_RTL(__kmpc_global_thread_num, false, Int32, IdentPtr)
170__OMP_RTL(__kmpc_fork_call, true, Void, IdentPtr, Int32, ParallelTaskPtr)
171__OMP_RTL(__kmpc_push_num_threads, false, Void, IdentPtr, Int32,
172          /* Int */ Int32)
173__OMP_RTL(__kmpc_push_proc_bind, false, Void, IdentPtr, Int32, /* Int */ Int32)
174__OMP_RTL(__kmpc_serialized_parallel, false, Void, IdentPtr, Int32)
175__OMP_RTL(__kmpc_end_serialized_parallel, false, Void, IdentPtr, Int32)
176
177__OMP_RTL(omp_get_thread_num, false, Int32, )
178
179#undef __OMP_RTL
180#undef OMP_RTL
181
182#define EnumAttr(Kind) Attribute::get(Ctx, Attribute::AttrKind::Kind)
183#define AttributeSet(...)                                                      \
184  AttributeSet::get(Ctx, ArrayRef<Attribute>({__VA_ARGS__}))
185
186#ifndef OMP_ATTRS_SET
187#define OMP_ATTRS_SET(VarName, AttrSet)
188#endif
189
190#define __OMP_ATTRS_SET(VarName, AttrSet) OMP_ATTRS_SET(VarName, AttrSet)
191
192__OMP_ATTRS_SET(GetterAttrs,
193                OptimisticAttributes
194                    ? AttributeSet(EnumAttr(NoUnwind), EnumAttr(ReadOnly),
195                                   EnumAttr(NoSync), EnumAttr(NoFree))
196                    : AttributeSet(EnumAttr(NoUnwind)))
197
198#undef __OMP_ATTRS_SET
199#undef OMP_ATTRS_SET
200
201#ifndef OMP_RTL_ATTRS
202#define OMP_RTL_ATTRS(Enum, FnAttrSet, RetAttrSet, ArgAttrSets)
203#endif
204
205#define __OMP_RTL_ATTRS(Name, FnAttrSet, RetAttrSet, ArgAttrSets)              \
206  OMP_RTL_ATTRS(OMPRTL_##Name, FnAttrSet, RetAttrSet, ArgAttrSets)
207
208__OMP_RTL_ATTRS(__kmpc_fork_call, AttributeSet(EnumAttr(NoUnwind)),
209                AttributeSet(), {})
210
211__OMP_RTL_ATTRS(__kmpc_global_thread_num, GetterAttrs, AttributeSet(), {})
212__OMP_RTL_ATTRS(omp_get_thread_num, GetterAttrs, AttributeSet(), {})
213
214#undef __OMP_RTL_ATTRS
215#undef OMP_RTL_ATTRS
216#undef AttributeSet
217#undef EnumAttr
218
219///}
220
221/// KMP ident_t bit flags
222///
223/// In accordance with the values in `openmp/runtime/src/kmp.h`.
224///
225///{
226
227#ifndef OMP_IDENT_FLAG
228#define OMP_IDENT_FLAG(Enum, Str, Value)
229#endif
230
231#define __OMP_IDENT_FLAG(Name, Value)                                          \
232  OMP_IDENT_FLAG(OMP_IDENT_FLAG_##Name, #Name, Value)
233
234__OMP_IDENT_FLAG(KMPC, 0x02)
235__OMP_IDENT_FLAG(BARRIER_EXPL, 0x20)
236__OMP_IDENT_FLAG(BARRIER_IMPL, 0x0040)
237__OMP_IDENT_FLAG(BARRIER_IMPL_MASK, 0x01C0)
238__OMP_IDENT_FLAG(BARRIER_IMPL_FOR, 0x0040)
239__OMP_IDENT_FLAG(BARRIER_IMPL_SECTIONS, 0x00C0)
240__OMP_IDENT_FLAG(BARRIER_IMPL_SINGLE, 0x0140)
241__OMP_IDENT_FLAG(BARRIER_IMPL_WORKSHARE, 0x01C0)
242
243#undef __OMP_IDENT_FLAG
244#undef OMP_IDENT_FLAG
245
246///}
247
248/// KMP cancel kind
249///
250///{
251
252#ifndef OMP_CANCEL_KIND
253#define OMP_CANCEL_KIND(Enum, Str, DirectiveEnum, Value)
254#endif
255
256#define __OMP_CANCEL_KIND(Name, Value)                                         \
257  OMP_CANCEL_KIND(OMP_CANCEL_KIND_##Name, #Name, OMPD_##Name, Value)
258
259__OMP_CANCEL_KIND(parallel, 1)
260__OMP_CANCEL_KIND(for, 2)
261__OMP_CANCEL_KIND(sections, 3)
262__OMP_CANCEL_KIND(taskgroup, 4)
263
264#undef __OMP_CANCEL_KIND
265#undef OMP_CANCEL_KIND
266
267///}
268
269/// Proc bind kinds
270///
271///{
272
273#ifndef OMP_PROC_BIND_KIND
274#define OMP_PROC_BIND_KIND(Enum, Str, Value)
275#endif
276
277#define __OMP_PROC_BIND_KIND(Name, Value)                                      \
278  OMP_PROC_BIND_KIND(OMP_PROC_BIND_##Name, #Name, Value)
279
280__OMP_PROC_BIND_KIND(master, 2)
281__OMP_PROC_BIND_KIND(close, 3)
282__OMP_PROC_BIND_KIND(spread, 4)
283__OMP_PROC_BIND_KIND(default, 6)
284__OMP_PROC_BIND_KIND(unknown, 7)
285
286#undef __OMP_PROC_BIND_KIND
287#undef OMP_PROC_BIND_KIND
288
289///}
290