xref: /llvm-project/mlir/include/mlir/Dialect/OpenMP/OpenMPEnums.td (revision afcbcae668f1d8061974247f2828190173aef742)
1//===-- OpenMPEnums.td - OpenMP dialect enum file ----------*- tablegen -*-===//
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#ifndef OPENMP_ENUMS
10#define OPENMP_ENUMS
11
12include "mlir/Dialect/OpenMP/OpenMPDialect.td"
13include "mlir/IR/EnumAttr.td"
14
15include "mlir/Dialect/OpenMP/OmpCommon.td"
16
17//===----------------------------------------------------------------------===//
18// Base classes for OpenMP enum attributes.
19//===----------------------------------------------------------------------===//
20
21class OpenMP_I32EnumAttr<string name, string summary,
22                         list<I32EnumAttrCase> cases>
23    : I32EnumAttr<name, summary, cases> {
24  let genSpecializedAttr = 0;
25  let cppNamespace = "::mlir::omp";
26}
27
28class OpenMP_BitEnumAttr<string name, string summary,
29                         list<BitEnumAttrCaseBase> cases>
30    : I32BitEnumAttr<name, summary, cases> {
31  let genSpecializedAttr = 0;
32  let cppNamespace = "::mlir::omp";
33}
34
35class OpenMP_EnumAttr<EnumAttrInfo enumInfo, string name>
36    : EnumAttr<OpenMP_Dialect, enumInfo, name>;
37
38
39//===----------------------------------------------------------------------===//
40// capture_clause enum.
41//===----------------------------------------------------------------------===//
42
43def CaptureClauseTo : I32EnumAttrCase<"to", 0>;
44def CaptureClauseLink : I32EnumAttrCase<"link", 1>;
45def CaptureClauseEnter : I32EnumAttrCase<"enter", 2>;
46
47def DeclareTargetCaptureClause : OpenMP_I32EnumAttr<
48    "DeclareTargetCaptureClause",
49    "capture clause", [
50      CaptureClauseTo,
51      CaptureClauseLink,
52      CaptureClauseEnter
53    ]>;
54
55def DeclareTargetCaptureClauseAttr : OpenMP_EnumAttr<DeclareTargetCaptureClause,
56                                                     "capture_clause"> {
57  let assemblyFormat = "`(` $value `)`";
58}
59
60//===----------------------------------------------------------------------===//
61// clause_depend enum.
62//===----------------------------------------------------------------------===//
63
64def ClauseDependSource : I32EnumAttrCase<"dependsource", 0>;
65def ClauseDependSink : I32EnumAttrCase<"dependsink", 1>;
66
67def ClauseDepend : OpenMP_I32EnumAttr<
68    "ClauseDepend",
69    "depend clause", [
70      ClauseDependSource,
71      ClauseDependSink
72    ]>;
73
74def ClauseDependAttr : OpenMP_EnumAttr<ClauseDepend, "clause_depend"> {
75  let assemblyFormat = "`(` $value `)`";
76}
77
78//===----------------------------------------------------------------------===//
79// clause_requires enum.
80//===----------------------------------------------------------------------===//
81
82// atomic_default_mem_order clause values not defined here because they can be
83// represented by the OMPC_MemoryOrder enumeration instead.
84def ClauseRequiresNone : I32BitEnumAttrCaseNone<"none">;
85def ClauseRequiresReverseOffload : I32BitEnumAttrCaseBit<"reverse_offload", 0>;
86def ClauseRequiresUnifiedAddress : I32BitEnumAttrCaseBit<"unified_address", 1>;
87def ClauseRequiresUnifiedSharedMemory
88    : I32BitEnumAttrCaseBit<"unified_shared_memory", 2>;
89def ClauseRequiresDynamicAllocators
90    : I32BitEnumAttrCaseBit<"dynamic_allocators", 3>;
91
92def ClauseRequires : OpenMP_BitEnumAttr<
93    "ClauseRequires",
94    "requires clauses", [
95      ClauseRequiresNone,
96      ClauseRequiresReverseOffload,
97      ClauseRequiresUnifiedAddress,
98      ClauseRequiresUnifiedSharedMemory,
99      ClauseRequiresDynamicAllocators
100    ]>;
101
102def ClauseRequiresAttr : OpenMP_EnumAttr<ClauseRequires, "clause_requires">;
103
104//===----------------------------------------------------------------------===//
105// clause_task_depend enum.
106//===----------------------------------------------------------------------===//
107
108def ClauseTaskDependIn : I32EnumAttrCase<"taskdependin", 0>;
109def ClauseTaskDependOut : I32EnumAttrCase<"taskdependout", 1>;
110def ClauseTaskDependInOut : I32EnumAttrCase<"taskdependinout", 2>;
111def ClauseTaskDependMutexInOutSet
112    : I32EnumAttrCase<"taskdependmutexinoutset", 3>;
113def ClauseTaskDependInOutSet : I32EnumAttrCase<"taskdependinoutset", 4>;
114
115def ClauseTaskDepend
116    : OpenMP_I32EnumAttr<
117          "ClauseTaskDepend", "depend clause in a target or task construct",
118          [ClauseTaskDependIn, ClauseTaskDependOut, ClauseTaskDependInOut,
119           ClauseTaskDependMutexInOutSet, ClauseTaskDependInOutSet]>;
120
121def ClauseTaskDependAttr : OpenMP_EnumAttr<ClauseTaskDepend,
122                                           "clause_task_depend"> {
123  let assemblyFormat = "`(` $value `)`";
124}
125
126//===----------------------------------------------------------------------===//
127// data_sharing_type enum.
128//===----------------------------------------------------------------------===//
129
130def DataSharingTypePrivate : I32EnumAttrCase<"Private", 0, "private">;
131def DataSharingTypeFirstPrivate
132    : I32EnumAttrCase<"FirstPrivate", 1, "firstprivate">;
133
134def DataSharingClauseType : OpenMP_I32EnumAttr<
135    "DataSharingClauseType",
136    "Type of a data-sharing clause", [
137      DataSharingTypePrivate,
138      DataSharingTypeFirstPrivate
139    ]>;
140
141def DataSharingClauseTypeAttr : OpenMP_EnumAttr<DataSharingClauseType,
142                                                "data_sharing_type"> {
143  let assemblyFormat = "`{` `type` `=` $value `}`";
144}
145
146//===----------------------------------------------------------------------===//
147// device_type enum.
148//===----------------------------------------------------------------------===//
149
150def DeviceTypeAny : I32EnumAttrCase<"any", 0>;
151def DeviceTypeHost : I32EnumAttrCase<"host", 1>;
152def DeviceTypeNoHost : I32EnumAttrCase<"nohost", 2>;
153
154def DeclareTargetDeviceType : OpenMP_I32EnumAttr<
155    "DeclareTargetDeviceType",
156    "device_type clause", [
157      DeviceTypeAny,
158      DeviceTypeHost,
159      DeviceTypeNoHost
160    ]>;
161
162def DeclareTargetDeviceTypeAttr : OpenMP_EnumAttr<DeclareTargetDeviceType,
163                                                  "device_type"> {
164  let assemblyFormat = "`(` $value `)`";
165}
166
167//===----------------------------------------------------------------------===//
168// order_modifer enum.
169//===----------------------------------------------------------------------===//
170
171def OMP_OrderModReproducible       : I32EnumAttrCase<"reproducible", 0>;
172def OMP_OrderModUnconstrained      : I32EnumAttrCase<"unconstrained", 1>;
173def OrderModifier
174    : I32EnumAttr<"OrderModifier", "OpenMP Order Modifier",
175                  [OMP_OrderModReproducible, OMP_OrderModUnconstrained]> {
176  let genSpecializedAttr = 0;
177  let cppNamespace = "::mlir::omp";
178}
179def OrderModifierAttr : EnumAttr<OpenMP_Dialect, OrderModifier,
180                                    "order_mod">;
181
182//===----------------------------------------------------------------------===//
183// reduction_modifier enum.
184//===----------------------------------------------------------------------===//
185
186def ReductionModifierDefault : I32EnumAttrCase<"defaultmod", 0>;
187def ReductionModifierInscan : I32EnumAttrCase<"inscan", 1>;
188def ReductionModifierTask : I32EnumAttrCase<"task", 2>;
189
190def ReductionModifier : OpenMP_I32EnumAttr<
191    "ReductionModifier",
192    "reduction modifier", [
193      ReductionModifierDefault,
194      ReductionModifierInscan,
195      ReductionModifierTask
196    ]>;
197
198def ReductionModifierAttr : OpenMP_EnumAttr<ReductionModifier,
199                                            "reduction_modifier"> {
200  let assemblyFormat = "`(` $value `)`";
201}
202
203//===----------------------------------------------------------------------===//
204// sched_mod enum.
205//===----------------------------------------------------------------------===//
206
207def OpenMP_ScheduleModNone : I32EnumAttrCase<"none", 0>;
208def OpenMP_ScheduleModMonotonic : I32EnumAttrCase<"monotonic", 1>;
209def OpenMP_ScheduleModNonmonotonic : I32EnumAttrCase<"nonmonotonic", 2>;
210// FIXME: remove this value for the modifier because this is handled using a
211// separate attribute
212def OpenMP_ScheduleModSimd : I32EnumAttrCase<"simd", 3>;
213
214def ScheduleModifier : OpenMP_I32EnumAttr<
215    "ScheduleModifier",
216    "OpenMP Schedule Modifier", [
217      OpenMP_ScheduleModNone,
218      OpenMP_ScheduleModMonotonic,
219      OpenMP_ScheduleModNonmonotonic,
220      OpenMP_ScheduleModSimd
221    ]>;
222
223def ScheduleModifierAttr : OpenMP_EnumAttr<ScheduleModifier, "sched_mod">;
224
225//===----------------------------------------------------------------------===//
226// variable_capture_kind enum.
227//===----------------------------------------------------------------------===//
228
229def CaptureThis : I32EnumAttrCase<"This", 0>;
230def CaptureByRef : I32EnumAttrCase<"ByRef", 1>;
231def CaptureByCopy : I32EnumAttrCase<"ByCopy", 2>;
232def CaptureVLAType : I32EnumAttrCase<"VLAType", 3>;
233
234def VariableCaptureKind : OpenMP_I32EnumAttr<
235    "VariableCaptureKind",
236    "variable capture kind", [
237      CaptureThis,
238      CaptureByRef,
239      CaptureByCopy,
240      CaptureVLAType
241    ]>;
242
243def VariableCaptureKindAttr : OpenMP_EnumAttr<VariableCaptureKind,
244                                              "variable_capture_kind"> {
245  let assemblyFormat = "`(` $value `)`";
246}
247
248#endif // OPENMP_ENUMS
249