clang 22.0.0git
OpenMPKinds.h
Go to the documentation of this file.
1//===--- OpenMPKinds.h - OpenMP enums ---------------------------*- 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///
9/// \file
10/// Defines some OpenMP-specific enums and functions.
11///
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_BASIC_OPENMPKINDS_H
15#define LLVM_CLANG_BASIC_OPENMPKINDS_H
16
18#include "llvm/ADT/Sequence.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/Frontend/OpenMP/OMPConstants.h"
21
22namespace clang {
23
24/// OpenMP directives.
25using OpenMPDirectiveKind = llvm::omp::Directive;
26
27/// OpenMP clauses.
28using OpenMPClauseKind = llvm::omp::Clause;
29
30/// OpenMP attributes for 'schedule' clause.
32#define OPENMP_SCHEDULE_KIND(Name) \
33 OMPC_SCHEDULE_##Name,
34#include "clang/Basic/OpenMPKinds.def"
36};
37
38/// OpenMP modifiers for 'schedule' clause.
41#define OPENMP_SCHEDULE_MODIFIER(Name) \
42 OMPC_SCHEDULE_MODIFIER_##Name,
43#include "clang/Basic/OpenMPKinds.def"
45};
46
47/// OpenMP modifiers for 'device' clause.
49#define OPENMP_DEVICE_MODIFIER(Name) OMPC_DEVICE_##Name,
50#include "clang/Basic/OpenMPKinds.def"
52};
53
54/// OpenMP attributes for 'depend' clause.
56#define OPENMP_DEPEND_KIND(Name) \
57 OMPC_DEPEND_##Name,
58#include "clang/Basic/OpenMPKinds.def"
60};
61
62/// OpenMP attributes for 'linear' clause.
64#define OPENMP_LINEAR_KIND(Name) \
65 OMPC_LINEAR_##Name,
66#include "clang/Basic/OpenMPKinds.def"
68};
69
70/// OpenMP mapping kind for 'map' clause.
72#define OPENMP_MAP_KIND(Name) \
73 OMPC_MAP_##Name,
74#include "clang/Basic/OpenMPKinds.def"
76};
77
78/// OpenMP modifier kind for 'map' clause.
81#define OPENMP_MAP_MODIFIER_KIND(Name) \
82 OMPC_MAP_MODIFIER_##Name,
83#include "clang/Basic/OpenMPKinds.def"
85};
86
87/// Number of allowed map-type-modifiers.
88static constexpr unsigned NumberOfOMPMapClauseModifiers =
90
91/// OpenMP modifier kind for 'to' or 'from' clause.
93#define OPENMP_MOTION_MODIFIER_KIND(Name) \
94 OMPC_MOTION_MODIFIER_##Name,
95#include "clang/Basic/OpenMPKinds.def"
97};
98
99/// Number of allowed motion-modifiers.
100static constexpr unsigned NumberOfOMPMotionModifiers =
102
103/// OpenMP attributes for 'dist_schedule' clause.
105#define OPENMP_DIST_SCHEDULE_KIND(Name) OMPC_DIST_SCHEDULE_##Name,
106#include "clang/Basic/OpenMPKinds.def"
108};
109
110/// OpenMP variable-category for 'default' clause.
112#define OPENMP_DEFAULT_VARIABLE_CATEGORY(Name) OMPC_DEFAULT_VC_##Name,
113#include "clang/Basic/OpenMPKinds.def"
115};
116
117/// OpenMP attributes for 'defaultmap' clause.
119#define OPENMP_DEFAULTMAP_KIND(Name) \
120 OMPC_DEFAULTMAP_##Name,
121#include "clang/Basic/OpenMPKinds.def"
123};
124
125/// OpenMP modifiers for 'defaultmap' clause.
128#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
129 OMPC_DEFAULTMAP_MODIFIER_##Name,
130#include "clang/Basic/OpenMPKinds.def"
132};
133
134/// OpenMP attributes for 'atomic_default_mem_order' clause.
136#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
137 OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name,
138#include "clang/Basic/OpenMPKinds.def"
140};
141
142/// OpenMP attributes for 'at' clause.
144#define OPENMP_AT_KIND(Name) OMPC_AT_##Name,
145#include "clang/Basic/OpenMPKinds.def"
147};
148
149/// OpenMP attributes for 'severity' clause.
151#define OPENMP_SEVERITY_KIND(Name) OMPC_SEVERITY_##Name,
152#include "clang/Basic/OpenMPKinds.def"
154};
155
156/// OpenMP device type for 'device_type' clause.
158#define OPENMP_DEVICE_TYPE_KIND(Name) \
159 OMPC_DEVICE_TYPE_##Name,
160#include "clang/Basic/OpenMPKinds.def"
162};
163
164/// OpenMP 'lastprivate' clause modifier.
166#define OPENMP_LASTPRIVATE_KIND(Name) OMPC_LASTPRIVATE_##Name,
167#include "clang/Basic/OpenMPKinds.def"
169};
170
171/// OpenMP attributes for 'order' clause.
173#define OPENMP_ORDER_KIND(Name) OMPC_ORDER_##Name,
174#include "clang/Basic/OpenMPKinds.def"
176};
177
178/// OpenMP modifiers for 'order' clause.
181#define OPENMP_ORDER_MODIFIER(Name) OMPC_ORDER_MODIFIER_##Name,
182#include "clang/Basic/OpenMPKinds.def"
184};
185
186/// Scheduling data for loop-based OpenMP directives.
192
193/// OpenMP modifiers for 'reduction' clause.
195#define OPENMP_REDUCTION_MODIFIER(Name) OMPC_REDUCTION_##Name,
196#include "clang/Basic/OpenMPKinds.def"
198};
199
200/// OpenMP 6.0 original sharing modifiers
202#define OPENMP_ORIGINAL_SHARING_MODIFIER(Name) OMPC_ORIGINAL_SHARING_##Name,
203#include "clang/Basic/OpenMPKinds.def"
205};
206
207/// OpenMP adjust-op kinds for 'adjust_args' clause.
209#define OPENMP_ADJUST_ARGS_KIND(Name) OMPC_ADJUST_ARGS_##Name,
210#include "clang/Basic/OpenMPKinds.def"
212};
213
214/// OpenMP bindings for the 'bind' clause.
216#define OPENMP_BIND_KIND(Name) OMPC_BIND_##Name,
217#include "clang/Basic/OpenMPKinds.def"
219};
220
222#define OPENMP_GRAINSIZE_MODIFIER(Name) OMPC_GRAINSIZE_##Name,
223#include "clang/Basic/OpenMPKinds.def"
225};
226
228#define OPENMP_NUMTASKS_MODIFIER(Name) OMPC_NUMTASKS_##Name,
229#include "clang/Basic/OpenMPKinds.def"
231};
232
234#define OPENMP_NUMTHREADS_MODIFIER(Name) OMPC_NUMTHREADS_##Name,
235#include "clang/Basic/OpenMPKinds.def"
237};
238
239/// OpenMP dependence types for 'doacross' clause.
241#define OPENMP_DOACROSS_MODIFIER(Name) OMPC_DOACROSS_##Name,
242#include "clang/Basic/OpenMPKinds.def"
244};
245
246/// OpenMP modifiers for 'allocate' clause.
248#define OPENMP_ALLOCATE_MODIFIER(Name) OMPC_ALLOCATE_##Name,
249#include "clang/Basic/OpenMPKinds.def"
251};
252
253/// Number of allowed allocate-modifiers.
254static constexpr unsigned NumberOfOMPAllocateClauseModifiers =
256
257/// Contains 'interop' data for 'append_args' and 'init' clauses.
258class Expr;
266
268getOpenMPDefaultVariableCategory(StringRef Str, const LangOptions &LangOpts);
269const char *getOpenMPDefaultVariableCategoryName(unsigned VC);
270
271unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str,
272 const LangOptions &LangOpts);
273const char *getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type);
274
275/// Checks if the specified directive is a directive with an associated
276/// loop construct.
277/// \param DKind Specified directive.
278/// \return true - the directive is a loop-associated directive like 'omp simd'
279/// or 'omp for' directive, otherwise - false.
281
282/// Checks if the specified directive is a worksharing directive.
283/// \param DKind Specified directive.
284/// \return true - the directive is a worksharing directive like 'omp for',
285/// otherwise - false.
287
288/// Checks if the specified directive is a taskloop directive.
289/// \param DKind Specified directive.
290/// \return true - the directive is a worksharing directive like 'omp taskloop',
291/// otherwise - false.
293
294/// Checks if the specified directive is a parallel-kind directive.
295/// \param DKind Specified directive.
296/// \return true - the directive is a parallel-like directive like 'omp
297/// parallel', otherwise - false.
299
300/// Checks if the specified directive is a target code offload directive.
301/// \param DKind Specified directive.
302/// \return true - the directive is a target code offload directive like
303/// 'omp target', 'omp target parallel', 'omp target xxx'
304/// otherwise - false.
306
307/// Checks if the specified directive is a target data offload directive.
308/// \param DKind Specified directive.
309/// \return true - the directive is a target data offload directive like
310/// 'omp target data', 'omp target update', 'omp target enter data',
311/// 'omp target exit data'
312/// otherwise - false.
314
315/// Checks if the specified composite/combined directive constitutes a teams
316/// directive in the outermost nest. For example
317/// 'omp teams distribute' or 'omp teams distribute parallel for'.
318/// \param DKind Specified directive.
319/// \return true - the directive has teams on the outermost nest, otherwise -
320/// false.
322
323/// Checks if the specified directive is a teams-kind directive. For example,
324/// 'omp teams distribute' or 'omp target teams'.
325/// \param DKind Specified directive.
326/// \return true - the directive is a teams-like directive, otherwise - false.
328
329/// Checks if the specified directive is a simd directive.
330/// \param DKind Specified directive.
331/// \return true - the directive is a simd directive like 'omp simd',
332/// otherwise - false.
334
335/// Checks if the specified directive is a distribute directive.
336/// \param DKind Specified directive.
337/// \return true - the directive is a distribute-directive like 'omp
338/// distribute',
339/// otherwise - false.
341
342/// Checks if the specified composite/combined directive constitutes a
343/// distribute directive in the outermost nest. For example,
344/// 'omp distribute parallel for' or 'omp distribute'.
345/// \param DKind Specified directive.
346/// \return true - the directive has distribute on the outermost nest.
347/// otherwise - false.
349
350/// Checks if the specified directive constitutes a 'loop' directive in the
351/// outermost nest. For example, 'omp teams loop' or 'omp loop'.
352/// \param DKind Specified directive.
353/// \return true - the directive has loop on the outermost nest.
354/// otherwise - false.
356
357/// Checks if the specified clause is one of private clauses like
358/// 'private', 'firstprivate', 'reduction' etc..
359/// \param Kind Clause kind.
360/// \return true - the clause is a private clause, otherwise - false.
362
363/// Checks if the specified clause is one of threadprivate clauses like
364/// 'threadprivate', 'copyin' or 'copyprivate'.
365/// \param Kind Clause kind.
366/// \return true - the clause is a threadprivate clause, otherwise - false.
368
369/// Checks if the specified directive kind is one of tasking directives - task,
370/// taskloop, taksloop simd, master taskloop, parallel master taskloop, master
371/// taskloop simd, or parallel master taskloop simd.
373
374/// Checks if the specified directive kind is one of the composite or combined
375/// directives that need loop bound sharing across loops outlined in nested
376/// functions
378
379/// Checks if the specified directive is a loop transformation directive that
380/// applies to a canonical loop nest.
381/// \param DKind Specified directive.
382/// \return True iff the directive is a loop transformation.
384 OpenMPDirectiveKind DKind);
385
386/// Checks if the specified directive is a loop transformation directive.
387/// \param DKind Specified directive.
388/// \return True iff the directive is a loop transformation.
390
391/// Return the captured regions of an OpenMP directive.
394 OpenMPDirectiveKind DKind);
395
396/// Checks if the specified directive is a combined construct for which
397/// the first construct is a parallel construct.
398/// \param DKind Specified directive.
399/// \return true - if the above condition is met for this directive
400/// otherwise - false.
402
403/// Checks if the specified target directive, combined or not, needs task based
404/// thread_limit
405/// \param DKind Specified directive.
406/// \return true - if the above condition is met for this directive
407/// otherwise - false.
409
410/// Checks if the parameter to the fail clause in "#pragma atomic compare fail"
411/// is restricted only to memory order clauses of "OMPC_acquire",
412/// "OMPC_relaxed" and "OMPC_seq_cst".
413bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter);
414
415/// Checks if the specified directive is considered as "executable". This
416/// combines the OpenMP categories of "executable" and "subsidiary", plus
417/// any other directives that should be treated as executable.
418/// \param DKind Specified directive.
419/// \return true - if the above condition is met for this directive
420/// otherwise - false.
422
423/// Checks if the specified directive is considered as "informational".
424/// \param DKind Specified directive.
425/// \return true if it is an informational directive, false otherwise.
427
428/// Checks if the specified directive can capture variables.
429/// \param DKind Specified directive.
430/// \return true - if the above condition is met for this directive
431/// otherwise - false.
433
434/// Checks if the specified directive is an order concurrent nestable
435/// directive that can be nested within region corresponding to construct
436/// on which order clause was specified with concurrent as ordering argument.
437/// \param DKind Specified directive.
438/// \param LangOpts Used for getting the OpenMP version.
439/// \return true - if the above condition is met for this directive
440/// otherwise - false.
442 const LangOptions &LangOpts);
443}
444
445template <>
446struct llvm::enum_iteration_traits<clang::OpenMPDefaultmapClauseKind> {
447 static constexpr bool is_iterable = true;
448};
449#endif
450
Defines the clang::LangOptions interface.
This represents one expression.
Definition Expr.h:112
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
The base class of the type hierarchy.
Definition TypeBase.h:1833
The JSON file list parser is used to communicate input to InstallAPI.
bool isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a worksharing directive.
bool needsTaskBasedThreadLimit(OpenMPDirectiveKind DKind)
Checks if the specified target directive, combined or not, needs task based thread_limit.
OpenMPOriginalSharingModifier
OpenMP 6.0 original sharing modifiers.
@ OMPC_ORIGINAL_SHARING_unknown
bool isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind)
Checks if the specified composite/combined directive constitutes a teams directive in the outermost n...
bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter)
Checks if the parameter to the fail clause in "#pragma atomic compare fail" is restricted only to mem...
bool isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a target data offload directive.
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
@ OMPC_DEFAULT_VC_unknown
bool isOpenMPLoopTransformationDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a loop transformation directive.
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
@ OMPC_DEFAULTMAP_MODIFIER_last
@ OMPC_DEFAULTMAP_MODIFIER_unknown
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
@ OMPC_ORDER_MODIFIER_unknown
@ OMPC_ORDER_MODIFIER_last
OpenMPAdjustArgsOpKind
OpenMP adjust-op kinds for 'adjust_args' clause.
@ OMPC_ADJUST_ARGS_unknown
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
@ OMPC_AT_unknown
bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a distribute directive.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
@ OMPC_REDUCTION_unknown
OpenMPDeviceType
OpenMP device type for 'device_type' clause.
@ OMPC_DEVICE_TYPE_unknown
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
Definition OpenMPKinds.h:39
@ OMPC_SCHEDULE_MODIFIER_last
Definition OpenMPKinds.h:44
@ OMPC_SCHEDULE_MODIFIER_unknown
Definition OpenMPKinds.h:40
const char * getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type)
static constexpr unsigned NumberOfOMPAllocateClauseModifiers
Number of allowed allocate-modifiers.
bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a parallel-kind directive.
bool isOpenMPPrivate(OpenMPClauseKind Kind)
Checks if the specified clause is one of private clauses like 'private', 'firstprivate',...
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
@ OMPC_DIST_SCHEDULE_unknown
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
@ OMPC_DOACROSS_unknown
bool isOpenMPTaskingDirective(OpenMPDirectiveKind Kind)
Checks if the specified directive kind is one of tasking directives - task, taskloop,...
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
Definition OpenMPKinds.h:88
bool isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a target code offload directive.
bool isOpenMPTeamsDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a teams-kind directive.
bool isOpenMPGenericLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive constitutes a 'loop' directive in the outermost nest.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
@ OMPC_BIND_unknown
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ OMPC_LASTPRIVATE_unknown
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
Definition OpenMPKinds.h:55
@ OMPC_DEPEND_unknown
Definition OpenMPKinds.h:59
OpenMPGrainsizeClauseModifier
@ OMPC_GRAINSIZE_unknown
unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str, const LangOptions &LangOpts)
bool isOpenMPCanonicalLoopNestTransformationDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a loop transformation directive that applies to a canonical loop...
OpenMPNumTasksClauseModifier
@ OMPC_NUMTASKS_unknown
bool isOpenMPOrderConcurrentNestableDirective(OpenMPDirectiveKind DKind, const LangOptions &LangOpts)
Checks if the specified directive is an order concurrent nestable directive that can be nested within...
bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a directive with an associated loop construct.
bool isOpenMPCapturingDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive can capture variables.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
@ OMPC_SEVERITY_unknown
bool isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind)
Checks if the specified directive kind is one of the composite or combined directives that need loop ...
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
Definition OpenMPKinds.h:92
@ OMPC_MOTION_MODIFIER_unknown
Definition OpenMPKinds.h:96
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
@ OMPC_DEFAULTMAP_unknown
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
@ OMPC_ALLOCATE_unknown
bool isOpenMPThreadPrivate(OpenMPClauseKind Kind)
Checks if the specified clause is one of threadprivate clauses like 'threadprivate',...
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
Definition OpenMPKinds.h:63
@ OMPC_LINEAR_unknown
Definition OpenMPKinds.h:67
bool isOpenMPExecutableDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is considered as "executable".
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
Definition OpenMPKinds.h:25
bool isOpenMPInformationalDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is considered as "informational".
bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a simd directive.
void getOpenMPCaptureRegions(llvm::SmallVectorImpl< OpenMPDirectiveKind > &CaptureRegions, OpenMPDirectiveKind DKind)
Return the captured regions of an OpenMP directive.
OpenMPNumThreadsClauseModifier
@ OMPC_NUMTHREADS_unknown
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
@ OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown
const char * getOpenMPDefaultVariableCategoryName(unsigned VC)
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
Definition OpenMPKinds.h:48
@ OMPC_DEVICE_unknown
Definition OpenMPKinds.h:51
OpenMPMapModifierKind
OpenMP modifier kind for 'map' clause.
Definition OpenMPKinds.h:79
@ OMPC_MAP_MODIFIER_last
Definition OpenMPKinds.h:84
@ OMPC_MAP_MODIFIER_unknown
Definition OpenMPKinds.h:80
bool isOpenMPCombinedParallelADirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a combined construct for which the first construct is a parallel...
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
Definition OpenMPKinds.h:28
bool isOpenMPNestingDistributeDirective(OpenMPDirectiveKind DKind)
Checks if the specified composite/combined directive constitutes a distribute directive in the outerm...
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
@ OMPC_ORDER_unknown
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
Definition OpenMPKinds.h:31
@ OMPC_SCHEDULE_unknown
Definition OpenMPKinds.h:35
bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a taskloop directive.
OpenMPDefaultClauseVariableCategory getOpenMPDefaultVariableCategory(StringRef Str, const LangOptions &LangOpts)
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
Definition OpenMPKinds.h:71
@ OMPC_MAP_unknown
Definition OpenMPKinds.h:75
OMPInteropInfo(bool IsTarget=false, bool IsTargetSync=false)
llvm::SmallVector< Expr *, 4 > PreferTypes
Scheduling data for loop-based OpenMP directives.
OpenMPScheduleClauseModifier M2
OpenMPScheduleClauseModifier M1
OpenMPScheduleClauseKind Schedule