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