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