blob: afdbc4d9788d68ad08495b0a215c407464fdf5bb [file] [log] [blame]
//===- 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 {
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"
/// \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
enum class OMPScheduleType {
// For typed comparisons, not a valid schedule
None = 0,
// Schedule algorithms
BaseStaticChunked = 1,
BaseStatic = 2,
BaseDynamicChunked = 3,
BaseGuidedChunked = 4,
BaseRuntime = 5,
BaseAuto = 6,
BaseTrapezoidal = 7,
BaseGreedy = 8,
BaseBalanced = 9,
BaseGuidedIterativeChunked = 10,
BaseGuidedAnalyticalChunked = 11,
BaseSteal = 12,
// with chunk adjustment (e.g., simd)
BaseStaticBalancedChunked = 13,
BaseGuidedSimd = 14,
BaseRuntimeSimd = 15,
// static schedules algorithims for distribute
BaseDistributeChunked = 27,
BaseDistribute = 28,
// Modifier flags to be combined with schedule algorithms
ModifierUnordered = (1 << 5),
ModifierOrdered = (1 << 6),
ModifierNomerge = (1 << 7),
ModifierMonotonic = (1 << 29),
ModifierNonmonotonic = (1 << 30),
// Masks combining multiple flags
OrderingMask = ModifierUnordered | ModifierOrdered | ModifierNomerge,
MonotonicityMask = ModifierMonotonic | ModifierNonmonotonic,
ModifierMask = OrderingMask | MonotonicityMask,
// valid schedule type values, without monotonicity flags
UnorderedStaticChunked = BaseStaticChunked | ModifierUnordered, // 33
UnorderedStatic = BaseStatic | ModifierUnordered, // 34
UnorderedDynamicChunked = BaseDynamicChunked | ModifierUnordered, // 35
UnorderedGuidedChunked = BaseGuidedChunked | ModifierUnordered, // 36
UnorderedRuntime = BaseRuntime | ModifierUnordered, // 37
UnorderedAuto = BaseAuto | ModifierUnordered, // 38
UnorderedTrapezoidal = BaseTrapezoidal | ModifierUnordered, // 39
UnorderedGreedy = BaseGreedy | ModifierUnordered, // 40
UnorderedBalanced = BaseBalanced | ModifierUnordered, // 41
UnorderedGuidedIterativeChunked =
BaseGuidedIterativeChunked | ModifierUnordered, // 42
UnorderedGuidedAnalyticalChunked =
BaseGuidedAnalyticalChunked | ModifierUnordered, // 43
UnorderedSteal = BaseSteal | ModifierUnordered, // 44
UnorderedStaticBalancedChunked =
BaseStaticBalancedChunked | ModifierUnordered, // 45
UnorderedGuidedSimd = BaseGuidedSimd | ModifierUnordered, // 46
UnorderedRuntimeSimd = BaseRuntimeSimd | ModifierUnordered, // 47
OrderedStaticChunked = BaseStaticChunked | ModifierOrdered, // 65
OrderedStatic = BaseStatic | ModifierOrdered, // 66
OrderedDynamicChunked = BaseDynamicChunked | ModifierOrdered, // 67
OrderedGuidedChunked = BaseGuidedChunked | ModifierOrdered, // 68
OrderedRuntime = BaseRuntime | ModifierOrdered, // 69
OrderedAuto = BaseAuto | ModifierOrdered, // 70
OrderdTrapezoidal = BaseTrapezoidal | ModifierOrdered, // 71
OrderedDistributeChunked = BaseDistributeChunked | ModifierOrdered, // 91
OrderedDistribute = BaseDistribute | ModifierOrdered, // 92
NomergeUnorderedStaticChunked =
BaseStaticChunked | ModifierUnordered | ModifierNomerge, // 161
NomergeUnorderedStatic =
BaseStatic | ModifierUnordered | ModifierNomerge, // 162
NomergeUnorderedDynamicChunked =
BaseDynamicChunked | ModifierUnordered | ModifierNomerge, // 163
NomergeUnorderedGuidedChunked =
BaseGuidedChunked | ModifierUnordered | ModifierNomerge, // 164
NomergeUnorderedRuntime =
BaseRuntime | ModifierUnordered | ModifierNomerge, // 165
NomergeUnorderedAuto = BaseAuto | ModifierUnordered | ModifierNomerge, // 166
NomergeUnorderedTrapezoidal =
BaseTrapezoidal | ModifierUnordered | ModifierNomerge, // 167
NomergeUnorderedGreedy =
BaseGreedy | ModifierUnordered | ModifierNomerge, // 168
NomergeUnorderedBalanced =
BaseBalanced | ModifierUnordered | ModifierNomerge, // 169
NomergeUnorderedGuidedIterativeChunked =
BaseGuidedIterativeChunked | ModifierUnordered | ModifierNomerge, // 170
NomergeUnorderedGuidedAnalyticalChunked =
BaseGuidedAnalyticalChunked | ModifierUnordered | ModifierNomerge, // 171
NomergeUnorderedSteal =
BaseSteal | ModifierUnordered | ModifierNomerge, // 172
NomergeOrderedStaticChunked =
BaseStaticChunked | ModifierOrdered | ModifierNomerge, // 193
NomergeOrderedStatic = BaseStatic | ModifierOrdered | ModifierNomerge, // 194
NomergeOrderedDynamicChunked =
BaseDynamicChunked | ModifierOrdered | ModifierNomerge, // 195
NomergeOrderedGuidedChunked =
BaseGuidedChunked | ModifierOrdered | ModifierNomerge, // 196
NomergeOrderedRuntime =
BaseRuntime | ModifierOrdered | ModifierNomerge, // 197
NomergeOrderedAuto = BaseAuto | ModifierOrdered | ModifierNomerge, // 198
NomergeOrderedTrapezoidal =
BaseTrapezoidal | ModifierOrdered | ModifierNomerge, // 199
LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierMask)
};
/// Values for bit flags used to specify the mapping type for
/// offloading.
enum class OpenMPOffloadMappingFlags : uint64_t {
/// No flags
OMP_MAP_NONE = 0x0,
/// Allocate memory on the device and move data from host to device.
OMP_MAP_TO = 0x01,
/// Allocate memory on the device and move data from device to host.
OMP_MAP_FROM = 0x02,
/// Always perform the requested mapping action on the element, even
/// if it was already mapped before.
OMP_MAP_ALWAYS = 0x04,
/// Delete the element from the device environment, ignoring the
/// current reference count associated with the element.
OMP_MAP_DELETE = 0x08,
/// The element being mapped is a pointer-pointee pair; both the
/// pointer and the pointee should be mapped.
OMP_MAP_PTR_AND_OBJ = 0x10,
/// This flags signals that the base address of an entry should be
/// passed to the target kernel as an argument.
OMP_MAP_TARGET_PARAM = 0x20,
/// Signal that the runtime library has to return the device pointer
/// in the current position for the data being mapped. Used when we have the
/// use_device_ptr or use_device_addr clause.
OMP_MAP_RETURN_PARAM = 0x40,
/// This flag signals that the reference being passed is a pointer to
/// private data.
OMP_MAP_PRIVATE = 0x80,
/// Pass the element to the device by value.
OMP_MAP_LITERAL = 0x100,
/// Implicit map
OMP_MAP_IMPLICIT = 0x200,
/// Close is a hint to the runtime to allocate memory close to
/// the target device.
OMP_MAP_CLOSE = 0x400,
/// 0x800 is reserved for compatibility with XLC.
/// Produce a runtime error if the data is not already allocated.
OMP_MAP_PRESENT = 0x1000,
// Increment and decrement a separate reference counter so that the data
// cannot be unmapped within the associated region. Thus, this flag is
// intended to be used on 'target' and 'target data' directives because they
// are inherently structured. It is not intended to be used on 'target
// enter data' and 'target exit data' directives because they are inherently
// dynamic.
// This is an OpenMP extension for the sake of OpenACC support.
OMP_MAP_OMPX_HOLD = 0x2000,
/// Signal that the runtime library should use args as an array of
/// descriptor_dim pointers and use args_size as dims. Used when we have
/// non-contiguous list items in target update directive
OMP_MAP_NON_CONTIG = 0x100000000000,
/// The 16 MSBs of the flags indicate whether the entry is member of some
/// struct/class.
OMP_MAP_MEMBER_OF = 0xffff000000000000,
LLVM_MARK_AS_BITMASK_ENUM(/* LargestFlag = */ OMP_MAP_MEMBER_OF)
};
enum class AddressSpace : unsigned {
Generic = 0,
Global = 1,
Shared = 3,
Constant = 4,
Local = 5,
};
/// \note This needs to be kept in sync with interop.h enum kmp_interop_type_t.:
enum class OMPInteropType { Unknown, Target, TargetSync };
/// Atomic compare operations. Currently OpenMP only supports ==, >, and <.
enum class OMPAtomicCompareOp : unsigned { EQ, MIN, MAX };
/// Fields ids in kmp_depend_info record.
enum class RTLDependInfoFields { BaseAddr, Len, Flags };
/// Dependence kind for RTL.
enum class RTLDependenceKindTy {
DepUnknown = 0x0,
DepIn = 0x01,
DepInOut = 0x3,
DepMutexInOutSet = 0x4,
DepInOutSet = 0x8,
DepOmpAllMem = 0x80,
};
} // end namespace omp
} // end namespace llvm
#include "OMPDeviceConstants.h"
#endif // LLVM_FRONTEND_OPENMP_OMPCONSTANTS_H