1//===--- OpenMPKinds.h - OpenMP enums ---------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9/// 10/// \file 11/// \brief Defines some OpenMP-specific enums and functions. 12/// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_CLANG_BASIC_OPENMPKINDS_H 16#define LLVM_CLANG_BASIC_OPENMPKINDS_H 17 18#include "llvm/ADT/StringRef.h" 19 20namespace clang { 21 22/// \brief OpenMP directives. 23enum OpenMPDirectiveKind { 24#define OPENMP_DIRECTIVE(Name) \ 25 OMPD_##Name, 26#define OPENMP_DIRECTIVE_EXT(Name, Str) \ 27 OMPD_##Name, 28#include "clang/Basic/OpenMPKinds.def" 29 OMPD_unknown 30}; 31 32/// \brief OpenMP clauses. 33enum OpenMPClauseKind { 34#define OPENMP_CLAUSE(Name, Class) \ 35 OMPC_##Name, 36#include "clang/Basic/OpenMPKinds.def" 37 OMPC_threadprivate, 38 OMPC_uniform, 39 OMPC_unknown 40}; 41 42/// \brief OpenMP attributes for 'default' clause. 43enum OpenMPDefaultClauseKind { 44#define OPENMP_DEFAULT_KIND(Name) \ 45 OMPC_DEFAULT_##Name, 46#include "clang/Basic/OpenMPKinds.def" 47 OMPC_DEFAULT_unknown 48}; 49 50/// \brief OpenMP attributes for 'proc_bind' clause. 51enum OpenMPProcBindClauseKind { 52#define OPENMP_PROC_BIND_KIND(Name) \ 53 OMPC_PROC_BIND_##Name, 54#include "clang/Basic/OpenMPKinds.def" 55 OMPC_PROC_BIND_unknown 56}; 57 58/// \brief OpenMP attributes for 'schedule' clause. 59enum OpenMPScheduleClauseKind { 60#define OPENMP_SCHEDULE_KIND(Name) \ 61 OMPC_SCHEDULE_##Name, 62#include "clang/Basic/OpenMPKinds.def" 63 OMPC_SCHEDULE_unknown 64}; 65 66/// \brief OpenMP modifiers for 'schedule' clause. 67enum OpenMPScheduleClauseModifier { 68 OMPC_SCHEDULE_MODIFIER_unknown = OMPC_SCHEDULE_unknown, 69#define OPENMP_SCHEDULE_MODIFIER(Name) \ 70 OMPC_SCHEDULE_MODIFIER_##Name, 71#include "clang/Basic/OpenMPKinds.def" 72 OMPC_SCHEDULE_MODIFIER_last 73}; 74 75/// \brief OpenMP attributes for 'depend' clause. 76enum OpenMPDependClauseKind { 77#define OPENMP_DEPEND_KIND(Name) \ 78 OMPC_DEPEND_##Name, 79#include "clang/Basic/OpenMPKinds.def" 80 OMPC_DEPEND_unknown 81}; 82 83/// \brief OpenMP attributes for 'linear' clause. 84enum OpenMPLinearClauseKind { 85#define OPENMP_LINEAR_KIND(Name) \ 86 OMPC_LINEAR_##Name, 87#include "clang/Basic/OpenMPKinds.def" 88 OMPC_LINEAR_unknown 89}; 90 91/// \brief OpenMP mapping kind for 'map' clause. 92enum OpenMPMapClauseKind { 93#define OPENMP_MAP_KIND(Name) \ 94 OMPC_MAP_##Name, 95#include "clang/Basic/OpenMPKinds.def" 96 OMPC_MAP_unknown 97}; 98 99/// \brief OpenMP attributes for 'dist_schedule' clause. 100enum OpenMPDistScheduleClauseKind { 101#define OPENMP_DIST_SCHEDULE_KIND(Name) OMPC_DIST_SCHEDULE_##Name, 102#include "clang/Basic/OpenMPKinds.def" 103 OMPC_DIST_SCHEDULE_unknown 104}; 105 106/// \brief OpenMP attributes for 'defaultmap' clause. 107enum OpenMPDefaultmapClauseKind { 108#define OPENMP_DEFAULTMAP_KIND(Name) \ 109 OMPC_DEFAULTMAP_##Name, 110#include "clang/Basic/OpenMPKinds.def" 111 OMPC_DEFAULTMAP_unknown 112}; 113 114/// \brief OpenMP modifiers for 'defaultmap' clause. 115enum OpenMPDefaultmapClauseModifier { 116 OMPC_DEFAULTMAP_MODIFIER_unknown = OMPC_DEFAULTMAP_unknown, 117#define OPENMP_DEFAULTMAP_MODIFIER(Name) \ 118 OMPC_DEFAULTMAP_MODIFIER_##Name, 119#include "clang/Basic/OpenMPKinds.def" 120 OMPC_DEFAULTMAP_MODIFIER_last 121}; 122 123/// Scheduling data for loop-based OpenMP directives. 124struct OpenMPScheduleTy final { 125 OpenMPScheduleClauseKind Schedule = OMPC_SCHEDULE_unknown; 126 OpenMPScheduleClauseModifier M1 = OMPC_SCHEDULE_MODIFIER_unknown; 127 OpenMPScheduleClauseModifier M2 = OMPC_SCHEDULE_MODIFIER_unknown; 128}; 129 130OpenMPDirectiveKind getOpenMPDirectiveKind(llvm::StringRef Str); 131const char *getOpenMPDirectiveName(OpenMPDirectiveKind Kind); 132 133OpenMPClauseKind getOpenMPClauseKind(llvm::StringRef Str); 134const char *getOpenMPClauseName(OpenMPClauseKind Kind); 135 136unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str); 137const char *getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type); 138 139bool isAllowedClauseForDirective(OpenMPDirectiveKind DKind, 140 OpenMPClauseKind CKind); 141 142/// \brief Checks if the specified directive is a directive with an associated 143/// loop construct. 144/// \param DKind Specified directive. 145/// \return true - the directive is a loop-associated directive like 'omp simd' 146/// or 'omp for' directive, otherwise - false. 147bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind); 148 149/// \brief Checks if the specified directive is a worksharing directive. 150/// \param DKind Specified directive. 151/// \return true - the directive is a worksharing directive like 'omp for', 152/// otherwise - false. 153bool isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind); 154 155/// \brief Checks if the specified directive is a taskloop directive. 156/// \param DKind Specified directive. 157/// \return true - the directive is a worksharing directive like 'omp taskloop', 158/// otherwise - false. 159bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind); 160 161/// \brief Checks if the specified directive is a parallel-kind directive. 162/// \param DKind Specified directive. 163/// \return true - the directive is a parallel-like directive like 'omp 164/// parallel', otherwise - false. 165bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind); 166 167/// \brief Checks if the specified directive is a target code offload directive. 168/// \param DKind Specified directive. 169/// \return true - the directive is a target code offload directive like 170/// 'omp target', 'omp target parallel', 'omp target xxx' 171/// otherwise - false. 172bool isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind); 173 174/// \brief Checks if the specified directive is a target data offload directive. 175/// \param DKind Specified directive. 176/// \return true - the directive is a target data offload directive like 177/// 'omp target data', 'omp target update', 'omp target enter data', 178/// 'omp target exit data' 179/// otherwise - false. 180bool isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind); 181 182/// \brief Checks if the specified directive is a teams-kind directive. 183/// \param DKind Specified directive. 184/// \return true - the directive is a teams-like directive like 'omp teams', 185/// otherwise - false. 186bool isOpenMPTeamsDirective(OpenMPDirectiveKind DKind); 187 188/// \brief Checks if the specified directive is a simd directive. 189/// \param DKind Specified directive. 190/// \return true - the directive is a simd directive like 'omp simd', 191/// otherwise - false. 192bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind); 193 194/// \brief Checks if the specified directive is a distribute directive. 195/// \param DKind Specified directive. 196/// \return true - the directive is a distribute-directive like 'omp 197/// distribute', 198/// otherwise - false. 199bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind); 200 201/// \brief Checks if the specified clause is one of private clauses like 202/// 'private', 'firstprivate', 'reduction' etc.. 203/// \param Kind Clause kind. 204/// \return true - the clause is a private clause, otherwise - false. 205bool isOpenMPPrivate(OpenMPClauseKind Kind); 206 207/// \brief Checks if the specified clause is one of threadprivate clauses like 208/// 'threadprivate', 'copyin' or 'copyprivate'. 209/// \param Kind Clause kind. 210/// \return true - the clause is a threadprivate clause, otherwise - false. 211bool isOpenMPThreadPrivate(OpenMPClauseKind Kind); 212 213/// Checks if the specified directive kind is one of tasking directives - task, 214/// taskloop or taksloop simd. 215bool isOpenMPTaskingDirective(OpenMPDirectiveKind Kind); 216 217/// Checks if the specified directive kind is one of the composite or combined 218/// directives that need loop bound sharing across loops outlined in nested 219/// functions 220bool isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind); 221} 222 223#endif 224 225