13865c69bSJoachim Protze /*
23865c69bSJoachim Protze  * ompt-specific.cpp -- OMPT internal functions
33865c69bSJoachim Protze  */
43865c69bSJoachim Protze 
53865c69bSJoachim Protze //===----------------------------------------------------------------------===//
63865c69bSJoachim Protze //
757b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
857b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
957b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
103865c69bSJoachim Protze //
113865c69bSJoachim Protze //===----------------------------------------------------------------------===//
123865c69bSJoachim Protze 
137cc577a4SJonathan Peyton //******************************************************************************
147cc577a4SJonathan Peyton // include files
157cc577a4SJonathan Peyton //******************************************************************************
167cc577a4SJonathan Peyton 
177cc577a4SJonathan Peyton #include "kmp.h"
187cc577a4SJonathan Peyton #include "ompt-specific.h"
197cc577a4SJonathan Peyton 
2082e94a59SJoachim Protze #if KMP_OS_UNIX
2182e94a59SJoachim Protze #include <dlfcn.h>
2282e94a59SJoachim Protze #endif
2382e94a59SJoachim Protze 
2482e94a59SJoachim Protze #if KMP_OS_WINDOWS
2582e94a59SJoachim Protze #define THREAD_LOCAL __declspec(thread)
2682e94a59SJoachim Protze #else
2782e94a59SJoachim Protze #define THREAD_LOCAL __thread
2882e94a59SJoachim Protze #endif
2982e94a59SJoachim Protze 
3003116a9fSJoachim Protze #define OMPT_WEAK_ATTRIBUTE KMP_WEAK_ATTRIBUTE_INTERNAL
3140039ac9SJonathan Peyton 
327cc577a4SJonathan Peyton //******************************************************************************
337cc577a4SJonathan Peyton // macros
347cc577a4SJonathan Peyton //******************************************************************************
357cc577a4SJonathan Peyton 
3682e94a59SJoachim Protze #define LWT_FROM_TEAM(team) (team)->t.ompt_serialized_team_info
377cc577a4SJonathan Peyton 
387cc577a4SJonathan Peyton #define OMPT_THREAD_ID_BITS 16
397cc577a4SJonathan Peyton 
407cc577a4SJonathan Peyton //******************************************************************************
417cc577a4SJonathan Peyton // private operations
427cc577a4SJonathan Peyton //******************************************************************************
437cc577a4SJonathan Peyton 
447cc577a4SJonathan Peyton //----------------------------------------------------------
457cc577a4SJonathan Peyton // traverse the team and task hierarchy
4682e94a59SJoachim Protze // note: __ompt_get_teaminfo and __ompt_get_task_info_object
477cc577a4SJonathan Peyton //       traverse the hierarchy similarly and need to be
487cc577a4SJonathan Peyton //       kept consistent
497cc577a4SJonathan Peyton //----------------------------------------------------------
507cc577a4SJonathan Peyton 
__ompt_get_teaminfo(int depth,int * size)513041982dSJonathan Peyton ompt_team_info_t *__ompt_get_teaminfo(int depth, int *size) {
527cc577a4SJonathan Peyton   kmp_info_t *thr = ompt_get_thread();
537cc577a4SJonathan Peyton 
547cc577a4SJonathan Peyton   if (thr) {
557cc577a4SJonathan Peyton     kmp_team *team = thr->th.th_team;
563041982dSJonathan Peyton     if (team == NULL)
573041982dSJonathan Peyton       return NULL;
587cc577a4SJonathan Peyton 
5982e94a59SJoachim Protze     ompt_lw_taskteam_t *next_lwt = LWT_FROM_TEAM(team), *lwt = NULL;
607cc577a4SJonathan Peyton 
617cc577a4SJonathan Peyton     while (depth > 0) {
627cc577a4SJonathan Peyton       // next lightweight team (if any)
633041982dSJonathan Peyton       if (lwt)
643041982dSJonathan Peyton         lwt = lwt->parent;
657cc577a4SJonathan Peyton 
667cc577a4SJonathan Peyton       // next heavyweight team (if any) after
677cc577a4SJonathan Peyton       // lightweight teams are exhausted
687cc577a4SJonathan Peyton       if (!lwt && team) {
6982e94a59SJoachim Protze         if (next_lwt) {
7082e94a59SJoachim Protze           lwt = next_lwt;
7182e94a59SJoachim Protze           next_lwt = NULL;
7282e94a59SJoachim Protze         } else {
737cc577a4SJonathan Peyton           team = team->t.t_parent;
747cc577a4SJonathan Peyton           if (team) {
7582e94a59SJoachim Protze             next_lwt = LWT_FROM_TEAM(team);
7682e94a59SJoachim Protze           }
777cc577a4SJonathan Peyton         }
787cc577a4SJonathan Peyton       }
797cc577a4SJonathan Peyton 
807cc577a4SJonathan Peyton       depth--;
817cc577a4SJonathan Peyton     }
827cc577a4SJonathan Peyton 
837cc577a4SJonathan Peyton     if (lwt) {
847cc577a4SJonathan Peyton       // lightweight teams have one task
853041982dSJonathan Peyton       if (size)
863041982dSJonathan Peyton         *size = 1;
877cc577a4SJonathan Peyton 
887cc577a4SJonathan Peyton       // return team info for lightweight team
897cc577a4SJonathan Peyton       return &lwt->ompt_team_info;
907cc577a4SJonathan Peyton     } else if (team) {
917cc577a4SJonathan Peyton       // extract size from heavyweight team
923041982dSJonathan Peyton       if (size)
933041982dSJonathan Peyton         *size = team->t.t_nproc;
947cc577a4SJonathan Peyton 
957cc577a4SJonathan Peyton       // return team info for heavyweight team
967cc577a4SJonathan Peyton       return &team->t.ompt_team_info;
977cc577a4SJonathan Peyton     }
987cc577a4SJonathan Peyton   }
997cc577a4SJonathan Peyton 
1007cc577a4SJonathan Peyton   return NULL;
1017cc577a4SJonathan Peyton }
1027cc577a4SJonathan Peyton 
__ompt_get_task_info_object(int depth)10382e94a59SJoachim Protze ompt_task_info_t *__ompt_get_task_info_object(int depth) {
1047cc577a4SJonathan Peyton   ompt_task_info_t *info = NULL;
1057cc577a4SJonathan Peyton   kmp_info_t *thr = ompt_get_thread();
1067cc577a4SJonathan Peyton 
1077cc577a4SJonathan Peyton   if (thr) {
1087cc577a4SJonathan Peyton     kmp_taskdata_t *taskdata = thr->th.th_current_task;
10982e94a59SJoachim Protze     ompt_lw_taskteam_t *lwt = NULL,
11082e94a59SJoachim Protze                        *next_lwt = LWT_FROM_TEAM(taskdata->td_team);
1117cc577a4SJonathan Peyton 
1127cc577a4SJonathan Peyton     while (depth > 0) {
1137cc577a4SJonathan Peyton       // next lightweight team (if any)
1143041982dSJonathan Peyton       if (lwt)
1153041982dSJonathan Peyton         lwt = lwt->parent;
1167cc577a4SJonathan Peyton 
1177cc577a4SJonathan Peyton       // next heavyweight team (if any) after
1187cc577a4SJonathan Peyton       // lightweight teams are exhausted
1197cc577a4SJonathan Peyton       if (!lwt && taskdata) {
12082e94a59SJoachim Protze         if (next_lwt) {
12182e94a59SJoachim Protze           lwt = next_lwt;
12282e94a59SJoachim Protze           next_lwt = NULL;
12382e94a59SJoachim Protze         } else {
1247cc577a4SJonathan Peyton           taskdata = taskdata->td_parent;
1257cc577a4SJonathan Peyton           if (taskdata) {
12682e94a59SJoachim Protze             next_lwt = LWT_FROM_TEAM(taskdata->td_team);
12782e94a59SJoachim Protze           }
12882e94a59SJoachim Protze         }
12982e94a59SJoachim Protze       }
13082e94a59SJoachim Protze       depth--;
13182e94a59SJoachim Protze     }
13282e94a59SJoachim Protze 
13382e94a59SJoachim Protze     if (lwt) {
13482e94a59SJoachim Protze       info = &lwt->ompt_task_info;
13582e94a59SJoachim Protze     } else if (taskdata) {
13682e94a59SJoachim Protze       info = &taskdata->ompt_task_info;
13782e94a59SJoachim Protze     }
13882e94a59SJoachim Protze   }
13982e94a59SJoachim Protze 
14082e94a59SJoachim Protze   return info;
14182e94a59SJoachim Protze }
14282e94a59SJoachim Protze 
__ompt_get_scheduling_taskinfo(int depth)14382e94a59SJoachim Protze ompt_task_info_t *__ompt_get_scheduling_taskinfo(int depth) {
14482e94a59SJoachim Protze   ompt_task_info_t *info = NULL;
14582e94a59SJoachim Protze   kmp_info_t *thr = ompt_get_thread();
14682e94a59SJoachim Protze 
14782e94a59SJoachim Protze   if (thr) {
14882e94a59SJoachim Protze     kmp_taskdata_t *taskdata = thr->th.th_current_task;
14982e94a59SJoachim Protze 
15082e94a59SJoachim Protze     ompt_lw_taskteam_t *lwt = NULL,
15182e94a59SJoachim Protze                        *next_lwt = LWT_FROM_TEAM(taskdata->td_team);
15282e94a59SJoachim Protze 
15382e94a59SJoachim Protze     while (depth > 0) {
15482e94a59SJoachim Protze       // next lightweight team (if any)
15582e94a59SJoachim Protze       if (lwt)
15682e94a59SJoachim Protze         lwt = lwt->parent;
15782e94a59SJoachim Protze 
15882e94a59SJoachim Protze       // next heavyweight team (if any) after
15982e94a59SJoachim Protze       // lightweight teams are exhausted
16082e94a59SJoachim Protze       if (!lwt && taskdata) {
16182e94a59SJoachim Protze         // first try scheduling parent (for explicit task scheduling)
16282e94a59SJoachim Protze         if (taskdata->ompt_task_info.scheduling_parent) {
16382e94a59SJoachim Protze           taskdata = taskdata->ompt_task_info.scheduling_parent;
16482e94a59SJoachim Protze         } else if (next_lwt) {
16582e94a59SJoachim Protze           lwt = next_lwt;
16682e94a59SJoachim Protze           next_lwt = NULL;
16782e94a59SJoachim Protze         } else {
16882e94a59SJoachim Protze           // then go for implicit tasks
16982e94a59SJoachim Protze           taskdata = taskdata->td_parent;
17082e94a59SJoachim Protze           if (taskdata) {
17182e94a59SJoachim Protze             next_lwt = LWT_FROM_TEAM(taskdata->td_team);
17282e94a59SJoachim Protze           }
1737cc577a4SJonathan Peyton         }
1747cc577a4SJonathan Peyton       }
1757cc577a4SJonathan Peyton       depth--;
1767cc577a4SJonathan Peyton     }
1777cc577a4SJonathan Peyton 
1787cc577a4SJonathan Peyton     if (lwt) {
1797cc577a4SJonathan Peyton       info = &lwt->ompt_task_info;
1807cc577a4SJonathan Peyton     } else if (taskdata) {
1817cc577a4SJonathan Peyton       info = &taskdata->ompt_task_info;
1827cc577a4SJonathan Peyton     }
1837cc577a4SJonathan Peyton   }
1847cc577a4SJonathan Peyton 
1857cc577a4SJonathan Peyton   return info;
1867cc577a4SJonathan Peyton }
1877cc577a4SJonathan Peyton 
1887cc577a4SJonathan Peyton //******************************************************************************
1897cc577a4SJonathan Peyton // interface operations
1907cc577a4SJonathan Peyton //******************************************************************************
1917cc577a4SJonathan Peyton 
1927cc577a4SJonathan Peyton //----------------------------------------------------------
1937cc577a4SJonathan Peyton // thread support
1947cc577a4SJonathan Peyton //----------------------------------------------------------
1957cc577a4SJonathan Peyton 
__ompt_get_thread_data_internal()19682e94a59SJoachim Protze ompt_data_t *__ompt_get_thread_data_internal() {
19782e94a59SJoachim Protze   if (__kmp_get_gtid() >= 0) {
19882e94a59SJoachim Protze     kmp_info_t *thread = ompt_get_thread();
19982e94a59SJoachim Protze     if (thread == NULL)
20082e94a59SJoachim Protze       return NULL;
20182e94a59SJoachim Protze     return &(thread->th.ompt_thread_info.thread_data);
2027cc577a4SJonathan Peyton   }
20382e94a59SJoachim Protze   return NULL;
2047cc577a4SJonathan Peyton }
2057cc577a4SJonathan Peyton 
2067cc577a4SJonathan Peyton //----------------------------------------------------------
2077cc577a4SJonathan Peyton // state support
2087cc577a4SJonathan Peyton //----------------------------------------------------------
2097cc577a4SJonathan Peyton 
__ompt_thread_assign_wait_id(void * variable)2103041982dSJonathan Peyton void __ompt_thread_assign_wait_id(void *variable) {
21182e94a59SJoachim Protze   kmp_info_t *ti = ompt_get_thread();
2127cc577a4SJonathan Peyton 
2137c75ac0cSHansang Bae   if (ti)
2144109d560SJoachim Protze     ti->th.ompt_thread_info.wait_id = (ompt_wait_id_t)(uintptr_t)variable;
2157cc577a4SJonathan Peyton }
2167cc577a4SJonathan Peyton 
__ompt_get_state_internal(ompt_wait_id_t * omp_wait_id)2172b46d30fSJoachim Protze int __ompt_get_state_internal(ompt_wait_id_t *omp_wait_id) {
2187cc577a4SJonathan Peyton   kmp_info_t *ti = ompt_get_thread();
2197cc577a4SJonathan Peyton 
2207cc577a4SJonathan Peyton   if (ti) {
22140636133SJoachim Protze     if (omp_wait_id)
22240636133SJoachim Protze       *omp_wait_id = ti->th.ompt_thread_info.wait_id;
2237cc577a4SJonathan Peyton     return ti->th.ompt_thread_info.state;
2247cc577a4SJonathan Peyton   }
2250e0d6cddSJoachim Protze   return ompt_state_undefined;
2267cc577a4SJonathan Peyton }
2277cc577a4SJonathan Peyton 
2287cc577a4SJonathan Peyton //----------------------------------------------------------
2297cc577a4SJonathan Peyton // parallel region support
2307cc577a4SJonathan Peyton //----------------------------------------------------------
2317cc577a4SJonathan Peyton 
__ompt_get_parallel_info_internal(int ancestor_level,ompt_data_t ** parallel_data,int * team_size)23282e94a59SJoachim Protze int __ompt_get_parallel_info_internal(int ancestor_level,
23382e94a59SJoachim Protze                                       ompt_data_t **parallel_data,
23482e94a59SJoachim Protze                                       int *team_size) {
2351dc2afdcSJoachim Protze   if (__kmp_get_gtid() >= 0) {
23682e94a59SJoachim Protze     ompt_team_info_t *info;
23782e94a59SJoachim Protze     if (team_size) {
23882e94a59SJoachim Protze       info = __ompt_get_teaminfo(ancestor_level, team_size);
23982e94a59SJoachim Protze     } else {
24082e94a59SJoachim Protze       info = __ompt_get_teaminfo(ancestor_level, NULL);
2417cc577a4SJonathan Peyton     }
24282e94a59SJoachim Protze     if (parallel_data) {
24382e94a59SJoachim Protze       *parallel_data = info ? &(info->parallel_data) : NULL;
2447cc577a4SJonathan Peyton     }
24582e94a59SJoachim Protze     return info ? 2 : 0;
2461dc2afdcSJoachim Protze   } else {
2471dc2afdcSJoachim Protze     return 0;
2481dc2afdcSJoachim Protze   }
2497cc577a4SJonathan Peyton }
2507cc577a4SJonathan Peyton 
2517cc577a4SJonathan Peyton //----------------------------------------------------------
2527cc577a4SJonathan Peyton // lightweight task team support
2537cc577a4SJonathan Peyton //----------------------------------------------------------
2547cc577a4SJonathan Peyton 
__ompt_lw_taskteam_init(ompt_lw_taskteam_t * lwt,kmp_info_t * thr,int gtid,ompt_data_t * ompt_pid,void * codeptr)2553041982dSJonathan Peyton void __ompt_lw_taskteam_init(ompt_lw_taskteam_t *lwt, kmp_info_t *thr, int gtid,
25682e94a59SJoachim Protze                              ompt_data_t *ompt_pid, void *codeptr) {
25782e94a59SJoachim Protze   // initialize parallel_data with input, return address to parallel_data on
25882e94a59SJoachim Protze   // exit
25982e94a59SJoachim Protze   lwt->ompt_team_info.parallel_data = *ompt_pid;
26082e94a59SJoachim Protze   lwt->ompt_team_info.master_return_address = codeptr;
26182e94a59SJoachim Protze   lwt->ompt_task_info.task_data.value = 0;
2620e0d6cddSJoachim Protze   lwt->ompt_task_info.frame.enter_frame = ompt_data_none;
2630e0d6cddSJoachim Protze   lwt->ompt_task_info.frame.exit_frame = ompt_data_none;
26482e94a59SJoachim Protze   lwt->ompt_task_info.scheduling_parent = NULL;
26582e94a59SJoachim Protze   lwt->heap = 0;
2667cc577a4SJonathan Peyton   lwt->parent = 0;
2677cc577a4SJonathan Peyton }
2687cc577a4SJonathan Peyton 
__ompt_lw_taskteam_link(ompt_lw_taskteam_t * lwt,kmp_info_t * thr,int on_heap,bool always)26982e94a59SJoachim Protze void __ompt_lw_taskteam_link(ompt_lw_taskteam_t *lwt, kmp_info_t *thr,
27067e93a1aSHansang Bae                              int on_heap, bool always) {
27182e94a59SJoachim Protze   ompt_lw_taskteam_t *link_lwt = lwt;
27267e93a1aSHansang Bae   if (always ||
27367e93a1aSHansang Bae       thr->th.th_team->t.t_serialized >
27482e94a59SJoachim Protze           1) { // we already have a team, so link the new team and swap values
27582e94a59SJoachim Protze     if (on_heap) { // the lw_taskteam cannot stay on stack, allocate it on heap
27682e94a59SJoachim Protze       link_lwt =
27782e94a59SJoachim Protze           (ompt_lw_taskteam_t *)__kmp_allocate(sizeof(ompt_lw_taskteam_t));
27882e94a59SJoachim Protze     }
27982e94a59SJoachim Protze     link_lwt->heap = on_heap;
28082e94a59SJoachim Protze 
28182e94a59SJoachim Protze     // would be swap in the (on_stack) case.
28282e94a59SJoachim Protze     ompt_team_info_t tmp_team = lwt->ompt_team_info;
28382e94a59SJoachim Protze     link_lwt->ompt_team_info = *OMPT_CUR_TEAM_INFO(thr);
28482e94a59SJoachim Protze     *OMPT_CUR_TEAM_INFO(thr) = tmp_team;
28582e94a59SJoachim Protze 
28682e94a59SJoachim Protze     // link the taskteam into the list of taskteams:
28782e94a59SJoachim Protze     ompt_lw_taskteam_t *my_parent =
28882e94a59SJoachim Protze         thr->th.th_team->t.ompt_serialized_team_info;
28982e94a59SJoachim Protze     link_lwt->parent = my_parent;
29082e94a59SJoachim Protze     thr->th.th_team->t.ompt_serialized_team_info = link_lwt;
291f61602b0SVignesh Balasubramanian #if OMPD_SUPPORT
292f61602b0SVignesh Balasubramanian     if (ompd_state & OMPD_ENABLE_BP) {
293f61602b0SVignesh Balasubramanian       ompd_bp_parallel_begin();
294f61602b0SVignesh Balasubramanian     }
295f61602b0SVignesh Balasubramanian #endif
296589519b9SVignesh Balasubramanian 
297589519b9SVignesh Balasubramanian     ompt_task_info_t tmp_task = lwt->ompt_task_info;
298589519b9SVignesh Balasubramanian     link_lwt->ompt_task_info = *OMPT_CUR_TASK_INFO(thr);
299589519b9SVignesh Balasubramanian     *OMPT_CUR_TASK_INFO(thr) = tmp_task;
30082e94a59SJoachim Protze   } else {
30182e94a59SJoachim Protze     // this is the first serialized team, so we just store the values in the
30282e94a59SJoachim Protze     // team and drop the taskteam-object
30382e94a59SJoachim Protze     *OMPT_CUR_TEAM_INFO(thr) = lwt->ompt_team_info;
304f61602b0SVignesh Balasubramanian #if OMPD_SUPPORT
305f61602b0SVignesh Balasubramanian     if (ompd_state & OMPD_ENABLE_BP) {
306f61602b0SVignesh Balasubramanian       ompd_bp_parallel_begin();
307f61602b0SVignesh Balasubramanian     }
308f61602b0SVignesh Balasubramanian #endif
30982e94a59SJoachim Protze     *OMPT_CUR_TASK_INFO(thr) = lwt->ompt_task_info;
31082e94a59SJoachim Protze   }
3117cc577a4SJonathan Peyton }
3127cc577a4SJonathan Peyton 
__ompt_lw_taskteam_unlink(kmp_info_t * thr)31382e94a59SJoachim Protze void __ompt_lw_taskteam_unlink(kmp_info_t *thr) {
3147cc577a4SJonathan Peyton   ompt_lw_taskteam_t *lwtask = thr->th.th_team->t.ompt_serialized_team_info;
31582e94a59SJoachim Protze   if (lwtask) {
316589519b9SVignesh Balasubramanian     ompt_task_info_t tmp_task = lwtask->ompt_task_info;
317589519b9SVignesh Balasubramanian     lwtask->ompt_task_info = *OMPT_CUR_TASK_INFO(thr);
318589519b9SVignesh Balasubramanian     *OMPT_CUR_TASK_INFO(thr) = tmp_task;
319f61602b0SVignesh Balasubramanian #if OMPD_SUPPORT
320f61602b0SVignesh Balasubramanian     if (ompd_state & OMPD_ENABLE_BP) {
321f61602b0SVignesh Balasubramanian       ompd_bp_parallel_end();
322f61602b0SVignesh Balasubramanian     }
323f61602b0SVignesh Balasubramanian #endif
3243041982dSJonathan Peyton     thr->th.th_team->t.ompt_serialized_team_info = lwtask->parent;
32582e94a59SJoachim Protze 
32682e94a59SJoachim Protze     ompt_team_info_t tmp_team = lwtask->ompt_team_info;
32782e94a59SJoachim Protze     lwtask->ompt_team_info = *OMPT_CUR_TEAM_INFO(thr);
32882e94a59SJoachim Protze     *OMPT_CUR_TEAM_INFO(thr) = tmp_team;
32982e94a59SJoachim Protze 
33082e94a59SJoachim Protze     if (lwtask->heap) {
33182e94a59SJoachim Protze       __kmp_free(lwtask);
33282e94a59SJoachim Protze       lwtask = NULL;
33382e94a59SJoachim Protze     }
33482e94a59SJoachim Protze   }
33582e94a59SJoachim Protze   //    return lwtask;
3367cc577a4SJonathan Peyton }
3377cc577a4SJonathan Peyton 
3387cc577a4SJonathan Peyton //----------------------------------------------------------
3397cc577a4SJonathan Peyton // task support
3407cc577a4SJonathan Peyton //----------------------------------------------------------
3417cc577a4SJonathan Peyton 
__ompt_get_task_info_internal(int ancestor_level,int * type,ompt_data_t ** task_data,ompt_frame_t ** task_frame,ompt_data_t ** parallel_data,int * thread_num)34282e94a59SJoachim Protze int __ompt_get_task_info_internal(int ancestor_level, int *type,
34382e94a59SJoachim Protze                                   ompt_data_t **task_data,
3440e0d6cddSJoachim Protze                                   ompt_frame_t **task_frame,
34582e94a59SJoachim Protze                                   ompt_data_t **parallel_data,
34682e94a59SJoachim Protze                                   int *thread_num) {
3471dc2afdcSJoachim Protze   if (__kmp_get_gtid() < 0)
3481dc2afdcSJoachim Protze     return 0;
3491dc2afdcSJoachim Protze 
35082e94a59SJoachim Protze   if (ancestor_level < 0)
35182e94a59SJoachim Protze     return 0;
35282e94a59SJoachim Protze 
35382e94a59SJoachim Protze   // copied from __ompt_get_scheduling_taskinfo
35482e94a59SJoachim Protze   ompt_task_info_t *info = NULL;
35582e94a59SJoachim Protze   ompt_team_info_t *team_info = NULL;
35682e94a59SJoachim Protze   kmp_info_t *thr = ompt_get_thread();
3574a73ae16SJoachim Protze   int level = ancestor_level;
35882e94a59SJoachim Protze 
35982e94a59SJoachim Protze   if (thr) {
36082e94a59SJoachim Protze     kmp_taskdata_t *taskdata = thr->th.th_current_task;
36182e94a59SJoachim Protze     if (taskdata == NULL)
36282e94a59SJoachim Protze       return 0;
3634a73ae16SJoachim Protze     kmp_team *team = thr->th.th_team, *prev_team = NULL;
36482e94a59SJoachim Protze     if (team == NULL)
36582e94a59SJoachim Protze       return 0;
36682e94a59SJoachim Protze     ompt_lw_taskteam_t *lwt = NULL,
367*f41d0854SVladimir Inđić                        *next_lwt = LWT_FROM_TEAM(taskdata->td_team);
36882e94a59SJoachim Protze 
36982e94a59SJoachim Protze     while (ancestor_level > 0) {
37082e94a59SJoachim Protze       // next lightweight team (if any)
37182e94a59SJoachim Protze       if (lwt)
37282e94a59SJoachim Protze         lwt = lwt->parent;
37382e94a59SJoachim Protze 
37482e94a59SJoachim Protze       // next heavyweight team (if any) after
37582e94a59SJoachim Protze       // lightweight teams are exhausted
37682e94a59SJoachim Protze       if (!lwt && taskdata) {
37782e94a59SJoachim Protze         // first try scheduling parent (for explicit task scheduling)
37882e94a59SJoachim Protze         if (taskdata->ompt_task_info.scheduling_parent) {
37982e94a59SJoachim Protze           taskdata = taskdata->ompt_task_info.scheduling_parent;
38082e94a59SJoachim Protze         } else if (next_lwt) {
38182e94a59SJoachim Protze           lwt = next_lwt;
38282e94a59SJoachim Protze           next_lwt = NULL;
38382e94a59SJoachim Protze         } else {
38482e94a59SJoachim Protze           // then go for implicit tasks
38582e94a59SJoachim Protze           taskdata = taskdata->td_parent;
38682e94a59SJoachim Protze           if (team == NULL)
38782e94a59SJoachim Protze             return 0;
38859a994e8S@vladaindjic           prev_team = team;
38982e94a59SJoachim Protze           team = team->t.t_parent;
39082e94a59SJoachim Protze           if (taskdata) {
39182e94a59SJoachim Protze             next_lwt = LWT_FROM_TEAM(taskdata->td_team);
39282e94a59SJoachim Protze           }
39382e94a59SJoachim Protze         }
39482e94a59SJoachim Protze       }
39582e94a59SJoachim Protze       ancestor_level--;
3967cc577a4SJonathan Peyton     }
3977cc577a4SJonathan Peyton 
39882e94a59SJoachim Protze     if (lwt) {
39982e94a59SJoachim Protze       info = &lwt->ompt_task_info;
40082e94a59SJoachim Protze       team_info = &lwt->ompt_team_info;
40182e94a59SJoachim Protze       if (type) {
40282e94a59SJoachim Protze         *type = ompt_task_implicit;
4037cc577a4SJonathan Peyton       }
40482e94a59SJoachim Protze     } else if (taskdata) {
40582e94a59SJoachim Protze       info = &taskdata->ompt_task_info;
40682e94a59SJoachim Protze       team_info = &team->t.ompt_team_info;
40782e94a59SJoachim Protze       if (type) {
40882e94a59SJoachim Protze         if (taskdata->td_parent) {
40982e94a59SJoachim Protze           *type = (taskdata->td_flags.tasktype ? ompt_task_explicit
41082e94a59SJoachim Protze                                                : ompt_task_implicit) |
41182e94a59SJoachim Protze                   TASK_TYPE_DETAILS_FORMAT(taskdata);
41282e94a59SJoachim Protze         } else {
41382e94a59SJoachim Protze           *type = ompt_task_initial;
4147cc577a4SJonathan Peyton         }
41582e94a59SJoachim Protze       }
41682e94a59SJoachim Protze     }
41782e94a59SJoachim Protze     if (task_data) {
41882e94a59SJoachim Protze       *task_data = info ? &info->task_data : NULL;
41982e94a59SJoachim Protze     }
42082e94a59SJoachim Protze     if (task_frame) {
42182e94a59SJoachim Protze       // OpenMP spec asks for the scheduling task to be returned.
42282e94a59SJoachim Protze       *task_frame = info ? &info->frame : NULL;
42382e94a59SJoachim Protze     }
42482e94a59SJoachim Protze     if (parallel_data) {
42582e94a59SJoachim Protze       *parallel_data = team_info ? &(team_info->parallel_data) : NULL;
42682e94a59SJoachim Protze     }
427aa2022e7SJoachim Protze     if (thread_num) {
4284a73ae16SJoachim Protze       if (level == 0)
4294a73ae16SJoachim Protze         *thread_num = __kmp_get_tid();
430*f41d0854SVladimir Inđić       else if (lwt)
4314a73ae16SJoachim Protze         *thread_num = 0;
43259a994e8S@vladaindjic       else if (!prev_team) {
43359a994e8S@vladaindjic         // The innermost parallel region contains at least one explicit task.
43459a994e8S@vladaindjic         // The task at level > 0 is either an implicit task that
43559a994e8S@vladaindjic         // corresponds to the mentioned region or one of the explicit tasks
43659a994e8S@vladaindjic         // nested inside the same region. Note that the task isn't the
43759a994e8S@vladaindjic         // innermost explicit tasks (because of condition level > 0).
43859a994e8S@vladaindjic         // Since the task at this level still belongs to the innermost parallel
43959a994e8S@vladaindjic         // region, thread_num is determined the same way as for level==0.
44059a994e8S@vladaindjic         *thread_num = __kmp_get_tid();
44159a994e8S@vladaindjic       } else
4424a73ae16SJoachim Protze         *thread_num = prev_team->t.t_master_tid;
4434a73ae16SJoachim Protze       //        *thread_num = team->t.t_master_tid;
444aa2022e7SJoachim Protze     }
44582e94a59SJoachim Protze     return info ? 2 : 0;
44682e94a59SJoachim Protze   }
44782e94a59SJoachim Protze   return 0;
4487cc577a4SJonathan Peyton }
4497cc577a4SJonathan Peyton 
__ompt_get_task_memory_internal(void ** addr,size_t * size,int blocknum)4503057c3a0SJonathan Peyton int __ompt_get_task_memory_internal(void **addr, size_t *size, int blocknum) {
4513057c3a0SJonathan Peyton   if (blocknum != 0)
4523057c3a0SJonathan Peyton     return 0; // support only a single block
4533057c3a0SJonathan Peyton 
4543057c3a0SJonathan Peyton   kmp_info_t *thr = ompt_get_thread();
4557c75ac0cSHansang Bae   if (!thr)
4567c75ac0cSHansang Bae     return 0;
4577c75ac0cSHansang Bae 
4583057c3a0SJonathan Peyton   kmp_taskdata_t *taskdata = thr->th.th_current_task;
4593057c3a0SJonathan Peyton   kmp_task_t *task = KMP_TASKDATA_TO_TASK(taskdata);
4603057c3a0SJonathan Peyton 
4613057c3a0SJonathan Peyton   if (taskdata->td_flags.tasktype != TASK_EXPLICIT)
4623057c3a0SJonathan Peyton     return 0; // support only explicit task
4633057c3a0SJonathan Peyton 
4643057c3a0SJonathan Peyton   void *ret_addr;
4653057c3a0SJonathan Peyton   int64_t ret_size = taskdata->td_size_alloc - sizeof(kmp_taskdata_t);
4663057c3a0SJonathan Peyton 
4673057c3a0SJonathan Peyton   // kmp_task_t->data1 is an optional member
4683057c3a0SJonathan Peyton   if (taskdata->td_flags.destructors_thunk)
4693057c3a0SJonathan Peyton     ret_addr = &task->data1 + 1;
4703057c3a0SJonathan Peyton   else
4713057c3a0SJonathan Peyton     ret_addr = &task->part_id + 1;
4723057c3a0SJonathan Peyton 
4733057c3a0SJonathan Peyton   ret_size -= (char *)(ret_addr) - (char *)(task);
4743057c3a0SJonathan Peyton   if (ret_size < 0)
4753057c3a0SJonathan Peyton     return 0;
4763057c3a0SJonathan Peyton 
4773057c3a0SJonathan Peyton   *addr = ret_addr;
4786b316febSTerry Wilmarth   *size = (size_t)ret_size;
4793057c3a0SJonathan Peyton   return 1;
4803057c3a0SJonathan Peyton }
4813057c3a0SJonathan Peyton 
4827cc577a4SJonathan Peyton //----------------------------------------------------------
4837cc577a4SJonathan Peyton // team support
4847cc577a4SJonathan Peyton //----------------------------------------------------------
4857cc577a4SJonathan Peyton 
__ompt_team_assign_id(kmp_team_t * team,ompt_data_t ompt_pid)48682e94a59SJoachim Protze void __ompt_team_assign_id(kmp_team_t *team, ompt_data_t ompt_pid) {
48782e94a59SJoachim Protze   team->t.ompt_team_info.parallel_data = ompt_pid;
48882e94a59SJoachim Protze }
48982e94a59SJoachim Protze 
49082e94a59SJoachim Protze //----------------------------------------------------------
49182e94a59SJoachim Protze // misc
49282e94a59SJoachim Protze //----------------------------------------------------------
49382e94a59SJoachim Protze 
__ompt_get_unique_id_internal()49482e94a59SJoachim Protze static uint64_t __ompt_get_unique_id_internal() {
49582e94a59SJoachim Protze   static uint64_t thread = 1;
49682e94a59SJoachim Protze   static THREAD_LOCAL uint64_t ID = 0;
49782e94a59SJoachim Protze   if (ID == 0) {
49882e94a59SJoachim Protze     uint64_t new_thread = KMP_TEST_THEN_INC64((kmp_int64 *)&thread);
49982e94a59SJoachim Protze     ID = new_thread << (sizeof(uint64_t) * 8 - OMPT_THREAD_ID_BITS);
50082e94a59SJoachim Protze   }
50182e94a59SJoachim Protze   return ++ID;
5027cc577a4SJonathan Peyton }
503ad1ad7aeSJonathan Peyton 
__ompt_get_barrier_kind(enum barrier_type bt,kmp_info_t * thr)504ad1ad7aeSJonathan Peyton ompt_sync_region_t __ompt_get_barrier_kind(enum barrier_type bt,
505ad1ad7aeSJonathan Peyton                                            kmp_info_t *thr) {
506ad1ad7aeSJonathan Peyton   if (bt == bs_forkjoin_barrier)
507ad1ad7aeSJonathan Peyton     return ompt_sync_region_barrier_implicit;
508ad1ad7aeSJonathan Peyton 
509ad1ad7aeSJonathan Peyton   if (bt != bs_plain_barrier)
510ad1ad7aeSJonathan Peyton     return ompt_sync_region_barrier_implementation;
511ad1ad7aeSJonathan Peyton 
512ad1ad7aeSJonathan Peyton   if (!thr->th.th_ident)
513ad1ad7aeSJonathan Peyton     return ompt_sync_region_barrier;
514ad1ad7aeSJonathan Peyton 
515ad1ad7aeSJonathan Peyton   kmp_int32 flags = thr->th.th_ident->flags;
516ad1ad7aeSJonathan Peyton 
517ad1ad7aeSJonathan Peyton   if ((flags & KMP_IDENT_BARRIER_EXPL) != 0)
518ad1ad7aeSJonathan Peyton     return ompt_sync_region_barrier_explicit;
519ad1ad7aeSJonathan Peyton 
520ad1ad7aeSJonathan Peyton   if ((flags & KMP_IDENT_BARRIER_IMPL) != 0)
521ad1ad7aeSJonathan Peyton     return ompt_sync_region_barrier_implicit;
522ad1ad7aeSJonathan Peyton 
523ad1ad7aeSJonathan Peyton   return ompt_sync_region_barrier_implementation;
524ad1ad7aeSJonathan Peyton }
525