1 //===- OMPConstants.h - OpenMP related constants and helpers ------ 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 constans and helpers used when dealing with OpenMP.
11 ///
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H
15 #define LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H
16
17 #include "llvm/ADT/BitmaskEnum.h"
18
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/Frontend/OpenMP/OMP.h.inc"
21
22 namespace llvm {
23 class Type;
24 class Module;
25 class ArrayType;
26 class StructType;
27 class PointerType;
28 class StringRef;
29 class FunctionType;
30
31 namespace omp {
32 LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
33
34 /// IDs for all Internal Control Variables (ICVs).
35 enum class InternalControlVar {
36 #define ICV_DATA_ENV(Enum, ...) Enum,
37 #include "llvm/Frontend/OpenMP/OMPKinds.def"
38 };
39
40 #define ICV_DATA_ENV(Enum, ...) \
41 constexpr auto Enum = omp::InternalControlVar::Enum;
42 #include "llvm/Frontend/OpenMP/OMPKinds.def"
43
44 enum class ICVInitValue {
45 #define ICV_INIT_VALUE(Enum, Name) Enum,
46 #include "llvm/Frontend/OpenMP/OMPKinds.def"
47 };
48
49 #define ICV_INIT_VALUE(Enum, Name) \
50 constexpr auto Enum = omp::ICVInitValue::Enum;
51 #include "llvm/Frontend/OpenMP/OMPKinds.def"
52
53 /// IDs for all omp runtime library (RTL) functions.
54 enum class RuntimeFunction {
55 #define OMP_RTL(Enum, ...) Enum,
56 #include "llvm/Frontend/OpenMP/OMPKinds.def"
57 };
58
59 #define OMP_RTL(Enum, ...) constexpr auto Enum = omp::RuntimeFunction::Enum;
60 #include "llvm/Frontend/OpenMP/OMPKinds.def"
61
62 /// IDs for the different default kinds.
63 enum class DefaultKind {
64 #define OMP_DEFAULT_KIND(Enum, Str) Enum,
65 #include "llvm/Frontend/OpenMP/OMPKinds.def"
66 };
67
68 #define OMP_DEFAULT_KIND(Enum, ...) \
69 constexpr auto Enum = omp::DefaultKind::Enum;
70 #include "llvm/Frontend/OpenMP/OMPKinds.def"
71
72 /// IDs for all omp runtime library ident_t flag encodings (see
73 /// their defintion in openmp/runtime/src/kmp.h).
74 enum class IdentFlag {
75 #define OMP_IDENT_FLAG(Enum, Str, Value) Enum = Value,
76 #include "llvm/Frontend/OpenMP/OMPKinds.def"
77 LLVM_MARK_AS_BITMASK_ENUM(0x7FFFFFFF)
78 };
79
80 #define OMP_IDENT_FLAG(Enum, ...) constexpr auto Enum = omp::IdentFlag::Enum;
81 #include "llvm/Frontend/OpenMP/OMPKinds.def"
82
83 /// Helper to describe assume clauses.
84 struct AssumptionClauseMappingInfo {
85 /// The identifier describing the (beginning of the) clause.
86 llvm::StringLiteral Identifier;
87 /// Flag to determine if the identifier is a full name or the start of a name.
88 bool StartsWith;
89 /// Flag to determine if a directive lists follows.
90 bool HasDirectiveList;
91 /// Flag to determine if an expression follows.
92 bool HasExpression;
93 };
94
95 /// All known assume clauses.
96 static constexpr AssumptionClauseMappingInfo AssumptionClauseMappings[] = {
97 #define OMP_ASSUME_CLAUSE(Identifier, StartsWith, HasDirectiveList, \
98 HasExpression) \
99 {Identifier, StartsWith, HasDirectiveList, HasExpression},
100 #include "llvm/Frontend/OpenMP/OMPKinds.def"
101 };
102
getAllAssumeClauseOptions()103 inline std::string getAllAssumeClauseOptions() {
104 std::string S;
105 for (const AssumptionClauseMappingInfo &ACMI : AssumptionClauseMappings)
106 S += (S.empty() ? "'" : "', '") + ACMI.Identifier.str();
107 return S + "'";
108 }
109
110 /// \note This needs to be kept in sync with kmp.h enum sched_type.
111 /// Todo: Update kmp.h to include this file, and remove the enums in kmp.h
112 /// To complete this, more enum values will need to be moved here.
113 enum class OMPScheduleType {
114 Static = 34, // static unspecialized
115 DynamicChunked = 35,
116 GuidedChunked = 36, // guided unspecialized
117 Runtime = 37,
118 Auto = 38, // auto
119
120 ModifierNonmonotonic =
121 (1 << 30), /**< Set if the nonmonotonic schedule modifier was present */
122
123 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierNonmonotonic)
124 };
125
126 } // end namespace omp
127
128 } // end namespace llvm
129
130 #endif // LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H
131