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 20 namespace clang { 21 22 /// \brief OpenMP directives. 23 enum 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. 33 enum OpenMPClauseKind { 34 #define OPENMP_CLAUSE(Name, Class) \ 35 OMPC_##Name, 36 #include "clang/Basic/OpenMPKinds.def" 37 OMPC_threadprivate, 38 OMPC_unknown 39 }; 40 41 /// \brief OpenMP attributes for 'default' clause. 42 enum OpenMPDefaultClauseKind { 43 #define OPENMP_DEFAULT_KIND(Name) \ 44 OMPC_DEFAULT_##Name, 45 #include "clang/Basic/OpenMPKinds.def" 46 OMPC_DEFAULT_unknown 47 }; 48 49 /// \brief OpenMP attributes for 'proc_bind' clause. 50 enum OpenMPProcBindClauseKind { 51 #define OPENMP_PROC_BIND_KIND(Name) \ 52 OMPC_PROC_BIND_##Name, 53 #include "clang/Basic/OpenMPKinds.def" 54 OMPC_PROC_BIND_unknown 55 }; 56 57 /// \brief OpenMP attributes for 'schedule' clause. 58 enum OpenMPScheduleClauseKind { 59 #define OPENMP_SCHEDULE_KIND(Name) \ 60 OMPC_SCHEDULE_##Name, 61 #include "clang/Basic/OpenMPKinds.def" 62 OMPC_SCHEDULE_unknown 63 }; 64 65 /// \brief OpenMP attributes for 'depend' clause. 66 enum OpenMPDependClauseKind { 67 #define OPENMP_DEPEND_KIND(Name) \ 68 OMPC_DEPEND_##Name, 69 #include "clang/Basic/OpenMPKinds.def" 70 OMPC_DEPEND_unknown 71 }; 72 73 /// \brief OpenMP attributes for 'linear' clause. 74 enum OpenMPLinearClauseKind { 75 #define OPENMP_LINEAR_KIND(Name) \ 76 OMPC_LINEAR_##Name, 77 #include "clang/Basic/OpenMPKinds.def" 78 OMPC_LINEAR_unknown 79 }; 80 81 /// \brief OpenMP mapping kind for 'map' clause. 82 enum OpenMPMapClauseKind { 83 #define OPENMP_MAP_KIND(Name) \ 84 OMPC_MAP_##Name, 85 #include "clang/Basic/OpenMPKinds.def" 86 OMPC_MAP_unknown 87 }; 88 89 OpenMPDirectiveKind getOpenMPDirectiveKind(llvm::StringRef Str); 90 const char *getOpenMPDirectiveName(OpenMPDirectiveKind Kind); 91 92 OpenMPClauseKind getOpenMPClauseKind(llvm::StringRef Str); 93 const char *getOpenMPClauseName(OpenMPClauseKind Kind); 94 95 unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str); 96 const char *getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type); 97 98 bool isAllowedClauseForDirective(OpenMPDirectiveKind DKind, 99 OpenMPClauseKind CKind); 100 101 /// \brief Checks if the specified directive is a directive with an associated 102 /// loop construct. 103 /// \param DKind Specified directive. 104 /// \return true - the directive is a loop-associated directive like 'omp simd' 105 /// or 'omp for' directive, otherwise - false. 106 bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind); 107 108 /// \brief Checks if the specified directive is a worksharing directive. 109 /// \param DKind Specified directive. 110 /// \return true - the directive is a worksharing directive like 'omp for', 111 /// otherwise - false. 112 bool isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind); 113 114 /// \brief Checks if the specified directive is a taskloop directive. 115 /// \param DKind Specified directive. 116 /// \return true - the directive is a worksharing directive like 'omp taskloop', 117 /// otherwise - false. 118 bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind); 119 120 /// \brief Checks if the specified directive is a parallel-kind directive. 121 /// \param DKind Specified directive. 122 /// \return true - the directive is a parallel-like directive like 'omp 123 /// parallel', otherwise - false. 124 bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind); 125 126 /// \brief Checks if the specified directive is a target-kind directive. 127 /// \param DKind Specified directive. 128 /// \return true - the directive is a target-like directive like 'omp target', 129 /// otherwise - false. 130 bool isOpenMPTargetDirective(OpenMPDirectiveKind DKind); 131 132 /// \brief Checks if the specified directive is a teams-kind directive. 133 /// \param DKind Specified directive. 134 /// \return true - the directive is a teams-like directive like 'omp teams', 135 /// otherwise - false. 136 bool isOpenMPTeamsDirective(OpenMPDirectiveKind DKind); 137 138 /// \brief Checks if the specified directive is a simd directive. 139 /// \param DKind Specified directive. 140 /// \return true - the directive is a simd directive like 'omp simd', 141 /// otherwise - false. 142 bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind); 143 144 /// \brief Checks if the specified directive is a distribute directive. 145 /// \param DKind Specified directive. 146 /// \return true - the directive is a distribute-directive like 'omp 147 /// distribute', 148 /// otherwise - false. 149 bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind); 150 151 /// \brief Checks if the specified clause is one of private clauses like 152 /// 'private', 'firstprivate', 'reduction' etc.. 153 /// \param Kind Clause kind. 154 /// \return true - the clause is a private clause, otherwise - false. 155 bool isOpenMPPrivate(OpenMPClauseKind Kind); 156 157 /// \brief Checks if the specified clause is one of threadprivate clauses like 158 /// 'threadprivate', 'copyin' or 'copyprivate'. 159 /// \param Kind Clause kind. 160 /// \return true - the clause is a threadprivate clause, otherwise - false. 161 bool isOpenMPThreadPrivate(OpenMPClauseKind Kind); 162 163 } 164 165 #endif 166 167