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 
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   StaticChunked = 33,
115   Static = 34, // static unspecialized
116   DistributeChunked = 91,
117   Distribute = 92,
118   DynamicChunked = 35,
119   GuidedChunked = 36, // guided unspecialized
120   Runtime = 37,
121   Auto = 38, // auto
122 
123   ModifierMonotonic =
124       (1 << 29), // Set if the monotonic schedule modifier was present
125   ModifierNonmonotonic =
126       (1 << 30), // Set if the nonmonotonic schedule modifier was present
127   ModifierMask = ModifierMonotonic | ModifierNonmonotonic,
128   LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierMask)
129 };
130 
131 } // end namespace omp
132 
133 } // end namespace llvm
134 
135 #endif // LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H
136