17cc577a4SJonathan Peyton /*
2de4749b7SJonathan Peyton  * kmp_gsupport.cpp
37cc577a4SJonathan Peyton  */
47cc577a4SJonathan Peyton 
57cc577a4SJonathan Peyton 
67cc577a4SJonathan Peyton //===----------------------------------------------------------------------===//
77cc577a4SJonathan Peyton //
87cc577a4SJonathan Peyton //                     The LLVM Compiler Infrastructure
97cc577a4SJonathan Peyton //
107cc577a4SJonathan Peyton // This file is dual licensed under the MIT and the University of Illinois Open
117cc577a4SJonathan Peyton // Source Licenses. See LICENSE.txt for details.
127cc577a4SJonathan Peyton //
137cc577a4SJonathan Peyton //===----------------------------------------------------------------------===//
147cc577a4SJonathan Peyton 
157cc577a4SJonathan Peyton 
167cc577a4SJonathan Peyton #include "kmp.h"
177cc577a4SJonathan Peyton #include "kmp_atomic.h"
187cc577a4SJonathan Peyton 
197cc577a4SJonathan Peyton #if OMPT_SUPPORT
207cc577a4SJonathan Peyton #include "ompt-specific.h"
217cc577a4SJonathan Peyton #endif
227cc577a4SJonathan Peyton 
237cc577a4SJonathan Peyton #ifdef __cplusplus
247cc577a4SJonathan Peyton extern "C" {
257cc577a4SJonathan Peyton #endif // __cplusplus
267cc577a4SJonathan Peyton 
277cc577a4SJonathan Peyton #define MKLOC(loc, routine)                                                    \
287cc577a4SJonathan Peyton   static ident_t(loc) = {0, KMP_IDENT_KMPC, 0, 0, ";unknown;unknown;0;0;;"};
297cc577a4SJonathan Peyton 
307cc577a4SJonathan Peyton #include "kmp_ftn_os.h"
317cc577a4SJonathan Peyton 
32*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_BARRIER)(void) {
337cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
347cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_barrier");
357cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_barrier: T#%d\n", gtid));
367cc577a4SJonathan Peyton #if OMPT_SUPPORT && OMPT_TRACE
377cc577a4SJonathan Peyton   ompt_frame_t *ompt_frame;
387cc577a4SJonathan Peyton   if (ompt_enabled) {
397cc577a4SJonathan Peyton     ompt_frame = __ompt_get_task_frame_internal(0);
407cc577a4SJonathan Peyton     ompt_frame->reenter_runtime_frame = __builtin_frame_address(1);
417cc577a4SJonathan Peyton   }
427cc577a4SJonathan Peyton #endif
437cc577a4SJonathan Peyton   __kmpc_barrier(&loc, gtid);
447cc577a4SJonathan Peyton }
457cc577a4SJonathan Peyton 
467cc577a4SJonathan Peyton // Mutual exclusion
477cc577a4SJonathan Peyton 
48*3041982dSJonathan Peyton // The symbol that icc/ifort generates for unnamed for unnamed critical sections
49*3041982dSJonathan Peyton // - .gomp_critical_user_ - is defined using .comm in any objects reference it.
50*3041982dSJonathan Peyton // We can't reference it directly here in C code, as the symbol contains a ".".
517cc577a4SJonathan Peyton //
527cc577a4SJonathan Peyton // The RTL contains an assembly language definition of .gomp_critical_user_
537cc577a4SJonathan Peyton // with another symbol __kmp_unnamed_critical_addr initialized with it's
547cc577a4SJonathan Peyton // address.
557cc577a4SJonathan Peyton extern kmp_critical_name *__kmp_unnamed_critical_addr;
567cc577a4SJonathan Peyton 
57*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_CRITICAL_START)(void) {
587cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
597cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_critical_start");
607cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_critical_start: T#%d\n", gtid));
617cc577a4SJonathan Peyton   __kmpc_critical(&loc, gtid, __kmp_unnamed_critical_addr);
627cc577a4SJonathan Peyton }
637cc577a4SJonathan Peyton 
64*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_CRITICAL_END)(void) {
657cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
667cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_critical_end");
677cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_critical_end: T#%d\n", gtid));
687cc577a4SJonathan Peyton   __kmpc_end_critical(&loc, gtid, __kmp_unnamed_critical_addr);
697cc577a4SJonathan Peyton }
707cc577a4SJonathan Peyton 
71*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_CRITICAL_NAME_START)(void **pptr) {
727cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
737cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_critical_name_start");
747cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_critical_name_start: T#%d\n", gtid));
757cc577a4SJonathan Peyton   __kmpc_critical(&loc, gtid, (kmp_critical_name *)pptr);
767cc577a4SJonathan Peyton }
777cc577a4SJonathan Peyton 
78*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_CRITICAL_NAME_END)(void **pptr) {
797cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
807cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_critical_name_end");
817cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_critical_name_end: T#%d\n", gtid));
827cc577a4SJonathan Peyton   __kmpc_end_critical(&loc, gtid, (kmp_critical_name *)pptr);
837cc577a4SJonathan Peyton }
847cc577a4SJonathan Peyton 
857cc577a4SJonathan Peyton // The Gnu codegen tries to use locked operations to perform atomic updates
867cc577a4SJonathan Peyton // inline.  If it can't, then it calls GOMP_atomic_start() before performing
877cc577a4SJonathan Peyton // the update and GOMP_atomic_end() afterward, regardless of the data type.
88*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_ATOMIC_START)(void) {
897cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
907cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_atomic_start: T#%d\n", gtid));
917cc577a4SJonathan Peyton 
927cc577a4SJonathan Peyton #if OMPT_SUPPORT
937cc577a4SJonathan Peyton   __ompt_thread_assign_wait_id(0);
947cc577a4SJonathan Peyton #endif
957cc577a4SJonathan Peyton 
967cc577a4SJonathan Peyton   __kmp_acquire_atomic_lock(&__kmp_atomic_lock, gtid);
977cc577a4SJonathan Peyton }
987cc577a4SJonathan Peyton 
99*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_ATOMIC_END)(void) {
1007cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
1017cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_atomic_start: T#%d\n", gtid));
1027cc577a4SJonathan Peyton   __kmp_release_atomic_lock(&__kmp_atomic_lock, gtid);
1037cc577a4SJonathan Peyton }
1047cc577a4SJonathan Peyton 
105*3041982dSJonathan Peyton int xexpand(KMP_API_NAME_GOMP_SINGLE_START)(void) {
1067cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
1077cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_single_start");
1087cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_single_start: T#%d\n", gtid));
1097cc577a4SJonathan Peyton 
1107cc577a4SJonathan Peyton   if (!TCR_4(__kmp_init_parallel))
1117cc577a4SJonathan Peyton     __kmp_parallel_initialize();
1127cc577a4SJonathan Peyton 
1137cc577a4SJonathan Peyton   // 3rd parameter == FALSE prevents kmp_enter_single from pushing a
1147cc577a4SJonathan Peyton   // workshare when USE_CHECKS is defined.  We need to avoid the push,
1157cc577a4SJonathan Peyton   // as there is no corresponding GOMP_single_end() call.
1167cc577a4SJonathan Peyton   return __kmp_enter_single(gtid, &loc, FALSE);
1177cc577a4SJonathan Peyton }
1187cc577a4SJonathan Peyton 
119*3041982dSJonathan Peyton void *xexpand(KMP_API_NAME_GOMP_SINGLE_COPY_START)(void) {
1207cc577a4SJonathan Peyton   void *retval;
1217cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
1227cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_single_copy_start");
1237cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_single_copy_start: T#%d\n", gtid));
1247cc577a4SJonathan Peyton 
1257cc577a4SJonathan Peyton   if (!TCR_4(__kmp_init_parallel))
1267cc577a4SJonathan Peyton     __kmp_parallel_initialize();
1277cc577a4SJonathan Peyton 
128*3041982dSJonathan Peyton   // If this is the first thread to enter, return NULL.  The generated code will
129*3041982dSJonathan Peyton   // then call GOMP_single_copy_end() for this thread only, with the
130*3041982dSJonathan Peyton   // copyprivate data pointer as an argument.
1317cc577a4SJonathan Peyton   if (__kmp_enter_single(gtid, &loc, FALSE))
1327cc577a4SJonathan Peyton     return NULL;
1337cc577a4SJonathan Peyton 
1347cc577a4SJonathan Peyton   // Wait for the first thread to set the copyprivate data pointer,
1357cc577a4SJonathan Peyton   // and for all other threads to reach this point.
1367cc577a4SJonathan Peyton   __kmp_barrier(bs_plain_barrier, gtid, FALSE, 0, NULL, NULL);
1377cc577a4SJonathan Peyton 
1387cc577a4SJonathan Peyton   // Retrieve the value of the copyprivate data point, and wait for all
1397cc577a4SJonathan Peyton   // threads to do likewise, then return.
1407cc577a4SJonathan Peyton   retval = __kmp_team_from_gtid(gtid)->t.t_copypriv_data;
1417cc577a4SJonathan Peyton   __kmp_barrier(bs_plain_barrier, gtid, FALSE, 0, NULL, NULL);
1427cc577a4SJonathan Peyton   return retval;
1437cc577a4SJonathan Peyton }
1447cc577a4SJonathan Peyton 
145*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_SINGLE_COPY_END)(void *data) {
1467cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
1477cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_single_copy_end: T#%d\n", gtid));
1487cc577a4SJonathan Peyton 
149*3041982dSJonathan Peyton   // Set the copyprivate data pointer fo the team, then hit the barrier so that
150*3041982dSJonathan Peyton   // the other threads will continue on and read it.  Hit another barrier before
151*3041982dSJonathan Peyton   // continuing, so that the know that the copyprivate data pointer has been
152*3041982dSJonathan Peyton   // propagated to all threads before trying to reuse the t_copypriv_data field.
1537cc577a4SJonathan Peyton   __kmp_team_from_gtid(gtid)->t.t_copypriv_data = data;
1547cc577a4SJonathan Peyton   __kmp_barrier(bs_plain_barrier, gtid, FALSE, 0, NULL, NULL);
1557cc577a4SJonathan Peyton   __kmp_barrier(bs_plain_barrier, gtid, FALSE, 0, NULL, NULL);
1567cc577a4SJonathan Peyton }
1577cc577a4SJonathan Peyton 
158*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_ORDERED_START)(void) {
1597cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
1607cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_ordered_start");
1617cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_ordered_start: T#%d\n", gtid));
1627cc577a4SJonathan Peyton   __kmpc_ordered(&loc, gtid);
1637cc577a4SJonathan Peyton }
1647cc577a4SJonathan Peyton 
165*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_ORDERED_END)(void) {
1667cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
1677cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_ordered_end");
1687cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_ordered_start: T#%d\n", gtid));
1697cc577a4SJonathan Peyton   __kmpc_end_ordered(&loc, gtid);
1707cc577a4SJonathan Peyton }
1717cc577a4SJonathan Peyton 
1727cc577a4SJonathan Peyton // Dispatch macro defs
1737cc577a4SJonathan Peyton //
1747cc577a4SJonathan Peyton // They come in two flavors: 64-bit unsigned, and either 32-bit signed
1757cc577a4SJonathan Peyton // (IA-32 architecture) or 64-bit signed (Intel(R) 64).
1767cc577a4SJonathan Peyton 
1777cc577a4SJonathan Peyton #if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS
1787cc577a4SJonathan Peyton #define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_4
1797cc577a4SJonathan Peyton #define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_4
1807cc577a4SJonathan Peyton #define KMP_DISPATCH_NEXT __kmpc_dispatch_next_4
1817cc577a4SJonathan Peyton #else
1827cc577a4SJonathan Peyton #define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_8
1837cc577a4SJonathan Peyton #define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_8
1847cc577a4SJonathan Peyton #define KMP_DISPATCH_NEXT __kmpc_dispatch_next_8
1857cc577a4SJonathan Peyton #endif /* KMP_ARCH_X86 */
1867cc577a4SJonathan Peyton 
1877cc577a4SJonathan Peyton #define KMP_DISPATCH_INIT_ULL __kmp_aux_dispatch_init_8u
1887cc577a4SJonathan Peyton #define KMP_DISPATCH_FINI_CHUNK_ULL __kmp_aux_dispatch_fini_chunk_8u
1897cc577a4SJonathan Peyton #define KMP_DISPATCH_NEXT_ULL __kmpc_dispatch_next_8u
1907cc577a4SJonathan Peyton 
1917cc577a4SJonathan Peyton // The parallel contruct
1927cc577a4SJonathan Peyton 
1937cc577a4SJonathan Peyton #ifndef KMP_DEBUG
1947cc577a4SJonathan Peyton static
1957cc577a4SJonathan Peyton #endif /* KMP_DEBUG */
1967cc577a4SJonathan Peyton     void
1977cc577a4SJonathan Peyton     __kmp_GOMP_microtask_wrapper(int *gtid, int *npr, void (*task)(void *),
198*3041982dSJonathan Peyton                                  void *data) {
1997cc577a4SJonathan Peyton #if OMPT_SUPPORT
2007cc577a4SJonathan Peyton   kmp_info_t *thr;
2017cc577a4SJonathan Peyton   ompt_frame_t *ompt_frame;
2027cc577a4SJonathan Peyton   ompt_state_t enclosing_state;
2037cc577a4SJonathan Peyton 
2047cc577a4SJonathan Peyton   if (ompt_enabled) {
2057cc577a4SJonathan Peyton     // get pointer to thread data structure
2067cc577a4SJonathan Peyton     thr = __kmp_threads[*gtid];
2077cc577a4SJonathan Peyton 
2087cc577a4SJonathan Peyton     // save enclosing task state; set current state for task
2097cc577a4SJonathan Peyton     enclosing_state = thr->th.ompt_thread_info.state;
2107cc577a4SJonathan Peyton     thr->th.ompt_thread_info.state = ompt_state_work_parallel;
2117cc577a4SJonathan Peyton 
2127cc577a4SJonathan Peyton     // set task frame
2137cc577a4SJonathan Peyton     ompt_frame = __ompt_get_task_frame_internal(0);
2147cc577a4SJonathan Peyton     ompt_frame->exit_runtime_frame = __builtin_frame_address(0);
2157cc577a4SJonathan Peyton   }
2167cc577a4SJonathan Peyton #endif
2177cc577a4SJonathan Peyton 
2187cc577a4SJonathan Peyton   task(data);
2197cc577a4SJonathan Peyton 
2207cc577a4SJonathan Peyton #if OMPT_SUPPORT
2217cc577a4SJonathan Peyton   if (ompt_enabled) {
2227cc577a4SJonathan Peyton     // clear task frame
2237cc577a4SJonathan Peyton     ompt_frame->exit_runtime_frame = NULL;
2247cc577a4SJonathan Peyton 
2257cc577a4SJonathan Peyton     // restore enclosing state
2267cc577a4SJonathan Peyton     thr->th.ompt_thread_info.state = enclosing_state;
2277cc577a4SJonathan Peyton   }
2287cc577a4SJonathan Peyton #endif
2297cc577a4SJonathan Peyton }
2307cc577a4SJonathan Peyton 
2317cc577a4SJonathan Peyton #ifndef KMP_DEBUG
2327cc577a4SJonathan Peyton static
2337cc577a4SJonathan Peyton #endif /* KMP_DEBUG */
2347cc577a4SJonathan Peyton     void
2357cc577a4SJonathan Peyton     __kmp_GOMP_parallel_microtask_wrapper(int *gtid, int *npr,
236*3041982dSJonathan Peyton                                           void (*task)(void *), void *data,
237*3041982dSJonathan Peyton                                           unsigned num_threads, ident_t *loc,
238*3041982dSJonathan Peyton                                           enum sched_type schedule, long start,
239*3041982dSJonathan Peyton                                           long end, long incr,
240*3041982dSJonathan Peyton                                           long chunk_size) {
2417cc577a4SJonathan Peyton   // Intialize the loop worksharing construct.
2427cc577a4SJonathan Peyton   KMP_DISPATCH_INIT(loc, *gtid, schedule, start, end, incr, chunk_size,
2437cc577a4SJonathan Peyton                     schedule != kmp_sch_static);
2447cc577a4SJonathan Peyton 
2457cc577a4SJonathan Peyton #if OMPT_SUPPORT
2467cc577a4SJonathan Peyton   kmp_info_t *thr;
2477cc577a4SJonathan Peyton   ompt_frame_t *ompt_frame;
2487cc577a4SJonathan Peyton   ompt_state_t enclosing_state;
2497cc577a4SJonathan Peyton 
2507cc577a4SJonathan Peyton   if (ompt_enabled) {
2517cc577a4SJonathan Peyton     thr = __kmp_threads[*gtid];
2527cc577a4SJonathan Peyton     // save enclosing task state; set current state for task
2537cc577a4SJonathan Peyton     enclosing_state = thr->th.ompt_thread_info.state;
2547cc577a4SJonathan Peyton     thr->th.ompt_thread_info.state = ompt_state_work_parallel;
2557cc577a4SJonathan Peyton 
2567cc577a4SJonathan Peyton     // set task frame
2577cc577a4SJonathan Peyton     ompt_frame = __ompt_get_task_frame_internal(0);
2587cc577a4SJonathan Peyton     ompt_frame->exit_runtime_frame = __builtin_frame_address(0);
2597cc577a4SJonathan Peyton   }
2607cc577a4SJonathan Peyton #endif
2617cc577a4SJonathan Peyton 
2627cc577a4SJonathan Peyton   // Now invoke the microtask.
2637cc577a4SJonathan Peyton   task(data);
2647cc577a4SJonathan Peyton 
2657cc577a4SJonathan Peyton #if OMPT_SUPPORT
2667cc577a4SJonathan Peyton   if (ompt_enabled) {
2677cc577a4SJonathan Peyton     // clear task frame
2687cc577a4SJonathan Peyton     ompt_frame->exit_runtime_frame = NULL;
2697cc577a4SJonathan Peyton 
2707cc577a4SJonathan Peyton     // reset enclosing state
2717cc577a4SJonathan Peyton     thr->th.ompt_thread_info.state = enclosing_state;
2727cc577a4SJonathan Peyton   }
2737cc577a4SJonathan Peyton #endif
2747cc577a4SJonathan Peyton }
2757cc577a4SJonathan Peyton 
2767cc577a4SJonathan Peyton #ifndef KMP_DEBUG
2777cc577a4SJonathan Peyton static
2787cc577a4SJonathan Peyton #endif /* KMP_DEBUG */
2797cc577a4SJonathan Peyton     void
280*3041982dSJonathan Peyton     __kmp_GOMP_fork_call(ident_t *loc, int gtid, void (*unwrapped_task)(void *),
281*3041982dSJonathan Peyton                          microtask_t wrapper, int argc, ...) {
2827cc577a4SJonathan Peyton   int rc;
2837cc577a4SJonathan Peyton   kmp_info_t *thr = __kmp_threads[gtid];
2847cc577a4SJonathan Peyton   kmp_team_t *team = thr->th.th_team;
2857cc577a4SJonathan Peyton   int tid = __kmp_tid_from_gtid(gtid);
2867cc577a4SJonathan Peyton 
2877cc577a4SJonathan Peyton   va_list ap;
2887cc577a4SJonathan Peyton   va_start(ap, argc);
2897cc577a4SJonathan Peyton 
2907cc577a4SJonathan Peyton   rc = __kmp_fork_call(loc, gtid, fork_context_gnu, argc,
2917cc577a4SJonathan Peyton #if OMPT_SUPPORT
2927cc577a4SJonathan Peyton                        VOLATILE_CAST(void *) unwrapped_task,
2937cc577a4SJonathan Peyton #endif
2947cc577a4SJonathan Peyton                        wrapper, __kmp_invoke_task_func,
2957cc577a4SJonathan Peyton #if (KMP_ARCH_X86_64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64) && KMP_OS_LINUX
2967cc577a4SJonathan Peyton                        &ap
2977cc577a4SJonathan Peyton #else
2987cc577a4SJonathan Peyton                        ap
2997cc577a4SJonathan Peyton #endif
3007cc577a4SJonathan Peyton                        );
3017cc577a4SJonathan Peyton 
3027cc577a4SJonathan Peyton   va_end(ap);
3037cc577a4SJonathan Peyton 
3047cc577a4SJonathan Peyton   if (rc) {
3057cc577a4SJonathan Peyton     __kmp_run_before_invoked_task(gtid, tid, thr, team);
3067cc577a4SJonathan Peyton   }
3077cc577a4SJonathan Peyton 
3087cc577a4SJonathan Peyton #if OMPT_SUPPORT
3097cc577a4SJonathan Peyton   if (ompt_enabled) {
3107cc577a4SJonathan Peyton #if OMPT_TRACE
3117cc577a4SJonathan Peyton     ompt_team_info_t *team_info = __ompt_get_teaminfo(0, NULL);
3127cc577a4SJonathan Peyton     ompt_task_info_t *task_info = __ompt_get_taskinfo(0);
3137cc577a4SJonathan Peyton 
3147cc577a4SJonathan Peyton     // implicit task callback
3157cc577a4SJonathan Peyton     if (ompt_callbacks.ompt_callback(ompt_event_implicit_task_begin)) {
3167cc577a4SJonathan Peyton       ompt_callbacks.ompt_callback(ompt_event_implicit_task_begin)(
3177cc577a4SJonathan Peyton           team_info->parallel_id, task_info->task_id);
3187cc577a4SJonathan Peyton     }
3197cc577a4SJonathan Peyton #endif
3207cc577a4SJonathan Peyton     thr->th.ompt_thread_info.state = ompt_state_work_parallel;
3217cc577a4SJonathan Peyton   }
3227cc577a4SJonathan Peyton #endif
3237cc577a4SJonathan Peyton }
3247cc577a4SJonathan Peyton 
325*3041982dSJonathan Peyton static void __kmp_GOMP_serialized_parallel(ident_t *loc, kmp_int32 gtid,
326*3041982dSJonathan Peyton                                            void (*task)(void *)) {
3277cc577a4SJonathan Peyton #if OMPT_SUPPORT
3287cc577a4SJonathan Peyton   ompt_parallel_id_t ompt_parallel_id;
3297cc577a4SJonathan Peyton   if (ompt_enabled) {
3307cc577a4SJonathan Peyton     ompt_task_info_t *task_info = __ompt_get_taskinfo(0);
3317cc577a4SJonathan Peyton 
3327cc577a4SJonathan Peyton     ompt_parallel_id = __ompt_parallel_id_new(gtid);
3337cc577a4SJonathan Peyton 
3347cc577a4SJonathan Peyton     // parallel region callback
3357cc577a4SJonathan Peyton     if (ompt_callbacks.ompt_callback(ompt_event_parallel_begin)) {
3367cc577a4SJonathan Peyton       int team_size = 1;
3377cc577a4SJonathan Peyton       ompt_callbacks.ompt_callback(ompt_event_parallel_begin)(
338*3041982dSJonathan Peyton           task_info->task_id, &task_info->frame, ompt_parallel_id, team_size,
339*3041982dSJonathan Peyton           (void *)task, OMPT_INVOKER(fork_context_gnu));
3407cc577a4SJonathan Peyton     }
3417cc577a4SJonathan Peyton   }
3427cc577a4SJonathan Peyton #endif
3437cc577a4SJonathan Peyton 
3447cc577a4SJonathan Peyton   __kmp_serialized_parallel(loc, gtid);
3457cc577a4SJonathan Peyton 
3467cc577a4SJonathan Peyton #if OMPT_SUPPORT
3477cc577a4SJonathan Peyton   if (ompt_enabled) {
3487cc577a4SJonathan Peyton     kmp_info_t *thr = __kmp_threads[gtid];
3497cc577a4SJonathan Peyton 
3507cc577a4SJonathan Peyton     ompt_task_id_t my_ompt_task_id = __ompt_task_id_new(gtid);
3517cc577a4SJonathan Peyton 
3527cc577a4SJonathan Peyton     // set up lightweight task
353*3041982dSJonathan Peyton     ompt_lw_taskteam_t *lwt =
354*3041982dSJonathan Peyton         (ompt_lw_taskteam_t *)__kmp_allocate(sizeof(ompt_lw_taskteam_t));
3557cc577a4SJonathan Peyton     __ompt_lw_taskteam_init(lwt, thr, gtid, (void *)task, ompt_parallel_id);
3567cc577a4SJonathan Peyton     lwt->ompt_task_info.task_id = my_ompt_task_id;
3577cc577a4SJonathan Peyton     __ompt_lw_taskteam_link(lwt, thr);
3587cc577a4SJonathan Peyton 
3597cc577a4SJonathan Peyton #if OMPT_TRACE
3607cc577a4SJonathan Peyton     // implicit task callback
3617cc577a4SJonathan Peyton     if (ompt_callbacks.ompt_callback(ompt_event_implicit_task_begin)) {
3627cc577a4SJonathan Peyton       ompt_callbacks.ompt_callback(ompt_event_implicit_task_begin)(
3637cc577a4SJonathan Peyton           ompt_parallel_id, my_ompt_task_id);
3647cc577a4SJonathan Peyton     }
3657cc577a4SJonathan Peyton     thr->th.ompt_thread_info.state = ompt_state_work_parallel;
3667cc577a4SJonathan Peyton #endif
3677cc577a4SJonathan Peyton   }
3687cc577a4SJonathan Peyton #endif
3697cc577a4SJonathan Peyton }
3707cc577a4SJonathan Peyton 
371*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_PARALLEL_START)(void (*task)(void *), void *data,
372*3041982dSJonathan Peyton                                                unsigned num_threads) {
3737cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
3747cc577a4SJonathan Peyton 
3757cc577a4SJonathan Peyton #if OMPT_SUPPORT
3767cc577a4SJonathan Peyton   ompt_frame_t *parent_frame, *frame;
3777cc577a4SJonathan Peyton 
3787cc577a4SJonathan Peyton   if (ompt_enabled) {
3797cc577a4SJonathan Peyton     parent_frame = __ompt_get_task_frame_internal(0);
3807cc577a4SJonathan Peyton     parent_frame->reenter_runtime_frame = __builtin_frame_address(1);
3817cc577a4SJonathan Peyton   }
3827cc577a4SJonathan Peyton #endif
3837cc577a4SJonathan Peyton 
3847cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_parallel_start");
3857cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_parallel_start: T#%d\n", gtid));
3867cc577a4SJonathan Peyton 
3877cc577a4SJonathan Peyton   if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) {
3887cc577a4SJonathan Peyton     if (num_threads != 0) {
3897cc577a4SJonathan Peyton       __kmp_push_num_threads(&loc, gtid, num_threads);
3907cc577a4SJonathan Peyton     }
3917cc577a4SJonathan Peyton     __kmp_GOMP_fork_call(&loc, gtid, task,
392*3041982dSJonathan Peyton                          (microtask_t)__kmp_GOMP_microtask_wrapper, 2, task,
393*3041982dSJonathan Peyton                          data);
394*3041982dSJonathan Peyton   } else {
3957cc577a4SJonathan Peyton     __kmp_GOMP_serialized_parallel(&loc, gtid, task);
3967cc577a4SJonathan Peyton   }
3977cc577a4SJonathan Peyton 
3987cc577a4SJonathan Peyton #if OMPT_SUPPORT
3997cc577a4SJonathan Peyton   if (ompt_enabled) {
4007cc577a4SJonathan Peyton     frame = __ompt_get_task_frame_internal(0);
4017cc577a4SJonathan Peyton     frame->exit_runtime_frame = __builtin_frame_address(1);
4027cc577a4SJonathan Peyton   }
4037cc577a4SJonathan Peyton #endif
4047cc577a4SJonathan Peyton }
4057cc577a4SJonathan Peyton 
406*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_PARALLEL_END)(void) {
4077cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
4087cc577a4SJonathan Peyton   kmp_info_t *thr;
4097cc577a4SJonathan Peyton 
4107cc577a4SJonathan Peyton   thr = __kmp_threads[gtid];
4117cc577a4SJonathan Peyton 
4127cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_parallel_end");
4137cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_parallel_end: T#%d\n", gtid));
4147cc577a4SJonathan Peyton 
4157cc577a4SJonathan Peyton #if OMPT_SUPPORT
4167cc577a4SJonathan Peyton   ompt_parallel_id_t parallel_id;
4177cc577a4SJonathan Peyton   ompt_task_id_t serialized_task_id;
4187cc577a4SJonathan Peyton   ompt_frame_t *ompt_frame = NULL;
4197cc577a4SJonathan Peyton 
4207cc577a4SJonathan Peyton   if (ompt_enabled) {
4217cc577a4SJonathan Peyton     ompt_team_info_t *team_info = __ompt_get_teaminfo(0, NULL);
4227cc577a4SJonathan Peyton     parallel_id = team_info->parallel_id;
4237cc577a4SJonathan Peyton 
4247cc577a4SJonathan Peyton     ompt_task_info_t *task_info = __ompt_get_taskinfo(0);
4257cc577a4SJonathan Peyton     serialized_task_id = task_info->task_id;
4267cc577a4SJonathan Peyton 
4277cc577a4SJonathan Peyton     // unlink if necessary. no-op if there is not a lightweight task.
4287cc577a4SJonathan Peyton     ompt_lw_taskteam_t *lwt = __ompt_lw_taskteam_unlink(thr);
4297cc577a4SJonathan Peyton     // GOMP allocates/frees lwt since it can't be kept on the stack
4307cc577a4SJonathan Peyton     if (lwt) {
4317cc577a4SJonathan Peyton       __kmp_free(lwt);
4327cc577a4SJonathan Peyton     }
4337cc577a4SJonathan Peyton   }
4347cc577a4SJonathan Peyton #endif
4357cc577a4SJonathan Peyton 
4367cc577a4SJonathan Peyton   if (!thr->th.th_team->t.t_serialized) {
4377cc577a4SJonathan Peyton     __kmp_run_after_invoked_task(gtid, __kmp_tid_from_gtid(gtid), thr,
4387cc577a4SJonathan Peyton                                  thr->th.th_team);
4397cc577a4SJonathan Peyton 
4407cc577a4SJonathan Peyton #if OMPT_SUPPORT
4417cc577a4SJonathan Peyton     if (ompt_enabled) {
442*3041982dSJonathan Peyton       // Implicit task is finished here, in the barrier we might schedule
443*3041982dSJonathan Peyton       // deferred tasks,
4447cc577a4SJonathan Peyton       // these don't see the implicit task on the stack
4457cc577a4SJonathan Peyton       ompt_frame = __ompt_get_task_frame_internal(0);
4467cc577a4SJonathan Peyton       ompt_frame->exit_runtime_frame = NULL;
4477cc577a4SJonathan Peyton     }
4487cc577a4SJonathan Peyton #endif
4497cc577a4SJonathan Peyton 
4507cc577a4SJonathan Peyton     __kmp_join_call(&loc, gtid
4517cc577a4SJonathan Peyton #if OMPT_SUPPORT
452*3041982dSJonathan Peyton                     ,
453*3041982dSJonathan Peyton                     fork_context_gnu
4547cc577a4SJonathan Peyton #endif
4557cc577a4SJonathan Peyton                     );
456*3041982dSJonathan Peyton   } else {
4577cc577a4SJonathan Peyton #if OMPT_SUPPORT && OMPT_TRACE
4587cc577a4SJonathan Peyton     if (ompt_enabled &&
4597cc577a4SJonathan Peyton         ompt_callbacks.ompt_callback(ompt_event_implicit_task_end)) {
4607cc577a4SJonathan Peyton       ompt_callbacks.ompt_callback(ompt_event_implicit_task_end)(
4617cc577a4SJonathan Peyton           parallel_id, serialized_task_id);
4627cc577a4SJonathan Peyton     }
4637cc577a4SJonathan Peyton #endif
4647cc577a4SJonathan Peyton 
4657cc577a4SJonathan Peyton     __kmpc_end_serialized_parallel(&loc, gtid);
4667cc577a4SJonathan Peyton 
4677cc577a4SJonathan Peyton #if OMPT_SUPPORT
4687cc577a4SJonathan Peyton     if (ompt_enabled) {
4697cc577a4SJonathan Peyton       // Record that we re-entered the runtime system in the frame that
4707cc577a4SJonathan Peyton       // created the parallel region.
4717cc577a4SJonathan Peyton       ompt_task_info_t *parent_task_info = __ompt_get_taskinfo(0);
4727cc577a4SJonathan Peyton 
4737cc577a4SJonathan Peyton       if (ompt_callbacks.ompt_callback(ompt_event_parallel_end)) {
4747cc577a4SJonathan Peyton         ompt_callbacks.ompt_callback(ompt_event_parallel_end)(
4757cc577a4SJonathan Peyton             parallel_id, parent_task_info->task_id,
4767cc577a4SJonathan Peyton             OMPT_INVOKER(fork_context_gnu));
4777cc577a4SJonathan Peyton       }
4787cc577a4SJonathan Peyton 
4797cc577a4SJonathan Peyton       parent_task_info->frame.reenter_runtime_frame = NULL;
4807cc577a4SJonathan Peyton 
4817cc577a4SJonathan Peyton       thr->th.ompt_thread_info.state =
482*3041982dSJonathan Peyton           (((thr->th.th_team)->t.t_serialized) ? ompt_state_work_serial
483*3041982dSJonathan Peyton                                                : ompt_state_work_parallel);
4847cc577a4SJonathan Peyton     }
4857cc577a4SJonathan Peyton #endif
4867cc577a4SJonathan Peyton   }
4877cc577a4SJonathan Peyton }
4887cc577a4SJonathan Peyton 
4897cc577a4SJonathan Peyton // Loop worksharing constructs
4907cc577a4SJonathan Peyton 
4917cc577a4SJonathan Peyton // The Gnu codegen passes in an exclusive upper bound for the overall range,
4927cc577a4SJonathan Peyton // but the libguide dispatch code expects an inclusive upper bound, hence the
4937cc577a4SJonathan Peyton // "end - incr" 5th argument to KMP_DISPATCH_INIT (and the " ub - str" 11th
4947cc577a4SJonathan Peyton // argument to __kmp_GOMP_fork_call).
4957cc577a4SJonathan Peyton //
4967cc577a4SJonathan Peyton // Conversely, KMP_DISPATCH_NEXT returns and inclusive upper bound in *p_ub,
4977cc577a4SJonathan Peyton // but the Gnu codegen expects an excluside upper bound, so the adjustment
4987cc577a4SJonathan Peyton // "*p_ub += stride" compenstates for the discrepancy.
4997cc577a4SJonathan Peyton //
5007cc577a4SJonathan Peyton // Correction: the gnu codegen always adjusts the upper bound by +-1, not the
5017cc577a4SJonathan Peyton // stride value.  We adjust the dispatch parameters accordingly (by +-1), but
5027cc577a4SJonathan Peyton // we still adjust p_ub by the actual stride value.
5037cc577a4SJonathan Peyton //
5047cc577a4SJonathan Peyton // The "runtime" versions do not take a chunk_sz parameter.
5057cc577a4SJonathan Peyton //
5067cc577a4SJonathan Peyton // The profile lib cannot support construct checking of unordered loops that
5077cc577a4SJonathan Peyton // are predetermined by the compiler to be statically scheduled, as the gcc
5087cc577a4SJonathan Peyton // codegen will not always emit calls to GOMP_loop_static_next() to get the
5097cc577a4SJonathan Peyton // next iteration.  Instead, it emits inline code to call omp_get_thread_num()
5107cc577a4SJonathan Peyton // num and calculate the iteration space using the result.  It doesn't do this
5117cc577a4SJonathan Peyton // with ordered static loop, so they can be checked.
5127cc577a4SJonathan Peyton 
5137cc577a4SJonathan Peyton #define LOOP_START(func, schedule)                                             \
5147cc577a4SJonathan Peyton   int func(long lb, long ub, long str, long chunk_sz, long *p_lb,              \
515*3041982dSJonathan Peyton            long *p_ub) {                                                       \
5167cc577a4SJonathan Peyton     int status;                                                                \
5177cc577a4SJonathan Peyton     long stride;                                                               \
5187cc577a4SJonathan Peyton     int gtid = __kmp_entry_gtid();                                             \
5197cc577a4SJonathan Peyton     MKLOC(loc, #func);                                                         \
520*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
521*3041982dSJonathan Peyton              (#func ": T#%d, lb 0x%lx, ub 0x%lx, str 0x%lx, chunk_sz 0x%lx\n", \
5227cc577a4SJonathan Peyton               gtid, lb, ub, str, chunk_sz));                                   \
5237cc577a4SJonathan Peyton                                                                                \
5247cc577a4SJonathan Peyton     if ((str > 0) ? (lb < ub) : (lb > ub)) {                                   \
5257cc577a4SJonathan Peyton       KMP_DISPATCH_INIT(&loc, gtid, (schedule), lb,                            \
5267cc577a4SJonathan Peyton                         (str > 0) ? (ub - 1) : (ub + 1), str, chunk_sz,        \
5277cc577a4SJonathan Peyton                         (schedule) != kmp_sch_static);                         \
5287cc577a4SJonathan Peyton       status = KMP_DISPATCH_NEXT(&loc, gtid, NULL, (kmp_int *)p_lb,            \
5297cc577a4SJonathan Peyton                                  (kmp_int *)p_ub, (kmp_int *)&stride);         \
5307cc577a4SJonathan Peyton       if (status) {                                                            \
5317cc577a4SJonathan Peyton         KMP_DEBUG_ASSERT(stride == str);                                       \
5327cc577a4SJonathan Peyton         *p_ub += (str > 0) ? 1 : -1;                                           \
5337cc577a4SJonathan Peyton       }                                                                        \
534*3041982dSJonathan Peyton     } else {                                                                   \
5357cc577a4SJonathan Peyton       status = 0;                                                              \
5367cc577a4SJonathan Peyton     }                                                                          \
5377cc577a4SJonathan Peyton                                                                                \
538*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
539*3041982dSJonathan Peyton              (#func " exit: T#%d, *p_lb 0x%lx, *p_ub 0x%lx, returning %d\n",   \
5407cc577a4SJonathan Peyton               gtid, *p_lb, *p_ub, status));                                    \
5417cc577a4SJonathan Peyton     return status;                                                             \
5427cc577a4SJonathan Peyton   }
5437cc577a4SJonathan Peyton 
5447cc577a4SJonathan Peyton #define LOOP_RUNTIME_START(func, schedule)                                     \
545*3041982dSJonathan Peyton   int func(long lb, long ub, long str, long *p_lb, long *p_ub) {               \
5467cc577a4SJonathan Peyton     int status;                                                                \
5477cc577a4SJonathan Peyton     long stride;                                                               \
5487cc577a4SJonathan Peyton     long chunk_sz = 0;                                                         \
5497cc577a4SJonathan Peyton     int gtid = __kmp_entry_gtid();                                             \
5507cc577a4SJonathan Peyton     MKLOC(loc, #func);                                                         \
551*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
552*3041982dSJonathan Peyton              (#func ": T#%d, lb 0x%lx, ub 0x%lx, str 0x%lx, chunk_sz %d\n",    \
5537cc577a4SJonathan Peyton               gtid, lb, ub, str, chunk_sz));                                   \
5547cc577a4SJonathan Peyton                                                                                \
5557cc577a4SJonathan Peyton     if ((str > 0) ? (lb < ub) : (lb > ub)) {                                   \
5567cc577a4SJonathan Peyton       KMP_DISPATCH_INIT(&loc, gtid, (schedule), lb,                            \
5577cc577a4SJonathan Peyton                         (str > 0) ? (ub - 1) : (ub + 1), str, chunk_sz, TRUE); \
5587cc577a4SJonathan Peyton       status = KMP_DISPATCH_NEXT(&loc, gtid, NULL, (kmp_int *)p_lb,            \
5597cc577a4SJonathan Peyton                                  (kmp_int *)p_ub, (kmp_int *)&stride);         \
5607cc577a4SJonathan Peyton       if (status) {                                                            \
5617cc577a4SJonathan Peyton         KMP_DEBUG_ASSERT(stride == str);                                       \
5627cc577a4SJonathan Peyton         *p_ub += (str > 0) ? 1 : -1;                                           \
5637cc577a4SJonathan Peyton       }                                                                        \
564*3041982dSJonathan Peyton     } else {                                                                   \
5657cc577a4SJonathan Peyton       status = 0;                                                              \
5667cc577a4SJonathan Peyton     }                                                                          \
5677cc577a4SJonathan Peyton                                                                                \
568*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
569*3041982dSJonathan Peyton              (#func " exit: T#%d, *p_lb 0x%lx, *p_ub 0x%lx, returning %d\n",   \
5707cc577a4SJonathan Peyton               gtid, *p_lb, *p_ub, status));                                    \
5717cc577a4SJonathan Peyton     return status;                                                             \
5727cc577a4SJonathan Peyton   }
5737cc577a4SJonathan Peyton 
5747cc577a4SJonathan Peyton #define LOOP_NEXT(func, fini_code)                                             \
575*3041982dSJonathan Peyton   int func(long *p_lb, long *p_ub) {                                           \
5767cc577a4SJonathan Peyton     int status;                                                                \
5777cc577a4SJonathan Peyton     long stride;                                                               \
5787cc577a4SJonathan Peyton     int gtid = __kmp_get_gtid();                                               \
5797cc577a4SJonathan Peyton     MKLOC(loc, #func);                                                         \
5807cc577a4SJonathan Peyton     KA_TRACE(20, (#func ": T#%d\n", gtid));                                    \
5817cc577a4SJonathan Peyton                                                                                \
582*3041982dSJonathan Peyton     fini_code status = KMP_DISPATCH_NEXT(&loc, gtid, NULL, (kmp_int *)p_lb,    \
5837cc577a4SJonathan Peyton                                          (kmp_int *)p_ub, (kmp_int *)&stride); \
5847cc577a4SJonathan Peyton     if (status) {                                                              \
5857cc577a4SJonathan Peyton       *p_ub += (stride > 0) ? 1 : -1;                                          \
5867cc577a4SJonathan Peyton     }                                                                          \
5877cc577a4SJonathan Peyton                                                                                \
588*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
589*3041982dSJonathan Peyton              (#func " exit: T#%d, *p_lb 0x%lx, *p_ub 0x%lx, stride 0x%lx, "    \
590*3041982dSJonathan Peyton                     "returning %d\n",                                          \
591*3041982dSJonathan Peyton               gtid, *p_lb, *p_ub, stride, status));                            \
5927cc577a4SJonathan Peyton     return status;                                                             \
5937cc577a4SJonathan Peyton   }
5947cc577a4SJonathan Peyton 
5957cc577a4SJonathan Peyton LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_STATIC_START), kmp_sch_static)
5967cc577a4SJonathan Peyton LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT), {})
597*3041982dSJonathan Peyton LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START),
598*3041982dSJonathan Peyton            kmp_sch_dynamic_chunked)
5997cc577a4SJonathan Peyton LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT), {})
6007cc577a4SJonathan Peyton LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_GUIDED_START), kmp_sch_guided_chunked)
6017cc577a4SJonathan Peyton LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT), {})
602*3041982dSJonathan Peyton LOOP_RUNTIME_START(xexpand(KMP_API_NAME_GOMP_LOOP_RUNTIME_START),
603*3041982dSJonathan Peyton                    kmp_sch_runtime)
6047cc577a4SJonathan Peyton LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT), {})
6057cc577a4SJonathan Peyton 
6067cc577a4SJonathan Peyton LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START), kmp_ord_static)
607*3041982dSJonathan Peyton LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT),
6087cc577a4SJonathan Peyton           { KMP_DISPATCH_FINI_CHUNK(&loc, gtid); })
609*3041982dSJonathan Peyton LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START),
610*3041982dSJonathan Peyton            kmp_ord_dynamic_chunked)
611*3041982dSJonathan Peyton LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT),
6127cc577a4SJonathan Peyton           { KMP_DISPATCH_FINI_CHUNK(&loc, gtid); })
613*3041982dSJonathan Peyton LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START),
614*3041982dSJonathan Peyton            kmp_ord_guided_chunked)
615*3041982dSJonathan Peyton LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT),
6167cc577a4SJonathan Peyton           { KMP_DISPATCH_FINI_CHUNK(&loc, gtid); })
617*3041982dSJonathan Peyton LOOP_RUNTIME_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START),
618*3041982dSJonathan Peyton                    kmp_ord_runtime)
619*3041982dSJonathan Peyton LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT),
6207cc577a4SJonathan Peyton           { KMP_DISPATCH_FINI_CHUNK(&loc, gtid); })
6217cc577a4SJonathan Peyton 
622*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_LOOP_END)(void) {
6237cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
6247cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_loop_end: T#%d\n", gtid))
6257cc577a4SJonathan Peyton 
6267cc577a4SJonathan Peyton   __kmp_barrier(bs_plain_barrier, gtid, FALSE, 0, NULL, NULL);
6277cc577a4SJonathan Peyton 
6287cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_loop_end exit: T#%d\n", gtid))
6297cc577a4SJonathan Peyton }
6307cc577a4SJonathan Peyton 
631*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_LOOP_END_NOWAIT)(void) {
6327cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_loop_end_nowait: T#%d\n", __kmp_get_gtid()))
6337cc577a4SJonathan Peyton }
6347cc577a4SJonathan Peyton 
6357cc577a4SJonathan Peyton // Unsigned long long loop worksharing constructs
6367cc577a4SJonathan Peyton //
6377cc577a4SJonathan Peyton // These are new with gcc 4.4
6387cc577a4SJonathan Peyton 
6397cc577a4SJonathan Peyton #define LOOP_START_ULL(func, schedule)                                         \
6407cc577a4SJonathan Peyton   int func(int up, unsigned long long lb, unsigned long long ub,               \
6417cc577a4SJonathan Peyton            unsigned long long str, unsigned long long chunk_sz,                \
642*3041982dSJonathan Peyton            unsigned long long *p_lb, unsigned long long *p_ub) {               \
6437cc577a4SJonathan Peyton     int status;                                                                \
6447cc577a4SJonathan Peyton     long long str2 = up ? ((long long)str) : -((long long)str);                \
6457cc577a4SJonathan Peyton     long long stride;                                                          \
6467cc577a4SJonathan Peyton     int gtid = __kmp_entry_gtid();                                             \
6477cc577a4SJonathan Peyton     MKLOC(loc, #func);                                                         \
6487cc577a4SJonathan Peyton                                                                                \
649*3041982dSJonathan Peyton     KA_TRACE(                                                                  \
650*3041982dSJonathan Peyton         20,                                                                    \
651*3041982dSJonathan Peyton         (#func                                                                 \
652*3041982dSJonathan Peyton          ": T#%d, up %d, lb 0x%llx, ub 0x%llx, str 0x%llx, chunk_sz 0x%llx\n", \
6537cc577a4SJonathan Peyton          gtid, up, lb, ub, str, chunk_sz));                                    \
6547cc577a4SJonathan Peyton                                                                                \
6557cc577a4SJonathan Peyton     if ((str > 0) ? (lb < ub) : (lb > ub)) {                                   \
6567cc577a4SJonathan Peyton       KMP_DISPATCH_INIT_ULL(&loc, gtid, (schedule), lb,                        \
6577cc577a4SJonathan Peyton                             (str2 > 0) ? (ub - 1) : (ub + 1), str2, chunk_sz,  \
6587cc577a4SJonathan Peyton                             (schedule) != kmp_sch_static);                     \
659*3041982dSJonathan Peyton       status =                                                                 \
660*3041982dSJonathan Peyton           KMP_DISPATCH_NEXT_ULL(&loc, gtid, NULL, (kmp_uint64 *)p_lb,          \
661*3041982dSJonathan Peyton                                 (kmp_uint64 *)p_ub, (kmp_int64 *)&stride);     \
6627cc577a4SJonathan Peyton       if (status) {                                                            \
6637cc577a4SJonathan Peyton         KMP_DEBUG_ASSERT(stride == str2);                                      \
6647cc577a4SJonathan Peyton         *p_ub += (str > 0) ? 1 : -1;                                           \
6657cc577a4SJonathan Peyton       }                                                                        \
666*3041982dSJonathan Peyton     } else {                                                                   \
6677cc577a4SJonathan Peyton       status = 0;                                                              \
6687cc577a4SJonathan Peyton     }                                                                          \
6697cc577a4SJonathan Peyton                                                                                \
670*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
671*3041982dSJonathan Peyton              (#func " exit: T#%d, *p_lb 0x%llx, *p_ub 0x%llx, returning %d\n", \
6727cc577a4SJonathan Peyton               gtid, *p_lb, *p_ub, status));                                    \
6737cc577a4SJonathan Peyton     return status;                                                             \
6747cc577a4SJonathan Peyton   }
6757cc577a4SJonathan Peyton 
6767cc577a4SJonathan Peyton #define LOOP_RUNTIME_START_ULL(func, schedule)                                 \
6777cc577a4SJonathan Peyton   int func(int up, unsigned long long lb, unsigned long long ub,               \
6787cc577a4SJonathan Peyton            unsigned long long str, unsigned long long *p_lb,                   \
679*3041982dSJonathan Peyton            unsigned long long *p_ub) {                                         \
6807cc577a4SJonathan Peyton     int status;                                                                \
6817cc577a4SJonathan Peyton     long long str2 = up ? ((long long)str) : -((long long)str);                \
6827cc577a4SJonathan Peyton     unsigned long long stride;                                                 \
6837cc577a4SJonathan Peyton     unsigned long long chunk_sz = 0;                                           \
6847cc577a4SJonathan Peyton     int gtid = __kmp_entry_gtid();                                             \
6857cc577a4SJonathan Peyton     MKLOC(loc, #func);                                                         \
6867cc577a4SJonathan Peyton                                                                                \
687*3041982dSJonathan Peyton     KA_TRACE(                                                                  \
688*3041982dSJonathan Peyton         20,                                                                    \
689*3041982dSJonathan Peyton         (#func                                                                 \
690*3041982dSJonathan Peyton          ": T#%d, up %d, lb 0x%llx, ub 0x%llx, str 0x%llx, chunk_sz 0x%llx\n", \
6917cc577a4SJonathan Peyton          gtid, up, lb, ub, str, chunk_sz));                                    \
6927cc577a4SJonathan Peyton                                                                                \
6937cc577a4SJonathan Peyton     if ((str > 0) ? (lb < ub) : (lb > ub)) {                                   \
6947cc577a4SJonathan Peyton       KMP_DISPATCH_INIT_ULL(&loc, gtid, (schedule), lb,                        \
695*3041982dSJonathan Peyton                             (str2 > 0) ? (ub - 1) : (ub + 1), str2, chunk_sz,  \
696*3041982dSJonathan Peyton                             TRUE);                                             \
697*3041982dSJonathan Peyton       status =                                                                 \
698*3041982dSJonathan Peyton           KMP_DISPATCH_NEXT_ULL(&loc, gtid, NULL, (kmp_uint64 *)p_lb,          \
699*3041982dSJonathan Peyton                                 (kmp_uint64 *)p_ub, (kmp_int64 *)&stride);     \
7007cc577a4SJonathan Peyton       if (status) {                                                            \
7017cc577a4SJonathan Peyton         KMP_DEBUG_ASSERT((long long)stride == str2);                           \
7027cc577a4SJonathan Peyton         *p_ub += (str > 0) ? 1 : -1;                                           \
7037cc577a4SJonathan Peyton       }                                                                        \
704*3041982dSJonathan Peyton     } else {                                                                   \
7057cc577a4SJonathan Peyton       status = 0;                                                              \
7067cc577a4SJonathan Peyton     }                                                                          \
7077cc577a4SJonathan Peyton                                                                                \
708*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
709*3041982dSJonathan Peyton              (#func " exit: T#%d, *p_lb 0x%llx, *p_ub 0x%llx, returning %d\n", \
7107cc577a4SJonathan Peyton               gtid, *p_lb, *p_ub, status));                                    \
7117cc577a4SJonathan Peyton     return status;                                                             \
7127cc577a4SJonathan Peyton   }
7137cc577a4SJonathan Peyton 
7147cc577a4SJonathan Peyton #define LOOP_NEXT_ULL(func, fini_code)                                         \
715*3041982dSJonathan Peyton   int func(unsigned long long *p_lb, unsigned long long *p_ub) {               \
7167cc577a4SJonathan Peyton     int status;                                                                \
7177cc577a4SJonathan Peyton     long long stride;                                                          \
7187cc577a4SJonathan Peyton     int gtid = __kmp_get_gtid();                                               \
7197cc577a4SJonathan Peyton     MKLOC(loc, #func);                                                         \
7207cc577a4SJonathan Peyton     KA_TRACE(20, (#func ": T#%d\n", gtid));                                    \
7217cc577a4SJonathan Peyton                                                                                \
722*3041982dSJonathan Peyton     fini_code status =                                                         \
723*3041982dSJonathan Peyton         KMP_DISPATCH_NEXT_ULL(&loc, gtid, NULL, (kmp_uint64 *)p_lb,            \
7247cc577a4SJonathan Peyton                               (kmp_uint64 *)p_ub, (kmp_int64 *)&stride);       \
7257cc577a4SJonathan Peyton     if (status) {                                                              \
7267cc577a4SJonathan Peyton       *p_ub += (stride > 0) ? 1 : -1;                                          \
7277cc577a4SJonathan Peyton     }                                                                          \
7287cc577a4SJonathan Peyton                                                                                \
729*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
730*3041982dSJonathan Peyton              (#func " exit: T#%d, *p_lb 0x%llx, *p_ub 0x%llx, stride 0x%llx, " \
731*3041982dSJonathan Peyton                     "returning %d\n",                                          \
732*3041982dSJonathan Peyton               gtid, *p_lb, *p_ub, stride, status));                            \
7337cc577a4SJonathan Peyton     return status;                                                             \
7347cc577a4SJonathan Peyton   }
7357cc577a4SJonathan Peyton 
7367cc577a4SJonathan Peyton LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START), kmp_sch_static)
7377cc577a4SJonathan Peyton LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT), {})
738*3041982dSJonathan Peyton LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START),
739*3041982dSJonathan Peyton                kmp_sch_dynamic_chunked)
7407cc577a4SJonathan Peyton LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT), {})
741*3041982dSJonathan Peyton LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START),
742*3041982dSJonathan Peyton                kmp_sch_guided_chunked)
7437cc577a4SJonathan Peyton LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT), {})
744*3041982dSJonathan Peyton LOOP_RUNTIME_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START),
745*3041982dSJonathan Peyton                        kmp_sch_runtime)
7467cc577a4SJonathan Peyton LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT), {})
7477cc577a4SJonathan Peyton 
748*3041982dSJonathan Peyton LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START),
749*3041982dSJonathan Peyton                kmp_ord_static)
750*3041982dSJonathan Peyton LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT),
7517cc577a4SJonathan Peyton               { KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); })
752*3041982dSJonathan Peyton LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START),
753*3041982dSJonathan Peyton                kmp_ord_dynamic_chunked)
754*3041982dSJonathan Peyton LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT),
7557cc577a4SJonathan Peyton               { KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); })
756*3041982dSJonathan Peyton LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START),
757*3041982dSJonathan Peyton                kmp_ord_guided_chunked)
758*3041982dSJonathan Peyton LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT),
7597cc577a4SJonathan Peyton               { KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); })
760*3041982dSJonathan Peyton LOOP_RUNTIME_START_ULL(
761*3041982dSJonathan Peyton     xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START), kmp_ord_runtime)
762*3041982dSJonathan Peyton LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT),
7637cc577a4SJonathan Peyton               { KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); })
7647cc577a4SJonathan Peyton 
7657cc577a4SJonathan Peyton // Combined parallel / loop worksharing constructs
7667cc577a4SJonathan Peyton //
7677cc577a4SJonathan Peyton // There are no ull versions (yet).
7687cc577a4SJonathan Peyton 
7697cc577a4SJonathan Peyton #define PARALLEL_LOOP_START(func, schedule, ompt_pre, ompt_post)               \
770*3041982dSJonathan Peyton   void func(void (*task)(void *), void *data, unsigned num_threads, long lb,   \
771*3041982dSJonathan Peyton             long ub, long str, long chunk_sz) {                                \
7727cc577a4SJonathan Peyton     int gtid = __kmp_entry_gtid();                                             \
7737cc577a4SJonathan Peyton     MKLOC(loc, #func);                                                         \
774*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
775*3041982dSJonathan Peyton              (#func ": T#%d, lb 0x%lx, ub 0x%lx, str 0x%lx, chunk_sz 0x%lx\n", \
7767cc577a4SJonathan Peyton               gtid, lb, ub, str, chunk_sz));                                   \
7777cc577a4SJonathan Peyton                                                                                \
7787cc577a4SJonathan Peyton     ompt_pre();                                                                \
7797cc577a4SJonathan Peyton                                                                                \
7807cc577a4SJonathan Peyton     if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) {                       \
7817cc577a4SJonathan Peyton       if (num_threads != 0) {                                                  \
7827cc577a4SJonathan Peyton         __kmp_push_num_threads(&loc, gtid, num_threads);                       \
7837cc577a4SJonathan Peyton       }                                                                        \
7847cc577a4SJonathan Peyton       __kmp_GOMP_fork_call(&loc, gtid, task,                                   \
785*3041982dSJonathan Peyton                            (microtask_t)__kmp_GOMP_parallel_microtask_wrapper, \
786*3041982dSJonathan Peyton                            9, task, data, num_threads, &loc, (schedule), lb,   \
7877cc577a4SJonathan Peyton                            (str > 0) ? (ub - 1) : (ub + 1), str, chunk_sz);    \
788*3041982dSJonathan Peyton     } else {                                                                   \
7897cc577a4SJonathan Peyton       __kmp_GOMP_serialized_parallel(&loc, gtid, task);                        \
7907cc577a4SJonathan Peyton     }                                                                          \
7917cc577a4SJonathan Peyton                                                                                \
7927cc577a4SJonathan Peyton     KMP_DISPATCH_INIT(&loc, gtid, (schedule), lb,                              \
7937cc577a4SJonathan Peyton                       (str > 0) ? (ub - 1) : (ub + 1), str, chunk_sz,          \
7947cc577a4SJonathan Peyton                       (schedule) != kmp_sch_static);                           \
7957cc577a4SJonathan Peyton                                                                                \
7967cc577a4SJonathan Peyton     ompt_post();                                                               \
7977cc577a4SJonathan Peyton                                                                                \
7987cc577a4SJonathan Peyton     KA_TRACE(20, (#func " exit: T#%d\n", gtid));                               \
7997cc577a4SJonathan Peyton   }
8007cc577a4SJonathan Peyton 
8017cc577a4SJonathan Peyton #if OMPT_SUPPORT
8027cc577a4SJonathan Peyton 
8037cc577a4SJonathan Peyton #define OMPT_LOOP_PRE()                                                        \
8047cc577a4SJonathan Peyton   ompt_frame_t *parent_frame;                                                  \
8057cc577a4SJonathan Peyton   if (ompt_enabled) {                                                          \
8067cc577a4SJonathan Peyton     parent_frame = __ompt_get_task_frame_internal(0);                          \
8077cc577a4SJonathan Peyton     parent_frame->reenter_runtime_frame = __builtin_frame_address(1);          \
8087cc577a4SJonathan Peyton   }
8097cc577a4SJonathan Peyton 
8107cc577a4SJonathan Peyton #define OMPT_LOOP_POST()                                                       \
8117cc577a4SJonathan Peyton   if (ompt_enabled) {                                                          \
8127cc577a4SJonathan Peyton     parent_frame->reenter_runtime_frame = NULL;                                \
8137cc577a4SJonathan Peyton   }
8147cc577a4SJonathan Peyton 
8157cc577a4SJonathan Peyton #else
8167cc577a4SJonathan Peyton 
8177cc577a4SJonathan Peyton #define OMPT_LOOP_PRE()
8187cc577a4SJonathan Peyton 
8197cc577a4SJonathan Peyton #define OMPT_LOOP_POST()
8207cc577a4SJonathan Peyton 
8217cc577a4SJonathan Peyton #endif
8227cc577a4SJonathan Peyton 
8237cc577a4SJonathan Peyton PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START),
8247cc577a4SJonathan Peyton                     kmp_sch_static, OMPT_LOOP_PRE, OMPT_LOOP_POST)
8257cc577a4SJonathan Peyton PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START),
8267cc577a4SJonathan Peyton                     kmp_sch_dynamic_chunked, OMPT_LOOP_PRE, OMPT_LOOP_POST)
8277cc577a4SJonathan Peyton PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START),
8287cc577a4SJonathan Peyton                     kmp_sch_guided_chunked, OMPT_LOOP_PRE, OMPT_LOOP_POST)
8297cc577a4SJonathan Peyton PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START),
8307cc577a4SJonathan Peyton                     kmp_sch_runtime, OMPT_LOOP_PRE, OMPT_LOOP_POST)
8317cc577a4SJonathan Peyton 
8327cc577a4SJonathan Peyton // Tasking constructs
8337cc577a4SJonathan Peyton 
834*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TASK)(void (*func)(void *), void *data,
835*3041982dSJonathan Peyton                                      void (*copy_func)(void *, void *),
836*3041982dSJonathan Peyton                                      long arg_size, long arg_align,
837*3041982dSJonathan Peyton                                      bool if_cond, unsigned gomp_flags
8380788515cSPaul Osmialowski #if OMP_40_ENABLED
839*3041982dSJonathan Peyton                                      ,
840*3041982dSJonathan Peyton                                      void **depend
8410788515cSPaul Osmialowski #endif
842*3041982dSJonathan Peyton                                      ) {
8437cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_task");
8447cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
8457cc577a4SJonathan Peyton   kmp_int32 flags = 0;
8467cc577a4SJonathan Peyton   kmp_tasking_flags_t *input_flags = (kmp_tasking_flags_t *)&flags;
8477cc577a4SJonathan Peyton 
8487cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_task: T#%d\n", gtid));
8497cc577a4SJonathan Peyton 
8507cc577a4SJonathan Peyton   // The low-order bit is the "tied" flag
8517cc577a4SJonathan Peyton   if (gomp_flags & 1) {
8527cc577a4SJonathan Peyton     input_flags->tiedness = 1;
8537cc577a4SJonathan Peyton   }
8547cc577a4SJonathan Peyton   // The second low-order bit is the "final" flag
8557cc577a4SJonathan Peyton   if (gomp_flags & 2) {
8567cc577a4SJonathan Peyton     input_flags->final = 1;
8577cc577a4SJonathan Peyton   }
8587cc577a4SJonathan Peyton   input_flags->native = 1;
8597cc577a4SJonathan Peyton   // __kmp_task_alloc() sets up all other flags
8607cc577a4SJonathan Peyton 
8617cc577a4SJonathan Peyton   if (!if_cond) {
8627cc577a4SJonathan Peyton     arg_size = 0;
8637cc577a4SJonathan Peyton   }
8647cc577a4SJonathan Peyton 
865*3041982dSJonathan Peyton   kmp_task_t *task = __kmp_task_alloc(
866*3041982dSJonathan Peyton       &loc, gtid, input_flags, sizeof(kmp_task_t),
867*3041982dSJonathan Peyton       arg_size ? arg_size + arg_align - 1 : 0, (kmp_routine_entry_t)func);
8687cc577a4SJonathan Peyton 
8697cc577a4SJonathan Peyton   if (arg_size > 0) {
8707cc577a4SJonathan Peyton     if (arg_align > 0) {
871*3041982dSJonathan Peyton       task->shareds = (void *)((((size_t)task->shareds) + arg_align - 1) /
872*3041982dSJonathan Peyton                                arg_align * arg_align);
8737cc577a4SJonathan Peyton     }
8747cc577a4SJonathan Peyton     // else error??
8757cc577a4SJonathan Peyton 
8767cc577a4SJonathan Peyton     if (copy_func) {
8777cc577a4SJonathan Peyton       (*copy_func)(task->shareds, data);
878*3041982dSJonathan Peyton     } else {
8797cc577a4SJonathan Peyton       KMP_MEMCPY(task->shareds, data, arg_size);
8807cc577a4SJonathan Peyton     }
8817cc577a4SJonathan Peyton   }
8827cc577a4SJonathan Peyton 
8837cc577a4SJonathan Peyton   if (if_cond) {
8840788515cSPaul Osmialowski #if OMP_40_ENABLED
8850788515cSPaul Osmialowski     if (gomp_flags & 8) {
8860788515cSPaul Osmialowski       KMP_ASSERT(depend);
8870788515cSPaul Osmialowski       const size_t ndeps = (kmp_intptr_t)depend[0];
8880788515cSPaul Osmialowski       const size_t nout = (kmp_intptr_t)depend[1];
8890788515cSPaul Osmialowski       kmp_depend_info_t dep_list[ndeps];
8900788515cSPaul Osmialowski 
8910788515cSPaul Osmialowski       for (size_t i = 0U; i < ndeps; i++) {
8920788515cSPaul Osmialowski         dep_list[i].base_addr = (kmp_intptr_t)depend[2U + i];
8930788515cSPaul Osmialowski         dep_list[i].len = 0U;
8940788515cSPaul Osmialowski         dep_list[i].flags.in = 1;
8950788515cSPaul Osmialowski         dep_list[i].flags.out = (i < nout);
8960788515cSPaul Osmialowski       }
8970788515cSPaul Osmialowski       __kmpc_omp_task_with_deps(&loc, gtid, task, ndeps, dep_list, 0, NULL);
898*3041982dSJonathan Peyton     } else
8990788515cSPaul Osmialowski #endif
9007cc577a4SJonathan Peyton       __kmpc_omp_task(&loc, gtid, task);
901*3041982dSJonathan Peyton   } else {
9027cc577a4SJonathan Peyton #if OMPT_SUPPORT
9037cc577a4SJonathan Peyton     ompt_thread_info_t oldInfo;
9047cc577a4SJonathan Peyton     kmp_info_t *thread;
9057cc577a4SJonathan Peyton     kmp_taskdata_t *taskdata;
9067cc577a4SJonathan Peyton     if (ompt_enabled) {
9077cc577a4SJonathan Peyton       // Store the threads states and restore them after the task
9087cc577a4SJonathan Peyton       thread = __kmp_threads[gtid];
9097cc577a4SJonathan Peyton       taskdata = KMP_TASK_TO_TASKDATA(task);
9107cc577a4SJonathan Peyton       oldInfo = thread->th.ompt_thread_info;
9117cc577a4SJonathan Peyton       thread->th.ompt_thread_info.wait_id = 0;
9127cc577a4SJonathan Peyton       thread->th.ompt_thread_info.state = ompt_state_work_parallel;
9137cc577a4SJonathan Peyton       taskdata->ompt_task_info.frame.exit_runtime_frame =
9147cc577a4SJonathan Peyton           __builtin_frame_address(0);
9157cc577a4SJonathan Peyton     }
9167cc577a4SJonathan Peyton #endif
9177cc577a4SJonathan Peyton 
9187cc577a4SJonathan Peyton     __kmpc_omp_task_begin_if0(&loc, gtid, task);
9197cc577a4SJonathan Peyton     func(data);
9207cc577a4SJonathan Peyton     __kmpc_omp_task_complete_if0(&loc, gtid, task);
9217cc577a4SJonathan Peyton 
9227cc577a4SJonathan Peyton #if OMPT_SUPPORT
9237cc577a4SJonathan Peyton     if (ompt_enabled) {
9247cc577a4SJonathan Peyton       thread->th.ompt_thread_info = oldInfo;
9257cc577a4SJonathan Peyton       taskdata->ompt_task_info.frame.exit_runtime_frame = NULL;
9267cc577a4SJonathan Peyton     }
9277cc577a4SJonathan Peyton #endif
9287cc577a4SJonathan Peyton   }
9297cc577a4SJonathan Peyton 
9307cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_task exit: T#%d\n", gtid));
9317cc577a4SJonathan Peyton }
9327cc577a4SJonathan Peyton 
933*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TASKWAIT)(void) {
9347cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_taskwait");
9357cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
9367cc577a4SJonathan Peyton 
9377cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_taskwait: T#%d\n", gtid));
9387cc577a4SJonathan Peyton 
9397cc577a4SJonathan Peyton   __kmpc_omp_taskwait(&loc, gtid);
9407cc577a4SJonathan Peyton 
9417cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_taskwait exit: T#%d\n", gtid));
9427cc577a4SJonathan Peyton }
9437cc577a4SJonathan Peyton 
9447cc577a4SJonathan Peyton // Sections worksharing constructs
9457cc577a4SJonathan Peyton //
9467cc577a4SJonathan Peyton // For the sections construct, we initialize a dynamically scheduled loop
9477cc577a4SJonathan Peyton // worksharing construct with lb 1 and stride 1, and use the iteration #'s
9487cc577a4SJonathan Peyton // that its returns as sections ids.
9497cc577a4SJonathan Peyton //
9507cc577a4SJonathan Peyton // There are no special entry points for ordered sections, so we always use
9517cc577a4SJonathan Peyton // the dynamically scheduled workshare, even if the sections aren't ordered.
9527cc577a4SJonathan Peyton 
953*3041982dSJonathan Peyton unsigned xexpand(KMP_API_NAME_GOMP_SECTIONS_START)(unsigned count) {
9547cc577a4SJonathan Peyton   int status;
9557cc577a4SJonathan Peyton   kmp_int lb, ub, stride;
9567cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
9577cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_sections_start");
9587cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_sections_start: T#%d\n", gtid));
9597cc577a4SJonathan Peyton 
9607cc577a4SJonathan Peyton   KMP_DISPATCH_INIT(&loc, gtid, kmp_nm_dynamic_chunked, 1, count, 1, 1, TRUE);
9617cc577a4SJonathan Peyton 
9627cc577a4SJonathan Peyton   status = KMP_DISPATCH_NEXT(&loc, gtid, NULL, &lb, &ub, &stride);
9637cc577a4SJonathan Peyton   if (status) {
9647cc577a4SJonathan Peyton     KMP_DEBUG_ASSERT(stride == 1);
9657cc577a4SJonathan Peyton     KMP_DEBUG_ASSERT(lb > 0);
9667cc577a4SJonathan Peyton     KMP_ASSERT(lb == ub);
967*3041982dSJonathan Peyton   } else {
9687cc577a4SJonathan Peyton     lb = 0;
9697cc577a4SJonathan Peyton   }
9707cc577a4SJonathan Peyton 
9717cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_sections_start exit: T#%d returning %u\n", gtid,
9727cc577a4SJonathan Peyton                 (unsigned)lb));
9737cc577a4SJonathan Peyton   return (unsigned)lb;
9747cc577a4SJonathan Peyton }
9757cc577a4SJonathan Peyton 
976*3041982dSJonathan Peyton unsigned xexpand(KMP_API_NAME_GOMP_SECTIONS_NEXT)(void) {
9777cc577a4SJonathan Peyton   int status;
9787cc577a4SJonathan Peyton   kmp_int lb, ub, stride;
9797cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
9807cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_sections_next");
9817cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_sections_next: T#%d\n", gtid));
9827cc577a4SJonathan Peyton 
9837cc577a4SJonathan Peyton   status = KMP_DISPATCH_NEXT(&loc, gtid, NULL, &lb, &ub, &stride);
9847cc577a4SJonathan Peyton   if (status) {
9857cc577a4SJonathan Peyton     KMP_DEBUG_ASSERT(stride == 1);
9867cc577a4SJonathan Peyton     KMP_DEBUG_ASSERT(lb > 0);
9877cc577a4SJonathan Peyton     KMP_ASSERT(lb == ub);
988*3041982dSJonathan Peyton   } else {
9897cc577a4SJonathan Peyton     lb = 0;
9907cc577a4SJonathan Peyton   }
9917cc577a4SJonathan Peyton 
992*3041982dSJonathan Peyton   KA_TRACE(
993*3041982dSJonathan Peyton       20, ("GOMP_sections_next exit: T#%d returning %u\n", gtid, (unsigned)lb));
9947cc577a4SJonathan Peyton   return (unsigned)lb;
9957cc577a4SJonathan Peyton }
9967cc577a4SJonathan Peyton 
997*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START)(void (*task)(void *),
998*3041982dSJonathan Peyton                                                         void *data,
999*3041982dSJonathan Peyton                                                         unsigned num_threads,
1000*3041982dSJonathan Peyton                                                         unsigned count) {
10017cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
10027cc577a4SJonathan Peyton 
10037cc577a4SJonathan Peyton #if OMPT_SUPPORT
10047cc577a4SJonathan Peyton   ompt_frame_t *parent_frame;
10057cc577a4SJonathan Peyton 
10067cc577a4SJonathan Peyton   if (ompt_enabled) {
10077cc577a4SJonathan Peyton     parent_frame = __ompt_get_task_frame_internal(0);
10087cc577a4SJonathan Peyton     parent_frame->reenter_runtime_frame = __builtin_frame_address(1);
10097cc577a4SJonathan Peyton   }
10107cc577a4SJonathan Peyton #endif
10117cc577a4SJonathan Peyton 
10127cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_parallel_sections_start");
10137cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_parallel_sections_start: T#%d\n", gtid));
10147cc577a4SJonathan Peyton 
10157cc577a4SJonathan Peyton   if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) {
10167cc577a4SJonathan Peyton     if (num_threads != 0) {
10177cc577a4SJonathan Peyton       __kmp_push_num_threads(&loc, gtid, num_threads);
10187cc577a4SJonathan Peyton     }
10197cc577a4SJonathan Peyton     __kmp_GOMP_fork_call(&loc, gtid, task,
1020*3041982dSJonathan Peyton                          (microtask_t)__kmp_GOMP_parallel_microtask_wrapper, 9,
1021*3041982dSJonathan Peyton                          task, data, num_threads, &loc, kmp_nm_dynamic_chunked,
1022*3041982dSJonathan Peyton                          (kmp_int)1, (kmp_int)count, (kmp_int)1, (kmp_int)1);
1023*3041982dSJonathan Peyton   } else {
10247cc577a4SJonathan Peyton     __kmp_GOMP_serialized_parallel(&loc, gtid, task);
10257cc577a4SJonathan Peyton   }
10267cc577a4SJonathan Peyton 
10277cc577a4SJonathan Peyton #if OMPT_SUPPORT
10287cc577a4SJonathan Peyton   if (ompt_enabled) {
10297cc577a4SJonathan Peyton     parent_frame->reenter_runtime_frame = NULL;
10307cc577a4SJonathan Peyton   }
10317cc577a4SJonathan Peyton #endif
10327cc577a4SJonathan Peyton 
10337cc577a4SJonathan Peyton   KMP_DISPATCH_INIT(&loc, gtid, kmp_nm_dynamic_chunked, 1, count, 1, 1, TRUE);
10347cc577a4SJonathan Peyton 
10357cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_parallel_sections_start exit: T#%d\n", gtid));
10367cc577a4SJonathan Peyton }
10377cc577a4SJonathan Peyton 
1038*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_SECTIONS_END)(void) {
10397cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
10407cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_sections_end: T#%d\n", gtid))
10417cc577a4SJonathan Peyton 
10427cc577a4SJonathan Peyton   __kmp_barrier(bs_plain_barrier, gtid, FALSE, 0, NULL, NULL);
10437cc577a4SJonathan Peyton 
10447cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_sections_end exit: T#%d\n", gtid))
10457cc577a4SJonathan Peyton }
10467cc577a4SJonathan Peyton 
1047*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT)(void) {
10487cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_sections_end_nowait: T#%d\n", __kmp_get_gtid()))
10497cc577a4SJonathan Peyton }
10507cc577a4SJonathan Peyton 
10517cc577a4SJonathan Peyton // libgomp has an empty function for GOMP_taskyield as of 2013-10-10
1052*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TASKYIELD)(void) {
10537cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_taskyield: T#%d\n", __kmp_get_gtid()))
10547cc577a4SJonathan Peyton   return;
10557cc577a4SJonathan Peyton }
10567cc577a4SJonathan Peyton 
10577cc577a4SJonathan Peyton #if OMP_40_ENABLED // these are new GOMP_4.0 entry points
10587cc577a4SJonathan Peyton 
1059*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_PARALLEL)(void (*task)(void *), void *data,
1060*3041982dSJonathan Peyton                                          unsigned num_threads,
1061*3041982dSJonathan Peyton                                          unsigned int flags) {
10627cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
10637cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_parallel");
10647cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_parallel: T#%d\n", gtid));
10657cc577a4SJonathan Peyton 
10667cc577a4SJonathan Peyton #if OMPT_SUPPORT
10677cc577a4SJonathan Peyton   ompt_task_info_t *parent_task_info, *task_info;
10687cc577a4SJonathan Peyton   if (ompt_enabled) {
10697cc577a4SJonathan Peyton     parent_task_info = __ompt_get_taskinfo(0);
10707cc577a4SJonathan Peyton     parent_task_info->frame.reenter_runtime_frame = __builtin_frame_address(1);
10717cc577a4SJonathan Peyton   }
10727cc577a4SJonathan Peyton #endif
10737cc577a4SJonathan Peyton   if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) {
10747cc577a4SJonathan Peyton     if (num_threads != 0) {
10757cc577a4SJonathan Peyton       __kmp_push_num_threads(&loc, gtid, num_threads);
10767cc577a4SJonathan Peyton     }
10777cc577a4SJonathan Peyton     if (flags != 0) {
10787cc577a4SJonathan Peyton       __kmp_push_proc_bind(&loc, gtid, (kmp_proc_bind_t)flags);
10797cc577a4SJonathan Peyton     }
10807cc577a4SJonathan Peyton     __kmp_GOMP_fork_call(&loc, gtid, task,
1081*3041982dSJonathan Peyton                          (microtask_t)__kmp_GOMP_microtask_wrapper, 2, task,
1082*3041982dSJonathan Peyton                          data);
1083*3041982dSJonathan Peyton   } else {
10847cc577a4SJonathan Peyton     __kmp_GOMP_serialized_parallel(&loc, gtid, task);
10857cc577a4SJonathan Peyton   }
10867cc577a4SJonathan Peyton #if OMPT_SUPPORT
10877cc577a4SJonathan Peyton   if (ompt_enabled) {
10887cc577a4SJonathan Peyton     task_info = __ompt_get_taskinfo(0);
10897cc577a4SJonathan Peyton     task_info->frame.exit_runtime_frame = __builtin_frame_address(0);
10907cc577a4SJonathan Peyton   }
10917cc577a4SJonathan Peyton #endif
10927cc577a4SJonathan Peyton   task(data);
10937cc577a4SJonathan Peyton   xexpand(KMP_API_NAME_GOMP_PARALLEL_END)();
10947cc577a4SJonathan Peyton #if OMPT_SUPPORT
10957cc577a4SJonathan Peyton   if (ompt_enabled) {
10967cc577a4SJonathan Peyton     task_info->frame.exit_runtime_frame = NULL;
10977cc577a4SJonathan Peyton     parent_task_info->frame.reenter_runtime_frame = NULL;
10987cc577a4SJonathan Peyton   }
10997cc577a4SJonathan Peyton #endif
11007cc577a4SJonathan Peyton }
11017cc577a4SJonathan Peyton 
1102*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_PARALLEL_SECTIONS)(void (*task)(void *),
1103*3041982dSJonathan Peyton                                                   void *data,
1104*3041982dSJonathan Peyton                                                   unsigned num_threads,
1105*3041982dSJonathan Peyton                                                   unsigned count,
1106*3041982dSJonathan Peyton                                                   unsigned flags) {
11077cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
11087cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_parallel_sections");
11097cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_parallel_sections: T#%d\n", gtid));
11107cc577a4SJonathan Peyton 
11117cc577a4SJonathan Peyton   if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) {
11127cc577a4SJonathan Peyton     if (num_threads != 0) {
11137cc577a4SJonathan Peyton       __kmp_push_num_threads(&loc, gtid, num_threads);
11147cc577a4SJonathan Peyton     }
11157cc577a4SJonathan Peyton     if (flags != 0) {
11167cc577a4SJonathan Peyton       __kmp_push_proc_bind(&loc, gtid, (kmp_proc_bind_t)flags);
11177cc577a4SJonathan Peyton     }
11187cc577a4SJonathan Peyton     __kmp_GOMP_fork_call(&loc, gtid, task,
1119*3041982dSJonathan Peyton                          (microtask_t)__kmp_GOMP_parallel_microtask_wrapper, 9,
1120*3041982dSJonathan Peyton                          task, data, num_threads, &loc, kmp_nm_dynamic_chunked,
1121*3041982dSJonathan Peyton                          (kmp_int)1, (kmp_int)count, (kmp_int)1, (kmp_int)1);
1122*3041982dSJonathan Peyton   } else {
11237cc577a4SJonathan Peyton     __kmp_GOMP_serialized_parallel(&loc, gtid, task);
11247cc577a4SJonathan Peyton   }
11257cc577a4SJonathan Peyton 
11267cc577a4SJonathan Peyton   KMP_DISPATCH_INIT(&loc, gtid, kmp_nm_dynamic_chunked, 1, count, 1, 1, TRUE);
11277cc577a4SJonathan Peyton 
11287cc577a4SJonathan Peyton   task(data);
11297cc577a4SJonathan Peyton   xexpand(KMP_API_NAME_GOMP_PARALLEL_END)();
11307cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_parallel_sections exit: T#%d\n", gtid));
11317cc577a4SJonathan Peyton }
11327cc577a4SJonathan Peyton 
11337cc577a4SJonathan Peyton #define PARALLEL_LOOP(func, schedule, ompt_pre, ompt_post)                     \
1134*3041982dSJonathan Peyton   void func(void (*task)(void *), void *data, unsigned num_threads, long lb,   \
1135*3041982dSJonathan Peyton             long ub, long str, long chunk_sz, unsigned flags) {                \
11367cc577a4SJonathan Peyton     int gtid = __kmp_entry_gtid();                                             \
11377cc577a4SJonathan Peyton     MKLOC(loc, #func);                                                         \
1138*3041982dSJonathan Peyton     KA_TRACE(20,                                                               \
1139*3041982dSJonathan Peyton              (#func ": T#%d, lb 0x%lx, ub 0x%lx, str 0x%lx, chunk_sz 0x%lx\n", \
11407cc577a4SJonathan Peyton               gtid, lb, ub, str, chunk_sz));                                   \
11417cc577a4SJonathan Peyton                                                                                \
11427cc577a4SJonathan Peyton     ompt_pre();                                                                \
11437cc577a4SJonathan Peyton     if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) {                       \
11447cc577a4SJonathan Peyton       if (num_threads != 0) {                                                  \
11457cc577a4SJonathan Peyton         __kmp_push_num_threads(&loc, gtid, num_threads);                       \
11467cc577a4SJonathan Peyton       }                                                                        \
11477cc577a4SJonathan Peyton       if (flags != 0) {                                                        \
11487cc577a4SJonathan Peyton         __kmp_push_proc_bind(&loc, gtid, (kmp_proc_bind_t)flags);              \
11497cc577a4SJonathan Peyton       }                                                                        \
11507cc577a4SJonathan Peyton       __kmp_GOMP_fork_call(&loc, gtid, task,                                   \
1151*3041982dSJonathan Peyton                            (microtask_t)__kmp_GOMP_parallel_microtask_wrapper, \
1152*3041982dSJonathan Peyton                            9, task, data, num_threads, &loc, (schedule), lb,   \
11537cc577a4SJonathan Peyton                            (str > 0) ? (ub - 1) : (ub + 1), str, chunk_sz);    \
1154*3041982dSJonathan Peyton     } else {                                                                   \
11557cc577a4SJonathan Peyton       __kmp_GOMP_serialized_parallel(&loc, gtid, task);                        \
11567cc577a4SJonathan Peyton     }                                                                          \
11577cc577a4SJonathan Peyton                                                                                \
11587cc577a4SJonathan Peyton     KMP_DISPATCH_INIT(&loc, gtid, (schedule), lb,                              \
11597cc577a4SJonathan Peyton                       (str > 0) ? (ub - 1) : (ub + 1), str, chunk_sz,          \
11607cc577a4SJonathan Peyton                       (schedule) != kmp_sch_static);                           \
11617cc577a4SJonathan Peyton     task(data);                                                                \
11627cc577a4SJonathan Peyton     xexpand(KMP_API_NAME_GOMP_PARALLEL_END)();                                 \
11637cc577a4SJonathan Peyton     ompt_post();                                                               \
11647cc577a4SJonathan Peyton                                                                                \
11657cc577a4SJonathan Peyton     KA_TRACE(20, (#func " exit: T#%d\n", gtid));                               \
11667cc577a4SJonathan Peyton   }
11677cc577a4SJonathan Peyton 
11687cc577a4SJonathan Peyton PARALLEL_LOOP(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC), kmp_sch_static,
11697cc577a4SJonathan Peyton               OMPT_LOOP_PRE, OMPT_LOOP_POST)
1170*3041982dSJonathan Peyton PARALLEL_LOOP(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC),
1171*3041982dSJonathan Peyton               kmp_sch_dynamic_chunked, OMPT_LOOP_PRE, OMPT_LOOP_POST)
1172*3041982dSJonathan Peyton PARALLEL_LOOP(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED),
1173*3041982dSJonathan Peyton               kmp_sch_guided_chunked, OMPT_LOOP_PRE, OMPT_LOOP_POST)
11747cc577a4SJonathan Peyton PARALLEL_LOOP(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME), kmp_sch_runtime,
11757cc577a4SJonathan Peyton               OMPT_LOOP_PRE, OMPT_LOOP_POST)
11767cc577a4SJonathan Peyton 
1177*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TASKGROUP_START)(void) {
11787cc577a4SJonathan Peyton   int gtid = __kmp_entry_gtid();
11797cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_taskgroup_start");
11807cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_taskgroup_start: T#%d\n", gtid));
11817cc577a4SJonathan Peyton 
11827cc577a4SJonathan Peyton   __kmpc_taskgroup(&loc, gtid);
11837cc577a4SJonathan Peyton 
11847cc577a4SJonathan Peyton   return;
11857cc577a4SJonathan Peyton }
11867cc577a4SJonathan Peyton 
1187*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TASKGROUP_END)(void) {
11887cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
11897cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_taskgroup_end");
11907cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_taskgroup_end: T#%d\n", gtid));
11917cc577a4SJonathan Peyton 
11927cc577a4SJonathan Peyton   __kmpc_end_taskgroup(&loc, gtid);
11937cc577a4SJonathan Peyton 
11947cc577a4SJonathan Peyton   return;
11957cc577a4SJonathan Peyton }
11967cc577a4SJonathan Peyton 
11977cc577a4SJonathan Peyton #ifndef KMP_DEBUG
11987cc577a4SJonathan Peyton static
11997cc577a4SJonathan Peyton #endif /* KMP_DEBUG */
1200*3041982dSJonathan Peyton     kmp_int32
1201*3041982dSJonathan Peyton     __kmp_gomp_to_omp_cancellation_kind(int gomp_kind) {
12027cc577a4SJonathan Peyton   kmp_int32 cncl_kind = 0;
12037cc577a4SJonathan Peyton   switch (gomp_kind) {
12047cc577a4SJonathan Peyton   case 1:
12057cc577a4SJonathan Peyton     cncl_kind = cancel_parallel;
12067cc577a4SJonathan Peyton     break;
12077cc577a4SJonathan Peyton   case 2:
12087cc577a4SJonathan Peyton     cncl_kind = cancel_loop;
12097cc577a4SJonathan Peyton     break;
12107cc577a4SJonathan Peyton   case 4:
12117cc577a4SJonathan Peyton     cncl_kind = cancel_sections;
12127cc577a4SJonathan Peyton     break;
12137cc577a4SJonathan Peyton   case 8:
12147cc577a4SJonathan Peyton     cncl_kind = cancel_taskgroup;
12157cc577a4SJonathan Peyton     break;
12167cc577a4SJonathan Peyton   }
12177cc577a4SJonathan Peyton   return cncl_kind;
12187cc577a4SJonathan Peyton }
12197cc577a4SJonathan Peyton 
1220*3041982dSJonathan Peyton bool xexpand(KMP_API_NAME_GOMP_CANCELLATION_POINT)(int which) {
12217cc577a4SJonathan Peyton   if (__kmp_omp_cancellation) {
12227cc577a4SJonathan Peyton     KMP_FATAL(NoGompCancellation);
12237cc577a4SJonathan Peyton   }
12247cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
12257cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_cancellation_point");
12267cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_cancellation_point: T#%d\n", gtid));
12277cc577a4SJonathan Peyton 
12287cc577a4SJonathan Peyton   kmp_int32 cncl_kind = __kmp_gomp_to_omp_cancellation_kind(which);
12297cc577a4SJonathan Peyton 
12307cc577a4SJonathan Peyton   return __kmpc_cancellationpoint(&loc, gtid, cncl_kind);
12317cc577a4SJonathan Peyton }
12327cc577a4SJonathan Peyton 
1233*3041982dSJonathan Peyton bool xexpand(KMP_API_NAME_GOMP_BARRIER_CANCEL)(void) {
12347cc577a4SJonathan Peyton   if (__kmp_omp_cancellation) {
12357cc577a4SJonathan Peyton     KMP_FATAL(NoGompCancellation);
12367cc577a4SJonathan Peyton   }
12377cc577a4SJonathan Peyton   KMP_FATAL(NoGompCancellation);
12387cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
12397cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_barrier_cancel");
12407cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_barrier_cancel: T#%d\n", gtid));
12417cc577a4SJonathan Peyton 
12427cc577a4SJonathan Peyton   return __kmpc_cancel_barrier(&loc, gtid);
12437cc577a4SJonathan Peyton }
12447cc577a4SJonathan Peyton 
1245*3041982dSJonathan Peyton bool xexpand(KMP_API_NAME_GOMP_CANCEL)(int which, bool do_cancel) {
12467cc577a4SJonathan Peyton   if (__kmp_omp_cancellation) {
12477cc577a4SJonathan Peyton     KMP_FATAL(NoGompCancellation);
12487cc577a4SJonathan Peyton   } else {
12497cc577a4SJonathan Peyton     return FALSE;
12507cc577a4SJonathan Peyton   }
12517cc577a4SJonathan Peyton 
12527cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
12537cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_cancel");
12547cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_cancel: T#%d\n", gtid));
12557cc577a4SJonathan Peyton 
12567cc577a4SJonathan Peyton   kmp_int32 cncl_kind = __kmp_gomp_to_omp_cancellation_kind(which);
12577cc577a4SJonathan Peyton 
12587cc577a4SJonathan Peyton   if (do_cancel == FALSE) {
12597cc577a4SJonathan Peyton     return xexpand(KMP_API_NAME_GOMP_CANCELLATION_POINT)(which);
12607cc577a4SJonathan Peyton   } else {
12617cc577a4SJonathan Peyton     return __kmpc_cancel(&loc, gtid, cncl_kind);
12627cc577a4SJonathan Peyton   }
12637cc577a4SJonathan Peyton }
12647cc577a4SJonathan Peyton 
1265*3041982dSJonathan Peyton bool xexpand(KMP_API_NAME_GOMP_SECTIONS_END_CANCEL)(void) {
12667cc577a4SJonathan Peyton   if (__kmp_omp_cancellation) {
12677cc577a4SJonathan Peyton     KMP_FATAL(NoGompCancellation);
12687cc577a4SJonathan Peyton   }
12697cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
12707cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_sections_end_cancel");
12717cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_sections_end_cancel: T#%d\n", gtid));
12727cc577a4SJonathan Peyton 
12737cc577a4SJonathan Peyton   return __kmpc_cancel_barrier(&loc, gtid);
12747cc577a4SJonathan Peyton }
12757cc577a4SJonathan Peyton 
1276*3041982dSJonathan Peyton bool xexpand(KMP_API_NAME_GOMP_LOOP_END_CANCEL)(void) {
12777cc577a4SJonathan Peyton   if (__kmp_omp_cancellation) {
12787cc577a4SJonathan Peyton     KMP_FATAL(NoGompCancellation);
12797cc577a4SJonathan Peyton   }
12807cc577a4SJonathan Peyton   int gtid = __kmp_get_gtid();
12817cc577a4SJonathan Peyton   MKLOC(loc, "GOMP_loop_end_cancel");
12827cc577a4SJonathan Peyton   KA_TRACE(20, ("GOMP_loop_end_cancel: T#%d\n", gtid));
12837cc577a4SJonathan Peyton 
12847cc577a4SJonathan Peyton   return __kmpc_cancel_barrier(&loc, gtid);
12857cc577a4SJonathan Peyton }
12867cc577a4SJonathan Peyton 
12877cc577a4SJonathan Peyton // All target functions are empty as of 2014-05-29
1288*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TARGET)(int device, void (*fn)(void *),
1289*3041982dSJonathan Peyton                                        const void *openmp_target, size_t mapnum,
1290*3041982dSJonathan Peyton                                        void **hostaddrs, size_t *sizes,
1291*3041982dSJonathan Peyton                                        unsigned char *kinds) {
12927cc577a4SJonathan Peyton   return;
12937cc577a4SJonathan Peyton }
12947cc577a4SJonathan Peyton 
1295*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TARGET_DATA)(int device,
1296*3041982dSJonathan Peyton                                             const void *openmp_target,
1297*3041982dSJonathan Peyton                                             size_t mapnum, void **hostaddrs,
1298*3041982dSJonathan Peyton                                             size_t *sizes,
1299*3041982dSJonathan Peyton                                             unsigned char *kinds) {
13007cc577a4SJonathan Peyton   return;
13017cc577a4SJonathan Peyton }
13027cc577a4SJonathan Peyton 
1303*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TARGET_END_DATA)(void) { return; }
1304*3041982dSJonathan Peyton 
1305*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TARGET_UPDATE)(int device,
1306*3041982dSJonathan Peyton                                               const void *openmp_target,
1307*3041982dSJonathan Peyton                                               size_t mapnum, void **hostaddrs,
1308*3041982dSJonathan Peyton                                               size_t *sizes,
1309*3041982dSJonathan Peyton                                               unsigned char *kinds) {
13107cc577a4SJonathan Peyton   return;
13117cc577a4SJonathan Peyton }
13127cc577a4SJonathan Peyton 
1313*3041982dSJonathan Peyton void xexpand(KMP_API_NAME_GOMP_TEAMS)(unsigned int num_teams,
1314*3041982dSJonathan Peyton                                       unsigned int thread_limit) {
13157cc577a4SJonathan Peyton   return;
13167cc577a4SJonathan Peyton }
13177cc577a4SJonathan Peyton #endif // OMP_40_ENABLED
13187cc577a4SJonathan Peyton 
1319*3041982dSJonathan Peyton /* The following sections of code create aliases for the GOMP_* functions, then
1320*3041982dSJonathan Peyton    create versioned symbols using the assembler directive .symver. This is only
1321*3041982dSJonathan Peyton    pertinent for ELF .so library xaliasify and xversionify are defined in
1322*3041982dSJonathan Peyton    kmp_ftn_os.h  */
13237cc577a4SJonathan Peyton 
13247cc577a4SJonathan Peyton #ifdef KMP_USE_VERSION_SYMBOLS
13257cc577a4SJonathan Peyton 
13267cc577a4SJonathan Peyton // GOMP_1.0 aliases
13277cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_ATOMIC_END, 10);
13287cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_ATOMIC_START, 10);
13297cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_BARRIER, 10);
13307cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_CRITICAL_END, 10);
13317cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_CRITICAL_NAME_END, 10);
13327cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_CRITICAL_NAME_START, 10);
13337cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_CRITICAL_START, 10);
13347cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT, 10);
13357cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START, 10);
13367cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_END, 10);
13377cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_END_NOWAIT, 10);
13387cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT, 10);
13397cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_GUIDED_START, 10);
13407cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT, 10);
13417cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START, 10);
13427cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT, 10);
13437cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START, 10);
13447cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT, 10);
13457cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START, 10);
13467cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT, 10);
13477cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START, 10);
13487cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT, 10);
13497cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_RUNTIME_START, 10);
13507cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT, 10);
13517cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_STATIC_START, 10);
13527cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_ORDERED_END, 10);
13537cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_ORDERED_START, 10);
13547cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_END, 10);
13557cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START, 10);
13567cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START, 10);
13577cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START, 10);
13587cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START, 10);
13597cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START, 10);
13607cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_START, 10);
13617cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_SECTIONS_END, 10);
13627cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT, 10);
13637cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_SECTIONS_NEXT, 10);
13647cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_SECTIONS_START, 10);
13657cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_SINGLE_COPY_END, 10);
13667cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_SINGLE_COPY_START, 10);
13677cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_SINGLE_START, 10);
13687cc577a4SJonathan Peyton 
13697cc577a4SJonathan Peyton // GOMP_2.0 aliases
13707cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TASK, 20);
13717cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TASKWAIT, 20);
13727cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT, 20);
13737cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START, 20);
13747cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT, 20);
13757cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START, 20);
13767cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT, 20);
13777cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START, 20);
13787cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT, 20);
13797cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START, 20);
13807cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT, 20);
13817cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START, 20);
13827cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT, 20);
13837cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START, 20);
13847cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT, 20);
13857cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START, 20);
13867cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT, 20);
13877cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START, 20);
13887cc577a4SJonathan Peyton 
13897cc577a4SJonathan Peyton // GOMP_3.0 aliases
13907cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TASKYIELD, 30);
13917cc577a4SJonathan Peyton 
13927cc577a4SJonathan Peyton // GOMP_4.0 aliases
13937cc577a4SJonathan Peyton // The GOMP_parallel* entry points below aren't OpenMP 4.0 related.
13947cc577a4SJonathan Peyton #if OMP_40_ENABLED
13957cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL, 40);
13967cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS, 40);
13977cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC, 40);
13987cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED, 40);
13997cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME, 40);
14007cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC, 40);
14017cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TASKGROUP_START, 40);
14027cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TASKGROUP_END, 40);
14037cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_BARRIER_CANCEL, 40);
14047cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_CANCEL, 40);
14057cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_CANCELLATION_POINT, 40);
14067cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_LOOP_END_CANCEL, 40);
14077cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_SECTIONS_END_CANCEL, 40);
14087cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TARGET, 40);
14097cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TARGET_DATA, 40);
14107cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TARGET_END_DATA, 40);
14117cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TARGET_UPDATE, 40);
14127cc577a4SJonathan Peyton xaliasify(KMP_API_NAME_GOMP_TEAMS, 40);
14137cc577a4SJonathan Peyton #endif
14147cc577a4SJonathan Peyton 
14157cc577a4SJonathan Peyton // GOMP_1.0 versioned symbols
14167cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_ATOMIC_END, 10, "GOMP_1.0");
14177cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_ATOMIC_START, 10, "GOMP_1.0");
14187cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_BARRIER, 10, "GOMP_1.0");
14197cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_CRITICAL_END, 10, "GOMP_1.0");
14207cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_CRITICAL_NAME_END, 10, "GOMP_1.0");
14217cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_CRITICAL_NAME_START, 10, "GOMP_1.0");
14227cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_CRITICAL_START, 10, "GOMP_1.0");
14237cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT, 10, "GOMP_1.0");
14247cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START, 10, "GOMP_1.0");
14257cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_END, 10, "GOMP_1.0");
14267cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_END_NOWAIT, 10, "GOMP_1.0");
14277cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT, 10, "GOMP_1.0");
14287cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_GUIDED_START, 10, "GOMP_1.0");
14297cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT, 10, "GOMP_1.0");
14307cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START, 10, "GOMP_1.0");
14317cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT, 10, "GOMP_1.0");
14327cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START, 10, "GOMP_1.0");
14337cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT, 10, "GOMP_1.0");
14347cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START, 10, "GOMP_1.0");
14357cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT, 10, "GOMP_1.0");
14367cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START, 10, "GOMP_1.0");
14377cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT, 10, "GOMP_1.0");
14387cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_RUNTIME_START, 10, "GOMP_1.0");
14397cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT, 10, "GOMP_1.0");
14407cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_STATIC_START, 10, "GOMP_1.0");
14417cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_ORDERED_END, 10, "GOMP_1.0");
14427cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_ORDERED_START, 10, "GOMP_1.0");
14437cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_END, 10, "GOMP_1.0");
14447cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START, 10, "GOMP_1.0");
14457cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START, 10, "GOMP_1.0");
14467cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START, 10, "GOMP_1.0");
14477cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START, 10, "GOMP_1.0");
14487cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START, 10, "GOMP_1.0");
14497cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_START, 10, "GOMP_1.0");
14507cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_SECTIONS_END, 10, "GOMP_1.0");
14517cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT, 10, "GOMP_1.0");
14527cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_SECTIONS_NEXT, 10, "GOMP_1.0");
14537cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_SECTIONS_START, 10, "GOMP_1.0");
14547cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_SINGLE_COPY_END, 10, "GOMP_1.0");
14557cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_SINGLE_COPY_START, 10, "GOMP_1.0");
14567cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_SINGLE_START, 10, "GOMP_1.0");
14577cc577a4SJonathan Peyton 
14587cc577a4SJonathan Peyton // GOMP_2.0 versioned symbols
14597cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TASK, 20, "GOMP_2.0");
14607cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TASKWAIT, 20, "GOMP_2.0");
14617cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT, 20, "GOMP_2.0");
14627cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START, 20, "GOMP_2.0");
14637cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT, 20, "GOMP_2.0");
14647cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START, 20, "GOMP_2.0");
14657cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT, 20, "GOMP_2.0");
14667cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START, 20, "GOMP_2.0");
14677cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT, 20, "GOMP_2.0");
14687cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START, 20, "GOMP_2.0");
14697cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT, 20, "GOMP_2.0");
14707cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START, 20, "GOMP_2.0");
14717cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT, 20, "GOMP_2.0");
14727cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START, 20, "GOMP_2.0");
14737cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT, 20, "GOMP_2.0");
14747cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START, 20, "GOMP_2.0");
14757cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT, 20, "GOMP_2.0");
14767cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START, 20, "GOMP_2.0");
14777cc577a4SJonathan Peyton 
14787cc577a4SJonathan Peyton // GOMP_3.0 versioned symbols
14797cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TASKYIELD, 30, "GOMP_3.0");
14807cc577a4SJonathan Peyton 
14817cc577a4SJonathan Peyton // GOMP_4.0 versioned symbols
14827cc577a4SJonathan Peyton #if OMP_40_ENABLED
14837cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL, 40, "GOMP_4.0");
14847cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS, 40, "GOMP_4.0");
14857cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC, 40, "GOMP_4.0");
14867cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED, 40, "GOMP_4.0");
14877cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME, 40, "GOMP_4.0");
14887cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC, 40, "GOMP_4.0");
14897cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TASKGROUP_START, 40, "GOMP_4.0");
14907cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TASKGROUP_END, 40, "GOMP_4.0");
14917cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_BARRIER_CANCEL, 40, "GOMP_4.0");
14927cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_CANCEL, 40, "GOMP_4.0");
14937cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_CANCELLATION_POINT, 40, "GOMP_4.0");
14947cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_LOOP_END_CANCEL, 40, "GOMP_4.0");
14957cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_SECTIONS_END_CANCEL, 40, "GOMP_4.0");
14967cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TARGET, 40, "GOMP_4.0");
14977cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TARGET_DATA, 40, "GOMP_4.0");
14987cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TARGET_END_DATA, 40, "GOMP_4.0");
14997cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TARGET_UPDATE, 40, "GOMP_4.0");
15007cc577a4SJonathan Peyton xversionify(KMP_API_NAME_GOMP_TEAMS, 40, "GOMP_4.0");
15017cc577a4SJonathan Peyton #endif
15027cc577a4SJonathan Peyton 
15037cc577a4SJonathan Peyton #endif // KMP_USE_VERSION_SYMBOLS
15047cc577a4SJonathan Peyton 
15057cc577a4SJonathan Peyton #ifdef __cplusplus
15067cc577a4SJonathan Peyton } // extern "C"
15077cc577a4SJonathan Peyton #endif // __cplusplus
1508