//===- OMPConstants.h - OpenMP related constants and helpers ------ C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// \file /// /// This file defines constans and helpers used when dealing with OpenMP. /// //===----------------------------------------------------------------------===// #ifndef LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H #define LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H #include "llvm/ADT/BitmaskEnum.h" #include "llvm/ADT/StringRef.h" #include "llvm/Frontend/OpenMP/OMP.h.inc" namespace llvm { class Type; class Module; class ArrayType; class StructType; class PointerType; class StringRef; class FunctionType; namespace omp { LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); /// IDs for all Internal Control Variables (ICVs). enum class InternalControlVar { #define ICV_DATA_ENV(Enum, ...) Enum, #include "llvm/Frontend/OpenMP/OMPKinds.def" }; #define ICV_DATA_ENV(Enum, ...) \ constexpr auto Enum = omp::InternalControlVar::Enum; #include "llvm/Frontend/OpenMP/OMPKinds.def" enum class ICVInitValue { #define ICV_INIT_VALUE(Enum, Name) Enum, #include "llvm/Frontend/OpenMP/OMPKinds.def" }; #define ICV_INIT_VALUE(Enum, Name) \ constexpr auto Enum = omp::ICVInitValue::Enum; #include "llvm/Frontend/OpenMP/OMPKinds.def" /// IDs for all omp runtime library (RTL) functions. enum class RuntimeFunction { #define OMP_RTL(Enum, ...) Enum, #include "llvm/Frontend/OpenMP/OMPKinds.def" }; #define OMP_RTL(Enum, ...) constexpr auto Enum = omp::RuntimeFunction::Enum; #include "llvm/Frontend/OpenMP/OMPKinds.def" /// IDs for the different default kinds. enum class DefaultKind { #define OMP_DEFAULT_KIND(Enum, Str) Enum, #include "llvm/Frontend/OpenMP/OMPKinds.def" }; #define OMP_DEFAULT_KIND(Enum, ...) \ constexpr auto Enum = omp::DefaultKind::Enum; #include "llvm/Frontend/OpenMP/OMPKinds.def" /// IDs for all omp runtime library ident_t flag encodings (see /// their defintion in openmp/runtime/src/kmp.h). enum class IdentFlag { #define OMP_IDENT_FLAG(Enum, Str, Value) Enum = Value, #include "llvm/Frontend/OpenMP/OMPKinds.def" LLVM_MARK_AS_BITMASK_ENUM(0x7FFFFFFF) }; #define OMP_IDENT_FLAG(Enum, ...) constexpr auto Enum = omp::IdentFlag::Enum; #include "llvm/Frontend/OpenMP/OMPKinds.def" /// Helper to describe assume clauses. struct AssumptionClauseMappingInfo { /// The identifier describing the (beginning of the) clause. llvm::StringLiteral Identifier; /// Flag to determine if the identifier is a full name or the start of a name. bool StartsWith; /// Flag to determine if a directive lists follows. bool HasDirectiveList; /// Flag to determine if an expression follows. bool HasExpression; }; /// All known assume clauses. static constexpr AssumptionClauseMappingInfo AssumptionClauseMappings[] = { #define OMP_ASSUME_CLAUSE(Identifier, StartsWith, HasDirectiveList, \ HasExpression) \ {Identifier, StartsWith, HasDirectiveList, HasExpression}, #include "llvm/Frontend/OpenMP/OMPKinds.def" }; inline std::string getAllAssumeClauseOptions() { std::string S; for (const AssumptionClauseMappingInfo &ACMI : AssumptionClauseMappings) S += (S.empty() ? "'" : "', '") + ACMI.Identifier.str(); return S + "'"; } /// \note This needs to be kept in sync with kmp.h enum sched_type. /// Todo: Update kmp.h to include this file, and remove the enums in kmp.h /// To complete this, more enum values will need to be moved here. enum class OMPScheduleType { StaticChunked = 33, Static = 34, // static unspecialized DistributeChunked = 91, Distribute = 92, DynamicChunked = 35, GuidedChunked = 36, // guided unspecialized Runtime = 37, Auto = 38, // auto ModifierMonotonic = (1 << 29), // Set if the monotonic schedule modifier was present ModifierNonmonotonic = (1 << 30), // Set if the nonmonotonic schedule modifier was present ModifierMask = ModifierMonotonic | ModifierNonmonotonic, LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierMask) }; enum OMPTgtExecModeFlags : int8_t { OMP_TGT_EXEC_MODE_GENERIC = 1 << 0, OMP_TGT_EXEC_MODE_SPMD = 1 << 1, OMP_TGT_EXEC_MODE_GENERIC_SPMD = OMP_TGT_EXEC_MODE_GENERIC | OMP_TGT_EXEC_MODE_SPMD, LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ OMP_TGT_EXEC_MODE_GENERIC_SPMD) }; } // end namespace omp } // end namespace llvm #endif // LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H