1a769e072SAlexey Bataev //===--- OpenMPKinds.cpp - Token Kinds Support ----------------------------===// 2a769e072SAlexey Bataev // 3a769e072SAlexey Bataev // The LLVM Compiler Infrastructure 4a769e072SAlexey Bataev // 5a769e072SAlexey Bataev // This file is distributed under the University of Illinois Open Source 6a769e072SAlexey Bataev // License. See LICENSE.TXT for details. 7a769e072SAlexey Bataev // 8a769e072SAlexey Bataev //===----------------------------------------------------------------------===// 9a769e072SAlexey Bataev /// \file 10a769e072SAlexey Bataev /// \brief This file implements the OpenMP enum and support functions. 11a769e072SAlexey Bataev /// 12a769e072SAlexey Bataev //===----------------------------------------------------------------------===// 13a769e072SAlexey Bataev 14a769e072SAlexey Bataev #include "clang/Basic/OpenMPKinds.h" 15a769e072SAlexey Bataev #include "clang/Basic/IdentifierTable.h" 1607544fa5SMatt Beaumont-Gay #include "llvm/ADT/StringRef.h" 17a769e072SAlexey Bataev #include "llvm/ADT/StringSwitch.h" 18a769e072SAlexey Bataev #include "llvm/Support/ErrorHandling.h" 19a769e072SAlexey Bataev #include <cassert> 20a769e072SAlexey Bataev 21a769e072SAlexey Bataev using namespace clang; 22a769e072SAlexey Bataev 23a769e072SAlexey Bataev OpenMPDirectiveKind clang::getOpenMPDirectiveKind(StringRef Str) { 24a769e072SAlexey Bataev return llvm::StringSwitch<OpenMPDirectiveKind>(Str) 2523b69426SAlexey Bataev #define OPENMP_DIRECTIVE(Name) .Case(#Name, OMPD_##Name) 264acb859fSAlexey Bataev #define OPENMP_DIRECTIVE_EXT(Name, Str) .Case(Str, OMPD_##Name) 27a769e072SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 28a769e072SAlexey Bataev .Default(OMPD_unknown); 29a769e072SAlexey Bataev } 30a769e072SAlexey Bataev 31a769e072SAlexey Bataev const char *clang::getOpenMPDirectiveName(OpenMPDirectiveKind Kind) { 324ca40edaSAlexey Bataev assert(Kind <= OMPD_unknown); 33a769e072SAlexey Bataev switch (Kind) { 34a769e072SAlexey Bataev case OMPD_unknown: 356f6f3b4bSAlexey Bataev return "unknown"; 36a769e072SAlexey Bataev #define OPENMP_DIRECTIVE(Name) \ 3723b69426SAlexey Bataev case OMPD_##Name: \ 3823b69426SAlexey Bataev return #Name; 394acb859fSAlexey Bataev #define OPENMP_DIRECTIVE_EXT(Name, Str) \ 404acb859fSAlexey Bataev case OMPD_##Name: \ 414acb859fSAlexey Bataev return Str; 42a769e072SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 43a769e072SAlexey Bataev break; 44a769e072SAlexey Bataev } 45a769e072SAlexey Bataev llvm_unreachable("Invalid OpenMP directive kind"); 46a769e072SAlexey Bataev } 476f6f3b4bSAlexey Bataev 485ec3eb11SAlexey Bataev OpenMPClauseKind clang::getOpenMPClauseKind(StringRef Str) { 492b5f3f01SAlexey Bataev // 'flush' clause cannot be specified explicitly, because this is an implicit 502b5f3f01SAlexey Bataev // clause for 'flush' directive. If the 'flush' clause is explicitly specified 512b5f3f01SAlexey Bataev // the Parser should generate a warning about extra tokens at the end of the 522b5f3f01SAlexey Bataev // directive. 536125da92SAlexey Bataev if (Str == "flush") 546125da92SAlexey Bataev return OMPC_unknown; 555ec3eb11SAlexey Bataev return llvm::StringSwitch<OpenMPClauseKind>(Str) 5623b69426SAlexey Bataev #define OPENMP_CLAUSE(Name, Class) .Case(#Name, OMPC_##Name) 575ec3eb11SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 585ec3eb11SAlexey Bataev .Default(OMPC_unknown); 595ec3eb11SAlexey Bataev } 605ec3eb11SAlexey Bataev 615ec3eb11SAlexey Bataev const char *clang::getOpenMPClauseName(OpenMPClauseKind Kind) { 624ca40edaSAlexey Bataev assert(Kind <= OMPC_unknown); 635ec3eb11SAlexey Bataev switch (Kind) { 645ec3eb11SAlexey Bataev case OMPC_unknown: 655ec3eb11SAlexey Bataev return "unknown"; 665ec3eb11SAlexey Bataev #define OPENMP_CLAUSE(Name, Class) \ 6723b69426SAlexey Bataev case OMPC_##Name: \ 6823b69426SAlexey Bataev return #Name; 695ec3eb11SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 705ec3eb11SAlexey Bataev case OMPC_threadprivate: 715ec3eb11SAlexey Bataev return "threadprivate or thread local"; 725ec3eb11SAlexey Bataev } 735ec3eb11SAlexey Bataev llvm_unreachable("Invalid OpenMP clause kind"); 745ec3eb11SAlexey Bataev } 755ec3eb11SAlexey Bataev 765ec3eb11SAlexey Bataev unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, 775ec3eb11SAlexey Bataev StringRef Str) { 785ec3eb11SAlexey Bataev switch (Kind) { 795ec3eb11SAlexey Bataev case OMPC_default: 805ec3eb11SAlexey Bataev return llvm::StringSwitch<OpenMPDefaultClauseKind>(Str) 8123b69426SAlexey Bataev #define OPENMP_DEFAULT_KIND(Name) .Case(#Name, OMPC_DEFAULT_##Name) 825ec3eb11SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 835ec3eb11SAlexey Bataev .Default(OMPC_DEFAULT_unknown); 84bcbadb65SAlexey Bataev case OMPC_proc_bind: 85bcbadb65SAlexey Bataev return llvm::StringSwitch<OpenMPProcBindClauseKind>(Str) 8623b69426SAlexey Bataev #define OPENMP_PROC_BIND_KIND(Name) .Case(#Name, OMPC_PROC_BIND_##Name) 87bcbadb65SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 88bcbadb65SAlexey Bataev .Default(OMPC_PROC_BIND_unknown); 8956dafe87SAlexey Bataev case OMPC_schedule: 9056dafe87SAlexey Bataev return llvm::StringSwitch<OpenMPScheduleClauseKind>(Str) 9156dafe87SAlexey Bataev #define OPENMP_SCHEDULE_KIND(Name) .Case(#Name, OMPC_SCHEDULE_##Name) 9256dafe87SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 9356dafe87SAlexey Bataev .Default(OMPC_SCHEDULE_unknown); 945ec3eb11SAlexey Bataev case OMPC_unknown: 955ec3eb11SAlexey Bataev case OMPC_threadprivate: 96aadd52e5SAlexey Bataev case OMPC_if: 973778b601SAlexey Bataev case OMPC_final: 98568a833fSAlexey Bataev case OMPC_num_threads: 9962c87d25SAlexey Bataev case OMPC_safelen: 1008bd31e69SAlexander Musman case OMPC_collapse: 1015ec3eb11SAlexey Bataev case OMPC_private: 102d5af8e47SAlexey Bataev case OMPC_firstprivate: 1031bb328ccSAlexander Musman case OMPC_lastprivate: 1043e8aa9a6SDavid Blaikie case OMPC_shared: 105c5e02583SAlexey Bataev case OMPC_reduction: 1068dba6641SAlexander Musman case OMPC_linear: 107f0d76e7dSAlexander Musman case OMPC_aligned: 108d48bcd8aSAlexey Bataev case OMPC_copyin: 109bae9a793SAlexey Bataev case OMPC_copyprivate: 110142e1fc9SAlexey Bataev case OMPC_ordered: 111236070f2SAlexey Bataev case OMPC_nowait: 1127aea99a3SAlexey Bataev case OMPC_untied: 11374ba3a58SAlexey Bataev case OMPC_mergeable: 1146125da92SAlexey Bataev case OMPC_flush: 115f98b00c3SAlexey Bataev case OMPC_read: 116dea4761cSAlexey Bataev case OMPC_write: 11767a4f22fSAlexey Bataev case OMPC_update: 118459dec0cSAlexey Bataev case OMPC_capture: 11982bad8b0SAlexey Bataev case OMPC_seq_cst: 1205ec3eb11SAlexey Bataev break; 1215ec3eb11SAlexey Bataev } 1225ec3eb11SAlexey Bataev llvm_unreachable("Invalid OpenMP simple clause kind"); 1235ec3eb11SAlexey Bataev } 1245ec3eb11SAlexey Bataev 1255ec3eb11SAlexey Bataev const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, 1265ec3eb11SAlexey Bataev unsigned Type) { 1275ec3eb11SAlexey Bataev switch (Kind) { 1285ec3eb11SAlexey Bataev case OMPC_default: 1295ec3eb11SAlexey Bataev switch (Type) { 1305ec3eb11SAlexey Bataev case OMPC_DEFAULT_unknown: 1315ec3eb11SAlexey Bataev return "unknown"; 1325ec3eb11SAlexey Bataev #define OPENMP_DEFAULT_KIND(Name) \ 13323b69426SAlexey Bataev case OMPC_DEFAULT_##Name: \ 13423b69426SAlexey Bataev return #Name; 1355ec3eb11SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 1365ec3eb11SAlexey Bataev } 1375ec3eb11SAlexey Bataev llvm_unreachable("Invalid OpenMP 'default' clause type"); 138bcbadb65SAlexey Bataev case OMPC_proc_bind: 139bcbadb65SAlexey Bataev switch (Type) { 140bcbadb65SAlexey Bataev case OMPC_PROC_BIND_unknown: 141bcbadb65SAlexey Bataev return "unknown"; 142bcbadb65SAlexey Bataev #define OPENMP_PROC_BIND_KIND(Name) \ 14323b69426SAlexey Bataev case OMPC_PROC_BIND_##Name: \ 14423b69426SAlexey Bataev return #Name; 145bcbadb65SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 146bcbadb65SAlexey Bataev } 147bcbadb65SAlexey Bataev llvm_unreachable("Invalid OpenMP 'proc_bind' clause type"); 14856dafe87SAlexey Bataev case OMPC_schedule: 14956dafe87SAlexey Bataev switch (Type) { 15056dafe87SAlexey Bataev case OMPC_SCHEDULE_unknown: 15156dafe87SAlexey Bataev return "unknown"; 15256dafe87SAlexey Bataev #define OPENMP_SCHEDULE_KIND(Name) \ 15356dafe87SAlexey Bataev case OMPC_SCHEDULE_##Name: \ 15456dafe87SAlexey Bataev return #Name; 15556dafe87SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 15656dafe87SAlexey Bataev } 15756dafe87SAlexey Bataev llvm_unreachable("Invalid OpenMP 'schedule' clause type"); 1585ec3eb11SAlexey Bataev case OMPC_unknown: 1595ec3eb11SAlexey Bataev case OMPC_threadprivate: 160aadd52e5SAlexey Bataev case OMPC_if: 1613778b601SAlexey Bataev case OMPC_final: 162568a833fSAlexey Bataev case OMPC_num_threads: 16362c87d25SAlexey Bataev case OMPC_safelen: 1648bd31e69SAlexander Musman case OMPC_collapse: 1655ec3eb11SAlexey Bataev case OMPC_private: 166d5af8e47SAlexey Bataev case OMPC_firstprivate: 1671bb328ccSAlexander Musman case OMPC_lastprivate: 1683e8aa9a6SDavid Blaikie case OMPC_shared: 169c5e02583SAlexey Bataev case OMPC_reduction: 1708dba6641SAlexander Musman case OMPC_linear: 171f0d76e7dSAlexander Musman case OMPC_aligned: 172d48bcd8aSAlexey Bataev case OMPC_copyin: 173bae9a793SAlexey Bataev case OMPC_copyprivate: 174142e1fc9SAlexey Bataev case OMPC_ordered: 175236070f2SAlexey Bataev case OMPC_nowait: 1767aea99a3SAlexey Bataev case OMPC_untied: 17774ba3a58SAlexey Bataev case OMPC_mergeable: 1786125da92SAlexey Bataev case OMPC_flush: 179f98b00c3SAlexey Bataev case OMPC_read: 180dea4761cSAlexey Bataev case OMPC_write: 18167a4f22fSAlexey Bataev case OMPC_update: 182459dec0cSAlexey Bataev case OMPC_capture: 18382bad8b0SAlexey Bataev case OMPC_seq_cst: 1845ec3eb11SAlexey Bataev break; 1855ec3eb11SAlexey Bataev } 1865ec3eb11SAlexey Bataev llvm_unreachable("Invalid OpenMP simple clause kind"); 1875ec3eb11SAlexey Bataev } 1885ec3eb11SAlexey Bataev 1895ec3eb11SAlexey Bataev bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind, 1905ec3eb11SAlexey Bataev OpenMPClauseKind CKind) { 1914ca40edaSAlexey Bataev assert(DKind <= OMPD_unknown); 1924ca40edaSAlexey Bataev assert(CKind <= OMPC_unknown); 1935ec3eb11SAlexey Bataev switch (DKind) { 1945ec3eb11SAlexey Bataev case OMPD_parallel: 1955ec3eb11SAlexey Bataev switch (CKind) { 1965ec3eb11SAlexey Bataev #define OPENMP_PARALLEL_CLAUSE(Name) \ 19723b69426SAlexey Bataev case OMPC_##Name: \ 19823b69426SAlexey Bataev return true; 1995ec3eb11SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 2005ec3eb11SAlexey Bataev default: 2015ec3eb11SAlexey Bataev break; 2025ec3eb11SAlexey Bataev } 2035ec3eb11SAlexey Bataev break; 2041b59ab56SAlexey Bataev case OMPD_simd: 2051b59ab56SAlexey Bataev switch (CKind) { 2061b59ab56SAlexey Bataev #define OPENMP_SIMD_CLAUSE(Name) \ 20723b69426SAlexey Bataev case OMPC_##Name: \ 20823b69426SAlexey Bataev return true; 2091b59ab56SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 2101b59ab56SAlexey Bataev default: 2111b59ab56SAlexey Bataev break; 2121b59ab56SAlexey Bataev } 2131b59ab56SAlexey Bataev break; 214f29276edSAlexey Bataev case OMPD_for: 215f29276edSAlexey Bataev switch (CKind) { 216f29276edSAlexey Bataev #define OPENMP_FOR_CLAUSE(Name) \ 21723b69426SAlexey Bataev case OMPC_##Name: \ 21823b69426SAlexey Bataev return true; 219f29276edSAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 220f29276edSAlexey Bataev default: 221f29276edSAlexey Bataev break; 222f29276edSAlexey Bataev } 223f29276edSAlexey Bataev break; 224f82886e5SAlexander Musman case OMPD_for_simd: 225f82886e5SAlexander Musman switch (CKind) { 226f82886e5SAlexander Musman #define OPENMP_FOR_SIMD_CLAUSE(Name) \ 227f82886e5SAlexander Musman case OMPC_##Name: \ 228f82886e5SAlexander Musman return true; 229f82886e5SAlexander Musman #include "clang/Basic/OpenMPKinds.def" 230f82886e5SAlexander Musman default: 231f82886e5SAlexander Musman break; 232f82886e5SAlexander Musman } 233f82886e5SAlexander Musman break; 234d3f8dd2dSAlexey Bataev case OMPD_sections: 235d3f8dd2dSAlexey Bataev switch (CKind) { 236d3f8dd2dSAlexey Bataev #define OPENMP_SECTIONS_CLAUSE(Name) \ 237d3f8dd2dSAlexey Bataev case OMPC_##Name: \ 238d3f8dd2dSAlexey Bataev return true; 239d3f8dd2dSAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 240d3f8dd2dSAlexey Bataev default: 241d3f8dd2dSAlexey Bataev break; 242d3f8dd2dSAlexey Bataev } 243d3f8dd2dSAlexey Bataev break; 244d1e40fbfSAlexey Bataev case OMPD_single: 245d1e40fbfSAlexey Bataev switch (CKind) { 246d1e40fbfSAlexey Bataev #define OPENMP_SINGLE_CLAUSE(Name) \ 247d1e40fbfSAlexey Bataev case OMPC_##Name: \ 248d1e40fbfSAlexey Bataev return true; 249d1e40fbfSAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 250d1e40fbfSAlexey Bataev default: 251d1e40fbfSAlexey Bataev break; 252d1e40fbfSAlexey Bataev } 253d1e40fbfSAlexey Bataev break; 2544acb859fSAlexey Bataev case OMPD_parallel_for: 2554acb859fSAlexey Bataev switch (CKind) { 2564acb859fSAlexey Bataev #define OPENMP_PARALLEL_FOR_CLAUSE(Name) \ 2574acb859fSAlexey Bataev case OMPC_##Name: \ 2584acb859fSAlexey Bataev return true; 2594acb859fSAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 2604acb859fSAlexey Bataev default: 2614acb859fSAlexey Bataev break; 2624acb859fSAlexey Bataev } 2634acb859fSAlexey Bataev break; 264*e4e893bbSAlexander Musman case OMPD_parallel_for_simd: 265*e4e893bbSAlexander Musman switch (CKind) { 266*e4e893bbSAlexander Musman #define OPENMP_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 267*e4e893bbSAlexander Musman case OMPC_##Name: \ 268*e4e893bbSAlexander Musman return true; 269*e4e893bbSAlexander Musman #include "clang/Basic/OpenMPKinds.def" 270*e4e893bbSAlexander Musman default: 271*e4e893bbSAlexander Musman break; 272*e4e893bbSAlexander Musman } 273*e4e893bbSAlexander Musman break; 27484d0b3efSAlexey Bataev case OMPD_parallel_sections: 27584d0b3efSAlexey Bataev switch (CKind) { 27684d0b3efSAlexey Bataev #define OPENMP_PARALLEL_SECTIONS_CLAUSE(Name) \ 27784d0b3efSAlexey Bataev case OMPC_##Name: \ 27884d0b3efSAlexey Bataev return true; 27984d0b3efSAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 28084d0b3efSAlexey Bataev default: 28184d0b3efSAlexey Bataev break; 28284d0b3efSAlexey Bataev } 28384d0b3efSAlexey Bataev break; 2849c2e8ee7SAlexey Bataev case OMPD_task: 2859c2e8ee7SAlexey Bataev switch (CKind) { 2869c2e8ee7SAlexey Bataev #define OPENMP_TASK_CLAUSE(Name) \ 2879c2e8ee7SAlexey Bataev case OMPC_##Name: \ 2889c2e8ee7SAlexey Bataev return true; 2899c2e8ee7SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 2909c2e8ee7SAlexey Bataev default: 2919c2e8ee7SAlexey Bataev break; 2929c2e8ee7SAlexey Bataev } 2939c2e8ee7SAlexey Bataev break; 2946125da92SAlexey Bataev case OMPD_flush: 2956125da92SAlexey Bataev return CKind == OMPC_flush; 2966125da92SAlexey Bataev break; 2970162e459SAlexey Bataev case OMPD_atomic: 2980162e459SAlexey Bataev switch (CKind) { 2990162e459SAlexey Bataev #define OPENMP_ATOMIC_CLAUSE(Name) \ 3000162e459SAlexey Bataev case OMPC_##Name: \ 3010162e459SAlexey Bataev return true; 3020162e459SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 3030162e459SAlexey Bataev default: 3040162e459SAlexey Bataev break; 3050162e459SAlexey Bataev } 3060162e459SAlexey Bataev break; 3070bd520b7SAlexey Bataev case OMPD_target: 3080bd520b7SAlexey Bataev switch (CKind) { 3090bd520b7SAlexey Bataev #define OPENMP_TARGET_CLAUSE(Name) \ 3100bd520b7SAlexey Bataev case OMPC_##Name: \ 3110bd520b7SAlexey Bataev return true; 3120bd520b7SAlexey Bataev #include "clang/Basic/OpenMPKinds.def" 3130bd520b7SAlexey Bataev default: 3140bd520b7SAlexey Bataev break; 3150bd520b7SAlexey Bataev } 3160bd520b7SAlexey Bataev break; 3175ec3eb11SAlexey Bataev case OMPD_unknown: 3185ec3eb11SAlexey Bataev case OMPD_threadprivate: 3191e0498a9SAlexey Bataev case OMPD_section: 32080c2289aSAlexander Musman case OMPD_master: 321d9ed09f7SAlexander Musman case OMPD_critical: 32268446b72SAlexey Bataev case OMPD_taskyield: 3234d1dfeabSAlexey Bataev case OMPD_barrier: 3242df347adSAlexey Bataev case OMPD_taskwait: 3259fb6e647SAlexey Bataev case OMPD_ordered: 3265ec3eb11SAlexey Bataev break; 3275ec3eb11SAlexey Bataev } 3285ec3eb11SAlexey Bataev return false; 3295ec3eb11SAlexey Bataev } 330f29276edSAlexey Bataev 331f29276edSAlexey Bataev bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) { 332*e4e893bbSAlexander Musman return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd || 333f82886e5SAlexander Musman DKind == OMPD_parallel_for || 334*e4e893bbSAlexander Musman DKind == OMPD_parallel_for_simd; // TODO add next directives. 335f29276edSAlexey Bataev } 336f29276edSAlexey Bataev 337f29276edSAlexey Bataev bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) { 338*e4e893bbSAlexander Musman return DKind == OMPD_for || DKind == OMPD_for_simd || 339*e4e893bbSAlexander Musman DKind == OMPD_sections || DKind == OMPD_section || 34084d0b3efSAlexey Bataev DKind == OMPD_single || DKind == OMPD_parallel_for || 341*e4e893bbSAlexander Musman DKind == OMPD_parallel_for_simd || 342*e4e893bbSAlexander Musman DKind == OMPD_parallel_sections; // TODO add next directives. 343f29276edSAlexey Bataev } 344f29276edSAlexey Bataev 345f29276edSAlexey Bataev bool clang::isOpenMPParallelDirective(OpenMPDirectiveKind DKind) { 34684d0b3efSAlexey Bataev return DKind == OMPD_parallel || DKind == OMPD_parallel_for || 347*e4e893bbSAlexander Musman DKind == OMPD_parallel_for_simd || 34884d0b3efSAlexey Bataev DKind == OMPD_parallel_sections; // TODO add next directives. 349f29276edSAlexey Bataev } 350f29276edSAlexey Bataev 351f29276edSAlexey Bataev bool clang::isOpenMPSimdDirective(OpenMPDirectiveKind DKind) { 352*e4e893bbSAlexander Musman return DKind == OMPD_simd || DKind == OMPD_for_simd || 353*e4e893bbSAlexander Musman DKind == OMPD_parallel_for_simd; // TODO add next directives. 354f29276edSAlexey Bataev } 355f29276edSAlexey Bataev 356f29276edSAlexey Bataev bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) { 357f29276edSAlexey Bataev return Kind == OMPC_private || Kind == OMPC_firstprivate || 358f29276edSAlexey Bataev Kind == OMPC_lastprivate || Kind == OMPC_linear || 359f29276edSAlexey Bataev Kind == OMPC_reduction; // TODO add next clauses like 'reduction'. 360f29276edSAlexey Bataev } 361f29276edSAlexey Bataev 362f29276edSAlexey Bataev bool clang::isOpenMPThreadPrivate(OpenMPClauseKind Kind) { 363f29276edSAlexey Bataev return Kind == OMPC_threadprivate || 364f29276edSAlexey Bataev Kind == OMPC_copyin; // TODO add next clauses like 'copyprivate'. 365f29276edSAlexey Bataev } 366f29276edSAlexey Bataev 367