1//===--- OpenMPKinds.h - OpenMP enums ---------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9///
10/// \file
11/// \brief Defines some OpenMP-specific enums and functions.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_BASIC_OPENMPKINDS_H
16#define LLVM_CLANG_BASIC_OPENMPKINDS_H
17
18#include "llvm/ADT/StringRef.h"
19
20namespace clang {
21
22/// \brief OpenMP directives.
23enum OpenMPDirectiveKind {
24#define OPENMP_DIRECTIVE(Name) \
25  OMPD_##Name,
26#define OPENMP_DIRECTIVE_EXT(Name, Str) \
27  OMPD_##Name,
28#include "clang/Basic/OpenMPKinds.def"
29  OMPD_unknown
30};
31
32/// \brief OpenMP clauses.
33enum OpenMPClauseKind {
34#define OPENMP_CLAUSE(Name, Class) \
35  OMPC_##Name,
36#include "clang/Basic/OpenMPKinds.def"
37  OMPC_threadprivate,
38  OMPC_uniform,
39  OMPC_unknown
40};
41
42/// \brief OpenMP attributes for 'default' clause.
43enum OpenMPDefaultClauseKind {
44#define OPENMP_DEFAULT_KIND(Name) \
45  OMPC_DEFAULT_##Name,
46#include "clang/Basic/OpenMPKinds.def"
47  OMPC_DEFAULT_unknown
48};
49
50/// \brief OpenMP attributes for 'proc_bind' clause.
51enum OpenMPProcBindClauseKind {
52#define OPENMP_PROC_BIND_KIND(Name) \
53  OMPC_PROC_BIND_##Name,
54#include "clang/Basic/OpenMPKinds.def"
55  OMPC_PROC_BIND_unknown
56};
57
58/// \brief OpenMP attributes for 'schedule' clause.
59enum OpenMPScheduleClauseKind {
60#define OPENMP_SCHEDULE_KIND(Name) \
61  OMPC_SCHEDULE_##Name,
62#include "clang/Basic/OpenMPKinds.def"
63  OMPC_SCHEDULE_unknown
64};
65
66/// \brief OpenMP modifiers for 'schedule' clause.
67enum OpenMPScheduleClauseModifier {
68  OMPC_SCHEDULE_MODIFIER_unknown = OMPC_SCHEDULE_unknown,
69#define OPENMP_SCHEDULE_MODIFIER(Name) \
70  OMPC_SCHEDULE_MODIFIER_##Name,
71#include "clang/Basic/OpenMPKinds.def"
72  OMPC_SCHEDULE_MODIFIER_last
73};
74
75/// \brief OpenMP attributes for 'depend' clause.
76enum OpenMPDependClauseKind {
77#define OPENMP_DEPEND_KIND(Name) \
78  OMPC_DEPEND_##Name,
79#include "clang/Basic/OpenMPKinds.def"
80  OMPC_DEPEND_unknown
81};
82
83/// \brief OpenMP attributes for 'linear' clause.
84enum OpenMPLinearClauseKind {
85#define OPENMP_LINEAR_KIND(Name) \
86  OMPC_LINEAR_##Name,
87#include "clang/Basic/OpenMPKinds.def"
88  OMPC_LINEAR_unknown
89};
90
91/// \brief OpenMP mapping kind for 'map' clause.
92enum OpenMPMapClauseKind {
93#define OPENMP_MAP_KIND(Name) \
94  OMPC_MAP_##Name,
95#include "clang/Basic/OpenMPKinds.def"
96  OMPC_MAP_unknown
97};
98
99/// \brief OpenMP attributes for 'dist_schedule' clause.
100enum OpenMPDistScheduleClauseKind {
101#define OPENMP_DIST_SCHEDULE_KIND(Name) OMPC_DIST_SCHEDULE_##Name,
102#include "clang/Basic/OpenMPKinds.def"
103  OMPC_DIST_SCHEDULE_unknown
104};
105
106/// \brief OpenMP attributes for 'defaultmap' clause.
107enum OpenMPDefaultmapClauseKind {
108#define OPENMP_DEFAULTMAP_KIND(Name) \
109  OMPC_DEFAULTMAP_##Name,
110#include "clang/Basic/OpenMPKinds.def"
111  OMPC_DEFAULTMAP_unknown
112};
113
114/// \brief OpenMP modifiers for 'defaultmap' clause.
115enum OpenMPDefaultmapClauseModifier {
116  OMPC_DEFAULTMAP_MODIFIER_unknown = OMPC_DEFAULTMAP_unknown,
117#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
118  OMPC_DEFAULTMAP_MODIFIER_##Name,
119#include "clang/Basic/OpenMPKinds.def"
120  OMPC_DEFAULTMAP_MODIFIER_last
121};
122
123/// Scheduling data for loop-based OpenMP directives.
124struct OpenMPScheduleTy final {
125  OpenMPScheduleClauseKind Schedule = OMPC_SCHEDULE_unknown;
126  OpenMPScheduleClauseModifier M1 = OMPC_SCHEDULE_MODIFIER_unknown;
127  OpenMPScheduleClauseModifier M2 = OMPC_SCHEDULE_MODIFIER_unknown;
128};
129
130OpenMPDirectiveKind getOpenMPDirectiveKind(llvm::StringRef Str);
131const char *getOpenMPDirectiveName(OpenMPDirectiveKind Kind);
132
133OpenMPClauseKind getOpenMPClauseKind(llvm::StringRef Str);
134const char *getOpenMPClauseName(OpenMPClauseKind Kind);
135
136unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str);
137const char *getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type);
138
139bool isAllowedClauseForDirective(OpenMPDirectiveKind DKind,
140                                 OpenMPClauseKind CKind);
141
142/// \brief Checks if the specified directive is a directive with an associated
143/// loop construct.
144/// \param DKind Specified directive.
145/// \return true - the directive is a loop-associated directive like 'omp simd'
146/// or 'omp for' directive, otherwise - false.
147bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind);
148
149/// \brief Checks if the specified directive is a worksharing directive.
150/// \param DKind Specified directive.
151/// \return true - the directive is a worksharing directive like 'omp for',
152/// otherwise - false.
153bool isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind);
154
155/// \brief Checks if the specified directive is a taskloop directive.
156/// \param DKind Specified directive.
157/// \return true - the directive is a worksharing directive like 'omp taskloop',
158/// otherwise - false.
159bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind);
160
161/// \brief Checks if the specified directive is a parallel-kind directive.
162/// \param DKind Specified directive.
163/// \return true - the directive is a parallel-like directive like 'omp
164/// parallel', otherwise - false.
165bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind);
166
167/// \brief Checks if the specified directive is a target code offload directive.
168/// \param DKind Specified directive.
169/// \return true - the directive is a target code offload directive like
170/// 'omp target', 'omp target parallel', 'omp target xxx'
171/// otherwise - false.
172bool isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind);
173
174/// \brief Checks if the specified directive is a target data offload directive.
175/// \param DKind Specified directive.
176/// \return true - the directive is a target data offload directive like
177/// 'omp target data', 'omp target update', 'omp target enter data',
178/// 'omp target exit data'
179/// otherwise - false.
180bool isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind);
181
182/// \brief Checks if the specified directive is a teams-kind directive.
183/// \param DKind Specified directive.
184/// \return true - the directive is a teams-like directive like 'omp teams',
185/// otherwise - false.
186bool isOpenMPTeamsDirective(OpenMPDirectiveKind DKind);
187
188/// \brief Checks if the specified directive is a simd directive.
189/// \param DKind Specified directive.
190/// \return true - the directive is a simd directive like 'omp simd',
191/// otherwise - false.
192bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind);
193
194/// \brief Checks if the specified directive is a distribute directive.
195/// \param DKind Specified directive.
196/// \return true - the directive is a distribute-directive like 'omp
197/// distribute',
198/// otherwise - false.
199bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind);
200
201/// \brief Checks if the specified clause is one of private clauses like
202/// 'private', 'firstprivate', 'reduction' etc..
203/// \param Kind Clause kind.
204/// \return true - the clause is a private clause, otherwise - false.
205bool isOpenMPPrivate(OpenMPClauseKind Kind);
206
207/// \brief Checks if the specified clause is one of threadprivate clauses like
208/// 'threadprivate', 'copyin' or 'copyprivate'.
209/// \param Kind Clause kind.
210/// \return true - the clause is a threadprivate clause, otherwise - false.
211bool isOpenMPThreadPrivate(OpenMPClauseKind Kind);
212
213/// Checks if the specified directive kind is one of tasking directives - task,
214/// taskloop or taksloop simd.
215bool isOpenMPTaskingDirective(OpenMPDirectiveKind Kind);
216
217/// Checks if the specified directive kind is one of the composite or combined
218/// directives that need loop bound sharing across loops outlined in nested
219/// functions
220bool isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind);
221}
222
223#endif
224
225