1*b0277befSVignesh Balasubramanian /*
2*b0277befSVignesh Balasubramanian  * omp-icv.cpp -- OMPD Internal Control Variable handling
3*b0277befSVignesh Balasubramanian  */
4*b0277befSVignesh Balasubramanian 
5*b0277befSVignesh Balasubramanian //===----------------------------------------------------------------------===//
6*b0277befSVignesh Balasubramanian //
7*b0277befSVignesh Balasubramanian // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8*b0277befSVignesh Balasubramanian // See https://llvm.org/LICENSE.txt for license information.
9*b0277befSVignesh Balasubramanian // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10*b0277befSVignesh Balasubramanian //
11*b0277befSVignesh Balasubramanian //===----------------------------------------------------------------------===//
12*b0277befSVignesh Balasubramanian // clang-format off
13*b0277befSVignesh Balasubramanian /* clang-format expect kmp.h before omp.h which results in build break
14*b0277befSVignesh Balasubramanian  * due to a few redeclarations.
15*b0277befSVignesh Balasubramanian  */
16*b0277befSVignesh Balasubramanian #include "omp-debug.h"
17*b0277befSVignesh Balasubramanian // NOLINTNEXTLINE "to avoid clang tidy warning for the same reason as above."
18*b0277befSVignesh Balasubramanian #include "omp.h"
19*b0277befSVignesh Balasubramanian #include "ompd-private.h"
20*b0277befSVignesh Balasubramanian #include "TargetValue.h"
21*b0277befSVignesh Balasubramanian #include "kmp.h"
22*b0277befSVignesh Balasubramanian #include <cstring>
23*b0277befSVignesh Balasubramanian 
24*b0277befSVignesh Balasubramanian /* The ICVs ompd-final-var and ompd-implicit-var below are for backward
25*b0277befSVignesh Balasubramanian  * compatibility with 5.0.
26*b0277befSVignesh Balasubramanian  */
27*b0277befSVignesh Balasubramanian 
28*b0277befSVignesh Balasubramanian #define FOREACH_OMPD_ICV(macro)                                                     \
29*b0277befSVignesh Balasubramanian   macro(dyn_var, "dyn-var", ompd_scope_thread, 0)                                   \
30*b0277befSVignesh Balasubramanian   macro(run_sched_var, "run-sched-var", ompd_scope_task, 0)                         \
31*b0277befSVignesh Balasubramanian   macro(stacksize_var, "stacksize-var", ompd_scope_address_space, 0)                \
32*b0277befSVignesh Balasubramanian   macro(cancel_var, "cancel-var", ompd_scope_address_space, 0)                      \
33*b0277befSVignesh Balasubramanian   macro(max_task_priority_var, "max-task-priority-var", ompd_scope_address_space, 0)\
34*b0277befSVignesh Balasubramanian   macro(debug_var, "debug-var", ompd_scope_address_space, 0)                        \
35*b0277befSVignesh Balasubramanian   macro(nthreads_var, "nthreads-var", ompd_scope_thread, 0)                         \
36*b0277befSVignesh Balasubramanian   macro(display_affinity_var, "display-affinity-var", ompd_scope_address_space, 0)  \
37*b0277befSVignesh Balasubramanian   macro(affinity_format_var, "affinity-format-var", ompd_scope_address_space, 0)    \
38*b0277befSVignesh Balasubramanian   macro(default_device_var, "default-device-var", ompd_scope_thread, 0)             \
39*b0277befSVignesh Balasubramanian   macro(tool_var, "tool-var", ompd_scope_address_space, 0)                          \
40*b0277befSVignesh Balasubramanian   macro(tool_libraries_var, "tool-libraries-var", ompd_scope_address_space, 0)      \
41*b0277befSVignesh Balasubramanian   macro(tool_verbose_init_var, "tool-verbose-init-var", ompd_scope_address_space, 0)\
42*b0277befSVignesh Balasubramanian   macro(levels_var, "levels-var", ompd_scope_parallel, 1)                           \
43*b0277befSVignesh Balasubramanian   macro(active_levels_var, "active-levels-var", ompd_scope_parallel, 0)             \
44*b0277befSVignesh Balasubramanian   macro(thread_limit_var, "thread-limit-var", ompd_scope_task, 0)                   \
45*b0277befSVignesh Balasubramanian   macro(max_active_levels_var, "max-active-levels-var", ompd_scope_task, 0)         \
46*b0277befSVignesh Balasubramanian   macro(bind_var, "bind-var", ompd_scope_task, 0)                                   \
47*b0277befSVignesh Balasubramanian   macro(num_procs_var, "num-procs-var", ompd_scope_address_space, 0)                \
48*b0277befSVignesh Balasubramanian   macro(ompd_num_procs_var, "ompd-num-procs-var", ompd_scope_address_space, 0)      \
49*b0277befSVignesh Balasubramanian   macro(thread_num_var, "thread-num-var", ompd_scope_thread, 1)                     \
50*b0277befSVignesh Balasubramanian   macro(ompd_thread_num_var, "ompd-thread-num-var", ompd_scope_thread, 1)           \
51*b0277befSVignesh Balasubramanian   macro(final_var, "final-task-var", ompd_scope_task, 0)                            \
52*b0277befSVignesh Balasubramanian   macro(ompd_final_var, "ompd-final-var", ompd_scope_task, 0)                       \
53*b0277befSVignesh Balasubramanian   macro(ompd_final_task_var, "ompd-final-task-var", ompd_scope_task, 0)             \
54*b0277befSVignesh Balasubramanian   macro(implicit_var, "implicit-task-var", ompd_scope_task, 0)                      \
55*b0277befSVignesh Balasubramanian   macro(ompd_implicit_var, "ompd-implicit-var", ompd_scope_task, 0)                 \
56*b0277befSVignesh Balasubramanian   macro(ompd_implicit_task_var, "ompd-implicit-task-var", ompd_scope_task, 0)       \
57*b0277befSVignesh Balasubramanian   macro(team_size_var, "team-size-var", ompd_scope_parallel, 1)                     \
58*b0277befSVignesh Balasubramanian   macro(ompd_team_size_var, "ompd-team-size-var", ompd_scope_parallel, 1)
59*b0277befSVignesh Balasubramanian 
__ompd_init_icvs(const ompd_callbacks_t * table)60*b0277befSVignesh Balasubramanian void __ompd_init_icvs(const ompd_callbacks_t *table) { callbacks = table; }
61*b0277befSVignesh Balasubramanian 
62*b0277befSVignesh Balasubramanian enum ompd_icv {
63*b0277befSVignesh Balasubramanian   ompd_icv_undefined_marker =
64*b0277befSVignesh Balasubramanian       0, // ompd_icv_undefined is already defined in ompd.h
65*b0277befSVignesh Balasubramanian #define ompd_icv_macro(v, n, s, d) ompd_icv_##v,
66*b0277befSVignesh Balasubramanian   FOREACH_OMPD_ICV(ompd_icv_macro)
67*b0277befSVignesh Balasubramanian #undef ompd_icv_macro
68*b0277befSVignesh Balasubramanian       ompd_icv_after_last_icv
69*b0277befSVignesh Balasubramanian };
70*b0277befSVignesh Balasubramanian 
71*b0277befSVignesh Balasubramanian static const char *ompd_icv_string_values[] = {"undefined",
72*b0277befSVignesh Balasubramanian #define ompd_icv_macro(v, n, s, d) n,
73*b0277befSVignesh Balasubramanian   FOREACH_OMPD_ICV(ompd_icv_macro)
74*b0277befSVignesh Balasubramanian #undef ompd_icv_macro
75*b0277befSVignesh Balasubramanian };
76*b0277befSVignesh Balasubramanian 
77*b0277befSVignesh Balasubramanian static const ompd_scope_t ompd_icv_scope_values[] = {
78*b0277befSVignesh Balasubramanian     ompd_scope_global, // undefined marker
79*b0277befSVignesh Balasubramanian #define ompd_icv_macro(v, n, s, d) s,
80*b0277befSVignesh Balasubramanian     FOREACH_OMPD_ICV(ompd_icv_macro)
81*b0277befSVignesh Balasubramanian #undef ompd_icv_macro
82*b0277befSVignesh Balasubramanian };
83*b0277befSVignesh Balasubramanian 
84*b0277befSVignesh Balasubramanian // clang-format on
ompd_enumerate_icvs(ompd_address_space_handle_t * handle,ompd_icv_id_t current,ompd_icv_id_t * next_id,const char ** next_icv_name,ompd_scope_t * next_scope,int * more)85*b0277befSVignesh Balasubramanian ompd_rc_t ompd_enumerate_icvs(ompd_address_space_handle_t *handle,
86*b0277befSVignesh Balasubramanian                               ompd_icv_id_t current, ompd_icv_id_t *next_id,
87*b0277befSVignesh Balasubramanian                               const char **next_icv_name,
88*b0277befSVignesh Balasubramanian                               ompd_scope_t *next_scope, int *more) {
89*b0277befSVignesh Balasubramanian   if (!handle) {
90*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
91*b0277befSVignesh Balasubramanian   }
92*b0277befSVignesh Balasubramanian   if (!next_id || !next_icv_name || !next_scope || !more) {
93*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
94*b0277befSVignesh Balasubramanian   }
95*b0277befSVignesh Balasubramanian   if (current + 1 >= ompd_icv_after_last_icv) {
96*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
97*b0277befSVignesh Balasubramanian   }
98*b0277befSVignesh Balasubramanian 
99*b0277befSVignesh Balasubramanian   *next_id = current + 1;
100*b0277befSVignesh Balasubramanian 
101*b0277befSVignesh Balasubramanian   char *icv_name = NULL;
102*b0277befSVignesh Balasubramanian   ompd_rc_t ret = callbacks->alloc_memory(
103*b0277befSVignesh Balasubramanian       std::strlen(ompd_icv_string_values[*next_id]) + 1, (void **)&icv_name);
104*b0277befSVignesh Balasubramanian   *next_icv_name = icv_name;
105*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok) {
106*b0277befSVignesh Balasubramanian     return ret;
107*b0277befSVignesh Balasubramanian   }
108*b0277befSVignesh Balasubramanian   std::strcpy(icv_name, ompd_icv_string_values[*next_id]);
109*b0277befSVignesh Balasubramanian 
110*b0277befSVignesh Balasubramanian   *next_scope = ompd_icv_scope_values[*next_id];
111*b0277befSVignesh Balasubramanian 
112*b0277befSVignesh Balasubramanian   if ((*next_id) + 1 >= ompd_icv_after_last_icv) {
113*b0277befSVignesh Balasubramanian     *more = 0;
114*b0277befSVignesh Balasubramanian   } else {
115*b0277befSVignesh Balasubramanian     *more = 1;
116*b0277befSVignesh Balasubramanian   }
117*b0277befSVignesh Balasubramanian 
118*b0277befSVignesh Balasubramanian   return ompd_rc_ok;
119*b0277befSVignesh Balasubramanian }
120*b0277befSVignesh Balasubramanian 
create_empty_string(const char ** empty_string_ptr)121*b0277befSVignesh Balasubramanian static ompd_rc_t create_empty_string(const char **empty_string_ptr) {
122*b0277befSVignesh Balasubramanian   char *empty_str;
123*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
124*b0277befSVignesh Balasubramanian 
125*b0277befSVignesh Balasubramanian   if (!callbacks) {
126*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
127*b0277befSVignesh Balasubramanian   }
128*b0277befSVignesh Balasubramanian   ret = callbacks->alloc_memory(1, (void **)&empty_str);
129*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok) {
130*b0277befSVignesh Balasubramanian     return ret;
131*b0277befSVignesh Balasubramanian   }
132*b0277befSVignesh Balasubramanian   empty_str[0] = '\0';
133*b0277befSVignesh Balasubramanian   *empty_string_ptr = empty_str;
134*b0277befSVignesh Balasubramanian   return ompd_rc_ok;
135*b0277befSVignesh Balasubramanian }
136*b0277befSVignesh Balasubramanian 
ompd_get_dynamic(ompd_thread_handle_t * thread_handle,ompd_word_t * dyn_val)137*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_dynamic(
138*b0277befSVignesh Balasubramanian     ompd_thread_handle_t *thread_handle, /* IN: OpenMP thread handle */
139*b0277befSVignesh Balasubramanian     ompd_word_t *dyn_val /* OUT: Dynamic adjustment of threads */
140*b0277befSVignesh Balasubramanian ) {
141*b0277befSVignesh Balasubramanian   if (!thread_handle)
142*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
143*b0277befSVignesh Balasubramanian   if (!thread_handle->ah)
144*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
145*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = thread_handle->ah->context;
146*b0277befSVignesh Balasubramanian   if (!context)
147*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
148*b0277befSVignesh Balasubramanian   if (!callbacks) {
149*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
150*b0277befSVignesh Balasubramanian   }
151*b0277befSVignesh Balasubramanian 
152*b0277befSVignesh Balasubramanian   int8_t dynamic;
153*b0277befSVignesh Balasubramanian   ompd_rc_t ret =
154*b0277befSVignesh Balasubramanian       TValue(context, thread_handle->th) /*__kmp_threads[t]->th*/
155*b0277befSVignesh Balasubramanian           .cast("kmp_base_info_t")
156*b0277befSVignesh Balasubramanian           .access("th_current_task") /*__kmp_threads[t]->th.th_current_task*/
157*b0277befSVignesh Balasubramanian           .cast("kmp_taskdata_t", 1)
158*b0277befSVignesh Balasubramanian           .access("td_icvs") /*__kmp_threads[t]->th.th_current_task->td_icvs*/
159*b0277befSVignesh Balasubramanian           .cast("kmp_internal_control_t", 0)
160*b0277befSVignesh Balasubramanian           .access(
161*b0277befSVignesh Balasubramanian               "dynamic") /*__kmp_threads[t]->th.th_current_task->td_icvs.dynamic*/
162*b0277befSVignesh Balasubramanian           .castBase()
163*b0277befSVignesh Balasubramanian           .getValue(dynamic);
164*b0277befSVignesh Balasubramanian   *dyn_val = dynamic;
165*b0277befSVignesh Balasubramanian   return ret;
166*b0277befSVignesh Balasubramanian }
167*b0277befSVignesh Balasubramanian 
168*b0277befSVignesh Balasubramanian static ompd_rc_t
ompd_get_stacksize(ompd_address_space_handle_t * addr_handle,ompd_word_t * stacksize_val)169*b0277befSVignesh Balasubramanian ompd_get_stacksize(ompd_address_space_handle_t
170*b0277befSVignesh Balasubramanian                        *addr_handle, /* IN: handle for the address space */
171*b0277befSVignesh Balasubramanian                    ompd_word_t *stacksize_val /* OUT: per thread stack size */
172*b0277befSVignesh Balasubramanian ) {
173*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
174*b0277befSVignesh Balasubramanian   if (!context)
175*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
176*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
177*b0277befSVignesh Balasubramanian   if (!callbacks) {
178*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
179*b0277befSVignesh Balasubramanian   }
180*b0277befSVignesh Balasubramanian 
181*b0277befSVignesh Balasubramanian   size_t stacksize;
182*b0277befSVignesh Balasubramanian   ret = TValue(context, "__kmp_stksize")
183*b0277befSVignesh Balasubramanian             .castBase("__kmp_stksize")
184*b0277befSVignesh Balasubramanian             .getValue(stacksize);
185*b0277befSVignesh Balasubramanian   *stacksize_val = stacksize;
186*b0277befSVignesh Balasubramanian   return ret;
187*b0277befSVignesh Balasubramanian }
188*b0277befSVignesh Balasubramanian 
ompd_get_cancellation(ompd_address_space_handle_t * addr_handle,ompd_word_t * cancellation_val)189*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_cancellation(
190*b0277befSVignesh Balasubramanian     ompd_address_space_handle_t
191*b0277befSVignesh Balasubramanian         *addr_handle,             /* IN: handle for the address space */
192*b0277befSVignesh Balasubramanian     ompd_word_t *cancellation_val /* OUT: cancellation value */
193*b0277befSVignesh Balasubramanian ) {
194*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
195*b0277befSVignesh Balasubramanian   if (!context)
196*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
197*b0277befSVignesh Balasubramanian   if (!callbacks) {
198*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
199*b0277befSVignesh Balasubramanian   }
200*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
201*b0277befSVignesh Balasubramanian 
202*b0277befSVignesh Balasubramanian   int omp_cancellation;
203*b0277befSVignesh Balasubramanian   ret = TValue(context, "__kmp_omp_cancellation")
204*b0277befSVignesh Balasubramanian             .castBase("__kmp_omp_cancellation")
205*b0277befSVignesh Balasubramanian             .getValue(omp_cancellation);
206*b0277befSVignesh Balasubramanian   *cancellation_val = omp_cancellation;
207*b0277befSVignesh Balasubramanian   return ret;
208*b0277befSVignesh Balasubramanian }
209*b0277befSVignesh Balasubramanian 
ompd_get_max_task_priority(ompd_address_space_handle_t * addr_handle,ompd_word_t * max_task_priority_val)210*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_max_task_priority(
211*b0277befSVignesh Balasubramanian     ompd_address_space_handle_t
212*b0277befSVignesh Balasubramanian         *addr_handle,                  /* IN: handle for the address space */
213*b0277befSVignesh Balasubramanian     ompd_word_t *max_task_priority_val /* OUT: max task priority value */
214*b0277befSVignesh Balasubramanian ) {
215*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
216*b0277befSVignesh Balasubramanian   if (!context)
217*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
218*b0277befSVignesh Balasubramanian   if (!callbacks) {
219*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
220*b0277befSVignesh Balasubramanian   }
221*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
222*b0277befSVignesh Balasubramanian 
223*b0277befSVignesh Balasubramanian   int max_task_priority;
224*b0277befSVignesh Balasubramanian   ret = TValue(context, "__kmp_max_task_priority")
225*b0277befSVignesh Balasubramanian             .castBase("__kmp_max_task_priority")
226*b0277befSVignesh Balasubramanian             .getValue(max_task_priority);
227*b0277befSVignesh Balasubramanian   *max_task_priority_val = max_task_priority;
228*b0277befSVignesh Balasubramanian   return ret;
229*b0277befSVignesh Balasubramanian }
230*b0277befSVignesh Balasubramanian 
231*b0277befSVignesh Balasubramanian static ompd_rc_t
ompd_get_debug(ompd_address_space_handle_t * addr_handle,ompd_word_t * debug_val)232*b0277befSVignesh Balasubramanian ompd_get_debug(ompd_address_space_handle_t
233*b0277befSVignesh Balasubramanian                    *addr_handle,      /* IN: handle for the address space */
234*b0277befSVignesh Balasubramanian                ompd_word_t *debug_val /* OUT: debug value */
235*b0277befSVignesh Balasubramanian ) {
236*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
237*b0277befSVignesh Balasubramanian   if (!context)
238*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
239*b0277befSVignesh Balasubramanian   if (!callbacks) {
240*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
241*b0277befSVignesh Balasubramanian   }
242*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
243*b0277befSVignesh Balasubramanian 
244*b0277befSVignesh Balasubramanian   uint64_t ompd_state_val;
245*b0277befSVignesh Balasubramanian   ret = TValue(context, "ompd_state")
246*b0277befSVignesh Balasubramanian             .castBase("ompd_state")
247*b0277befSVignesh Balasubramanian             .getValue(ompd_state_val);
248*b0277befSVignesh Balasubramanian   if (ompd_state_val > 0) {
249*b0277befSVignesh Balasubramanian     *debug_val = 1;
250*b0277befSVignesh Balasubramanian   } else {
251*b0277befSVignesh Balasubramanian     *debug_val = 0;
252*b0277befSVignesh Balasubramanian   }
253*b0277befSVignesh Balasubramanian   return ret;
254*b0277befSVignesh Balasubramanian }
255*b0277befSVignesh Balasubramanian 
256*b0277befSVignesh Balasubramanian /* Helper routine for the ompd_get_nthreads routines */
ompd_get_nthreads_aux(ompd_thread_handle_t * thread_handle,uint32_t * used,uint32_t * current_nesting_level,uint32_t * nproc)257*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_nthreads_aux(ompd_thread_handle_t *thread_handle,
258*b0277befSVignesh Balasubramanian                                        uint32_t *used,
259*b0277befSVignesh Balasubramanian                                        uint32_t *current_nesting_level,
260*b0277befSVignesh Balasubramanian                                        uint32_t *nproc) {
261*b0277befSVignesh Balasubramanian   if (!thread_handle)
262*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
263*b0277befSVignesh Balasubramanian   if (!thread_handle->ah)
264*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
265*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = thread_handle->ah->context;
266*b0277befSVignesh Balasubramanian   if (!context)
267*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
268*b0277befSVignesh Balasubramanian   if (!callbacks) {
269*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
270*b0277befSVignesh Balasubramanian   }
271*b0277befSVignesh Balasubramanian 
272*b0277befSVignesh Balasubramanian   ompd_rc_t ret = TValue(context, "__kmp_nested_nth")
273*b0277befSVignesh Balasubramanian                       .cast("kmp_nested_nthreads_t")
274*b0277befSVignesh Balasubramanian                       .access("used")
275*b0277befSVignesh Balasubramanian                       .castBase(ompd_type_int)
276*b0277befSVignesh Balasubramanian                       .getValue(*used);
277*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
278*b0277befSVignesh Balasubramanian     return ret;
279*b0277befSVignesh Balasubramanian 
280*b0277befSVignesh Balasubramanian   TValue taskdata =
281*b0277befSVignesh Balasubramanian       TValue(context, thread_handle->th) /*__kmp_threads[t]->th*/
282*b0277befSVignesh Balasubramanian           .cast("kmp_base_info_t")
283*b0277befSVignesh Balasubramanian           .access("th_current_task") /*__kmp_threads[t]->th.th_current_task*/
284*b0277befSVignesh Balasubramanian           .cast("kmp_taskdata_t", 1);
285*b0277befSVignesh Balasubramanian 
286*b0277befSVignesh Balasubramanian   ret = taskdata
287*b0277befSVignesh Balasubramanian             .access("td_team") /*__kmp_threads[t]->th.th_current_task.td_team*/
288*b0277befSVignesh Balasubramanian             .cast("kmp_team_p", 1)
289*b0277befSVignesh Balasubramanian             .access("t") /*__kmp_threads[t]->th.th_current_task.td_team->t*/
290*b0277befSVignesh Balasubramanian             .cast("kmp_base_team_t", 0) /*t*/
291*b0277befSVignesh Balasubramanian             .access("t_level")          /*t.t_level*/
292*b0277befSVignesh Balasubramanian             .castBase(ompd_type_int)
293*b0277befSVignesh Balasubramanian             .getValue(*current_nesting_level);
294*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
295*b0277befSVignesh Balasubramanian     return ret;
296*b0277befSVignesh Balasubramanian 
297*b0277befSVignesh Balasubramanian   ret = taskdata.cast("kmp_taskdata_t", 1)
298*b0277befSVignesh Balasubramanian             .access("td_icvs") /*__kmp_threads[t]->th.th_current_task->td_icvs*/
299*b0277befSVignesh Balasubramanian             .cast("kmp_internal_control_t", 0)
300*b0277befSVignesh Balasubramanian             .access(
301*b0277befSVignesh Balasubramanian                 "nproc") /*__kmp_threads[t]->th.th_current_task->td_icvs.nproc*/
302*b0277befSVignesh Balasubramanian             .castBase(ompd_type_int)
303*b0277befSVignesh Balasubramanian             .getValue(*nproc);
304*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
305*b0277befSVignesh Balasubramanian     return ret;
306*b0277befSVignesh Balasubramanian 
307*b0277befSVignesh Balasubramanian   return ompd_rc_ok;
308*b0277befSVignesh Balasubramanian }
309*b0277befSVignesh Balasubramanian 
ompd_get_nthreads(ompd_thread_handle_t * thread_handle,ompd_word_t * nthreads_var_val)310*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_nthreads(
311*b0277befSVignesh Balasubramanian     ompd_thread_handle_t *thread_handle, /* IN: handle for the thread */
312*b0277befSVignesh Balasubramanian     ompd_word_t *nthreads_var_val        /* OUT: nthreads-var (of integer type)
313*b0277befSVignesh Balasubramanian                                             value */
314*b0277befSVignesh Balasubramanian ) {
315*b0277befSVignesh Balasubramanian   uint32_t used;
316*b0277befSVignesh Balasubramanian   uint32_t nproc;
317*b0277befSVignesh Balasubramanian   uint32_t current_nesting_level;
318*b0277befSVignesh Balasubramanian 
319*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
320*b0277befSVignesh Balasubramanian   ret = ompd_get_nthreads_aux(thread_handle, &used, &current_nesting_level,
321*b0277befSVignesh Balasubramanian                               &nproc);
322*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
323*b0277befSVignesh Balasubramanian     return ret;
324*b0277befSVignesh Balasubramanian 
325*b0277befSVignesh Balasubramanian   /*__kmp_threads[t]->th.th_current_task->td_icvs.nproc*/
326*b0277befSVignesh Balasubramanian   *nthreads_var_val = nproc;
327*b0277befSVignesh Balasubramanian   /* If the nthreads-var is a list with more than one element, then the value of
328*b0277befSVignesh Balasubramanian      this ICV cannot be represented by an integer type. In this case,
329*b0277befSVignesh Balasubramanian      ompd_rc_incomplete is returned. The tool can check the return value and
330*b0277befSVignesh Balasubramanian      can choose to invoke ompd_get_icv_string_from_scope() if needed. */
331*b0277befSVignesh Balasubramanian   if (current_nesting_level < used - 1) {
332*b0277befSVignesh Balasubramanian     return ompd_rc_incomplete;
333*b0277befSVignesh Balasubramanian   }
334*b0277befSVignesh Balasubramanian   return ompd_rc_ok;
335*b0277befSVignesh Balasubramanian }
336*b0277befSVignesh Balasubramanian 
ompd_get_nthreads(ompd_thread_handle_t * thread_handle,const char ** nthreads_list_string)337*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_nthreads(
338*b0277befSVignesh Balasubramanian     ompd_thread_handle_t *thread_handle, /* IN: handle for the thread */
339*b0277befSVignesh Balasubramanian     const char **nthreads_list_string    /* OUT: string list of comma separated
340*b0277befSVignesh Balasubramanian                                             nthreads values */
341*b0277befSVignesh Balasubramanian ) {
342*b0277befSVignesh Balasubramanian   uint32_t used;
343*b0277befSVignesh Balasubramanian   uint32_t nproc;
344*b0277befSVignesh Balasubramanian   uint32_t current_nesting_level;
345*b0277befSVignesh Balasubramanian 
346*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
347*b0277befSVignesh Balasubramanian   ret = ompd_get_nthreads_aux(thread_handle, &used, &current_nesting_level,
348*b0277befSVignesh Balasubramanian                               &nproc);
349*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
350*b0277befSVignesh Balasubramanian     return ret;
351*b0277befSVignesh Balasubramanian 
352*b0277befSVignesh Balasubramanian   uint32_t num_list_elems;
353*b0277befSVignesh Balasubramanian   if (used == 0 || current_nesting_level >= used) {
354*b0277befSVignesh Balasubramanian     num_list_elems = 1;
355*b0277befSVignesh Balasubramanian   } else {
356*b0277befSVignesh Balasubramanian     num_list_elems = used - current_nesting_level;
357*b0277befSVignesh Balasubramanian   }
358*b0277befSVignesh Balasubramanian   size_t buffer_size = 16 /* digits per element including the comma separator */
359*b0277befSVignesh Balasubramanian                            * num_list_elems +
360*b0277befSVignesh Balasubramanian                        1; /* string terminator NULL */
361*b0277befSVignesh Balasubramanian   char *nthreads_list_str;
362*b0277befSVignesh Balasubramanian   ret = callbacks->alloc_memory(buffer_size, (void **)&nthreads_list_str);
363*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
364*b0277befSVignesh Balasubramanian     return ret;
365*b0277befSVignesh Balasubramanian 
366*b0277befSVignesh Balasubramanian   /* The nthreads-var list would be:
367*b0277befSVignesh Balasubramanian   [__kmp_threads[t]->th.th_current_task->td_icvs.nproc,
368*b0277befSVignesh Balasubramanian    __kmp_nested_nth.nth[current_nesting_level + 1],
369*b0277befSVignesh Balasubramanian    __kmp_nested_nth.nth[current_nesting_level + 2],
370*b0277befSVignesh Balasubramanian     …,
371*b0277befSVignesh Balasubramanian    __kmp_nested_nth.nth[used - 1]]*/
372*b0277befSVignesh Balasubramanian 
373*b0277befSVignesh Balasubramanian   sprintf(nthreads_list_str, "%d", nproc);
374*b0277befSVignesh Balasubramanian   *nthreads_list_string = nthreads_list_str;
375*b0277befSVignesh Balasubramanian   if (num_list_elems == 1) {
376*b0277befSVignesh Balasubramanian     return ompd_rc_ok;
377*b0277befSVignesh Balasubramanian   }
378*b0277befSVignesh Balasubramanian 
379*b0277befSVignesh Balasubramanian   char temp_value[16];
380*b0277befSVignesh Balasubramanian   uint32_t nth_value;
381*b0277befSVignesh Balasubramanian 
382*b0277befSVignesh Balasubramanian   for (current_nesting_level++; /* the list element for this nesting
383*b0277befSVignesh Balasubramanian                                  * level has already been accounted for
384*b0277befSVignesh Balasubramanian                                    by nproc */
385*b0277befSVignesh Balasubramanian        current_nesting_level < used; current_nesting_level++) {
386*b0277befSVignesh Balasubramanian 
387*b0277befSVignesh Balasubramanian     ret = TValue(thread_handle->ah->context, "__kmp_nested_nth")
388*b0277befSVignesh Balasubramanian               .cast("kmp_nested_nthreads_t")
389*b0277befSVignesh Balasubramanian               .access("nth")
390*b0277befSVignesh Balasubramanian               .cast("int", 1)
391*b0277befSVignesh Balasubramanian               .getArrayElement(current_nesting_level)
392*b0277befSVignesh Balasubramanian               .castBase(ompd_type_int)
393*b0277befSVignesh Balasubramanian               .getValue(nth_value);
394*b0277befSVignesh Balasubramanian 
395*b0277befSVignesh Balasubramanian     if (ret != ompd_rc_ok)
396*b0277befSVignesh Balasubramanian       return ret;
397*b0277befSVignesh Balasubramanian 
398*b0277befSVignesh Balasubramanian     sprintf(temp_value, ",%d", nth_value);
399*b0277befSVignesh Balasubramanian     strcat(nthreads_list_str, temp_value);
400*b0277befSVignesh Balasubramanian   }
401*b0277befSVignesh Balasubramanian 
402*b0277befSVignesh Balasubramanian   return ompd_rc_ok;
403*b0277befSVignesh Balasubramanian }
404*b0277befSVignesh Balasubramanian 
ompd_get_display_affinity(ompd_address_space_handle_t * addr_handle,ompd_word_t * display_affinity_val)405*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_display_affinity(
406*b0277befSVignesh Balasubramanian     ompd_address_space_handle_t
407*b0277befSVignesh Balasubramanian         *addr_handle,                 /* IN: handle for the address space */
408*b0277befSVignesh Balasubramanian     ompd_word_t *display_affinity_val /* OUT: display affinity value */
409*b0277befSVignesh Balasubramanian ) {
410*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
411*b0277befSVignesh Balasubramanian   if (!context)
412*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
413*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
414*b0277befSVignesh Balasubramanian 
415*b0277befSVignesh Balasubramanian   if (!callbacks) {
416*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
417*b0277befSVignesh Balasubramanian   }
418*b0277befSVignesh Balasubramanian   ret = TValue(context, "__kmp_display_affinity")
419*b0277befSVignesh Balasubramanian             .castBase("__kmp_display_affinity")
420*b0277befSVignesh Balasubramanian             .getValue(*display_affinity_val);
421*b0277befSVignesh Balasubramanian   return ret;
422*b0277befSVignesh Balasubramanian }
423*b0277befSVignesh Balasubramanian 
ompd_get_affinity_format(ompd_address_space_handle_t * addr_handle,const char ** affinity_format_string)424*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_affinity_format(
425*b0277befSVignesh Balasubramanian     ompd_address_space_handle_t *addr_handle, /* IN: address space handle*/
426*b0277befSVignesh Balasubramanian     const char **affinity_format_string       /* OUT: affinity format string */
427*b0277befSVignesh Balasubramanian ) {
428*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
429*b0277befSVignesh Balasubramanian   if (!context)
430*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
431*b0277befSVignesh Balasubramanian 
432*b0277befSVignesh Balasubramanian   if (!callbacks) {
433*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
434*b0277befSVignesh Balasubramanian   }
435*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
436*b0277befSVignesh Balasubramanian   ret = TValue(context, "__kmp_affinity_format")
437*b0277befSVignesh Balasubramanian             .cast("char", 1)
438*b0277befSVignesh Balasubramanian             .getString(affinity_format_string);
439*b0277befSVignesh Balasubramanian   return ret;
440*b0277befSVignesh Balasubramanian }
441*b0277befSVignesh Balasubramanian 
ompd_get_tool_libraries(ompd_address_space_handle_t * addr_handle,const char ** tool_libraries_string)442*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_tool_libraries(
443*b0277befSVignesh Balasubramanian     ompd_address_space_handle_t *addr_handle, /* IN: address space handle*/
444*b0277befSVignesh Balasubramanian     const char **tool_libraries_string        /* OUT: tool libraries string */
445*b0277befSVignesh Balasubramanian ) {
446*b0277befSVignesh Balasubramanian   if (!tool_libraries_string)
447*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
448*b0277befSVignesh Balasubramanian 
449*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
450*b0277befSVignesh Balasubramanian   if (!context)
451*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
452*b0277befSVignesh Balasubramanian 
453*b0277befSVignesh Balasubramanian   if (!callbacks) {
454*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
455*b0277befSVignesh Balasubramanian   }
456*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
457*b0277befSVignesh Balasubramanian   ret = TValue(context, "__kmp_tool_libraries")
458*b0277befSVignesh Balasubramanian             .cast("char", 1)
459*b0277befSVignesh Balasubramanian             .getString(tool_libraries_string);
460*b0277befSVignesh Balasubramanian   if (ret == ompd_rc_unsupported) {
461*b0277befSVignesh Balasubramanian     ret = create_empty_string(tool_libraries_string);
462*b0277befSVignesh Balasubramanian   }
463*b0277befSVignesh Balasubramanian   return ret;
464*b0277befSVignesh Balasubramanian }
465*b0277befSVignesh Balasubramanian 
ompd_get_default_device(ompd_thread_handle_t * thread_handle,ompd_word_t * default_device_val)466*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_default_device(
467*b0277befSVignesh Balasubramanian     ompd_thread_handle_t *thread_handle, /* IN: handle for the thread */
468*b0277befSVignesh Balasubramanian     ompd_word_t *default_device_val      /* OUT: default device value */
469*b0277befSVignesh Balasubramanian ) {
470*b0277befSVignesh Balasubramanian   if (!thread_handle)
471*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
472*b0277befSVignesh Balasubramanian   if (!thread_handle->ah)
473*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
474*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = thread_handle->ah->context;
475*b0277befSVignesh Balasubramanian   if (!context)
476*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
477*b0277befSVignesh Balasubramanian   if (!callbacks)
478*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
479*b0277befSVignesh Balasubramanian 
480*b0277befSVignesh Balasubramanian   ompd_rc_t ret =
481*b0277befSVignesh Balasubramanian       TValue(context, thread_handle->th) /*__kmp_threads[t]->th*/
482*b0277befSVignesh Balasubramanian           .cast("kmp_base_info_t")
483*b0277befSVignesh Balasubramanian           .access("th_current_task") /*__kmp_threads[t]->th.th_current_task*/
484*b0277befSVignesh Balasubramanian           .cast("kmp_taskdata_t", 1)
485*b0277befSVignesh Balasubramanian           .access("td_icvs") /*__kmp_threads[t]->th.th_current_task->td_icvs*/
486*b0277befSVignesh Balasubramanian           .cast("kmp_internal_control_t", 0)
487*b0277befSVignesh Balasubramanian           /*__kmp_threads[t]->th.th_current_task->td_icvs.default_device*/
488*b0277befSVignesh Balasubramanian           .access("default_device")
489*b0277befSVignesh Balasubramanian           .castBase()
490*b0277befSVignesh Balasubramanian           .getValue(*default_device_val);
491*b0277befSVignesh Balasubramanian   return ret;
492*b0277befSVignesh Balasubramanian }
493*b0277befSVignesh Balasubramanian 
494*b0277befSVignesh Balasubramanian static ompd_rc_t
ompd_get_tool(ompd_address_space_handle_t * addr_handle,ompd_word_t * tool_val)495*b0277befSVignesh Balasubramanian ompd_get_tool(ompd_address_space_handle_t
496*b0277befSVignesh Balasubramanian                   *addr_handle,     /* IN: handle for the address space */
497*b0277befSVignesh Balasubramanian               ompd_word_t *tool_val /* OUT: tool value */
498*b0277befSVignesh Balasubramanian ) {
499*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
500*b0277befSVignesh Balasubramanian   if (!context)
501*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
502*b0277befSVignesh Balasubramanian   if (!callbacks) {
503*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
504*b0277befSVignesh Balasubramanian   }
505*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
506*b0277befSVignesh Balasubramanian 
507*b0277befSVignesh Balasubramanian   ret =
508*b0277befSVignesh Balasubramanian       TValue(context, "__kmp_tool").castBase("__kmp_tool").getValue(*tool_val);
509*b0277befSVignesh Balasubramanian   return ret;
510*b0277befSVignesh Balasubramanian }
511*b0277befSVignesh Balasubramanian 
ompd_get_tool_verbose_init(ompd_address_space_handle_t * addr_handle,const char ** tool_verbose_init_string)512*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_tool_verbose_init(
513*b0277befSVignesh Balasubramanian     ompd_address_space_handle_t *addr_handle, /* IN: address space handle*/
514*b0277befSVignesh Balasubramanian     const char **tool_verbose_init_string /* OUT: tool verbose init string */
515*b0277befSVignesh Balasubramanian ) {
516*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
517*b0277befSVignesh Balasubramanian   if (!context)
518*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
519*b0277befSVignesh Balasubramanian 
520*b0277befSVignesh Balasubramanian   if (!callbacks) {
521*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
522*b0277befSVignesh Balasubramanian   }
523*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
524*b0277befSVignesh Balasubramanian   ret = TValue(context, "__kmp_tool_verbose_init")
525*b0277befSVignesh Balasubramanian             .cast("char", 1)
526*b0277befSVignesh Balasubramanian             .getString(tool_verbose_init_string);
527*b0277befSVignesh Balasubramanian   if (ret == ompd_rc_unsupported) {
528*b0277befSVignesh Balasubramanian     ret = create_empty_string(tool_verbose_init_string);
529*b0277befSVignesh Balasubramanian   }
530*b0277befSVignesh Balasubramanian   return ret;
531*b0277befSVignesh Balasubramanian }
532*b0277befSVignesh Balasubramanian 
ompd_get_level(ompd_parallel_handle_t * parallel_handle,ompd_word_t * val)533*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_level(
534*b0277befSVignesh Balasubramanian     ompd_parallel_handle_t *parallel_handle, /* IN: OpenMP parallel handle */
535*b0277befSVignesh Balasubramanian     ompd_word_t *val                         /* OUT: nesting level */
536*b0277befSVignesh Balasubramanian ) {
537*b0277befSVignesh Balasubramanian   if (!parallel_handle->ah)
538*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
539*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = parallel_handle->ah->context;
540*b0277befSVignesh Balasubramanian   if (!context)
541*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
542*b0277befSVignesh Balasubramanian 
543*b0277befSVignesh Balasubramanian   if (!callbacks) {
544*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
545*b0277befSVignesh Balasubramanian   }
546*b0277befSVignesh Balasubramanian 
547*b0277befSVignesh Balasubramanian   uint32_t res;
548*b0277befSVignesh Balasubramanian 
549*b0277befSVignesh Balasubramanian   ompd_rc_t ret = TValue(context, parallel_handle->th)
550*b0277befSVignesh Balasubramanian                       .cast("kmp_base_team_t", 0) /*t*/
551*b0277befSVignesh Balasubramanian                       .access("t_level")          /*t.t_level*/
552*b0277befSVignesh Balasubramanian                       .castBase()
553*b0277befSVignesh Balasubramanian                       .getValue(res);
554*b0277befSVignesh Balasubramanian   *val = res;
555*b0277befSVignesh Balasubramanian   return ret;
556*b0277befSVignesh Balasubramanian }
557*b0277befSVignesh Balasubramanian 
ompd_get_active_level(ompd_parallel_handle_t * parallel_handle,ompd_word_t * val)558*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_active_level(
559*b0277befSVignesh Balasubramanian     ompd_parallel_handle_t *parallel_handle, /* IN: OpenMP parallel handle */
560*b0277befSVignesh Balasubramanian     ompd_word_t *val                         /* OUT: active nesting level */
561*b0277befSVignesh Balasubramanian ) {
562*b0277befSVignesh Balasubramanian   if (!parallel_handle->ah)
563*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
564*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = parallel_handle->ah->context;
565*b0277befSVignesh Balasubramanian   if (!context)
566*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
567*b0277befSVignesh Balasubramanian   if (!callbacks) {
568*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
569*b0277befSVignesh Balasubramanian   }
570*b0277befSVignesh Balasubramanian 
571*b0277befSVignesh Balasubramanian   uint32_t res;
572*b0277befSVignesh Balasubramanian 
573*b0277befSVignesh Balasubramanian   ompd_rc_t ret = TValue(context, parallel_handle->th)
574*b0277befSVignesh Balasubramanian                       .cast("kmp_base_team_t", 0) /*t*/
575*b0277befSVignesh Balasubramanian                       .access("t_active_level")   /*t.t_active_level*/
576*b0277befSVignesh Balasubramanian                       .castBase()
577*b0277befSVignesh Balasubramanian                       .getValue(res);
578*b0277befSVignesh Balasubramanian   *val = res;
579*b0277befSVignesh Balasubramanian   return ret;
580*b0277befSVignesh Balasubramanian }
581*b0277befSVignesh Balasubramanian 
582*b0277befSVignesh Balasubramanian static ompd_rc_t
ompd_get_num_procs(ompd_address_space_handle_t * addr_handle,ompd_word_t * val)583*b0277befSVignesh Balasubramanian ompd_get_num_procs(ompd_address_space_handle_t
584*b0277befSVignesh Balasubramanian                        *addr_handle, /* IN: handle for the address space */
585*b0277befSVignesh Balasubramanian                    ompd_word_t *val  /* OUT: number of processes */
586*b0277befSVignesh Balasubramanian ) {
587*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = addr_handle->context;
588*b0277befSVignesh Balasubramanian   if (!context)
589*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
590*b0277befSVignesh Balasubramanian   if (!callbacks) {
591*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
592*b0277befSVignesh Balasubramanian   }
593*b0277befSVignesh Balasubramanian 
594*b0277befSVignesh Balasubramanian   if (!val)
595*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
596*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
597*b0277befSVignesh Balasubramanian 
598*b0277befSVignesh Balasubramanian   int nth;
599*b0277befSVignesh Balasubramanian   ret = TValue(context, "__kmp_avail_proc")
600*b0277befSVignesh Balasubramanian             .castBase("__kmp_avail_proc")
601*b0277befSVignesh Balasubramanian             .getValue(nth);
602*b0277befSVignesh Balasubramanian   *val = nth;
603*b0277befSVignesh Balasubramanian   return ret;
604*b0277befSVignesh Balasubramanian }
605*b0277befSVignesh Balasubramanian 
ompd_get_thread_limit(ompd_task_handle_t * task_handle,ompd_word_t * val)606*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_thread_limit(
607*b0277befSVignesh Balasubramanian     ompd_task_handle_t *task_handle, /* IN: OpenMP task handle*/
608*b0277befSVignesh Balasubramanian     ompd_word_t *val                 /* OUT: max number of threads */
609*b0277befSVignesh Balasubramanian ) {
610*b0277befSVignesh Balasubramanian   if (!task_handle->ah)
611*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
612*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = task_handle->ah->context;
613*b0277befSVignesh Balasubramanian   if (!context)
614*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
615*b0277befSVignesh Balasubramanian   if (!callbacks) {
616*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
617*b0277befSVignesh Balasubramanian   }
618*b0277befSVignesh Balasubramanian 
619*b0277befSVignesh Balasubramanian   ompd_rc_t ret = TValue(context, task_handle->th)
620*b0277befSVignesh Balasubramanian                       .cast("kmp_taskdata_t") // td
621*b0277befSVignesh Balasubramanian                       .access("td_icvs")      // td->td_icvs
622*b0277befSVignesh Balasubramanian                       .cast("kmp_internal_control_t", 0)
623*b0277befSVignesh Balasubramanian                       .access("thread_limit") // td->td_icvs.thread_limit
624*b0277befSVignesh Balasubramanian                       .castBase()
625*b0277befSVignesh Balasubramanian                       .getValue(*val);
626*b0277befSVignesh Balasubramanian 
627*b0277befSVignesh Balasubramanian   return ret;
628*b0277befSVignesh Balasubramanian }
629*b0277befSVignesh Balasubramanian 
ompd_get_thread_num(ompd_thread_handle_t * thread_handle,ompd_word_t * val)630*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_thread_num(
631*b0277befSVignesh Balasubramanian     ompd_thread_handle_t *thread_handle, /* IN: OpenMP thread handle*/
632*b0277befSVignesh Balasubramanian     ompd_word_t *val /* OUT: number of the thread within the team */
633*b0277befSVignesh Balasubramanian ) {
634*b0277befSVignesh Balasubramanian   if (!thread_handle)
635*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
636*b0277befSVignesh Balasubramanian   if (!thread_handle->ah)
637*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
638*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = thread_handle->ah->context;
639*b0277befSVignesh Balasubramanian   if (!context)
640*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
641*b0277befSVignesh Balasubramanian   if (!callbacks) {
642*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
643*b0277befSVignesh Balasubramanian   }
644*b0277befSVignesh Balasubramanian 
645*b0277befSVignesh Balasubramanian   ompd_rc_t ret =
646*b0277befSVignesh Balasubramanian       TValue(context, thread_handle->th) /*__kmp_threads[t]->th*/
647*b0277befSVignesh Balasubramanian           .cast("kmp_base_info_t")
648*b0277befSVignesh Balasubramanian           .access("th_info") /*__kmp_threads[t]->th.th_info*/
649*b0277befSVignesh Balasubramanian           .cast("kmp_desc_t")
650*b0277befSVignesh Balasubramanian           .access("ds") /*__kmp_threads[t]->th.th_info.ds*/
651*b0277befSVignesh Balasubramanian           .cast("kmp_desc_base_t")
652*b0277befSVignesh Balasubramanian           .access("ds_tid") /*__kmp_threads[t]->th.th_info.ds.ds_tid*/
653*b0277befSVignesh Balasubramanian           .castBase()
654*b0277befSVignesh Balasubramanian           .getValue(*val);
655*b0277befSVignesh Balasubramanian   return ret;
656*b0277befSVignesh Balasubramanian }
657*b0277befSVignesh Balasubramanian 
658*b0277befSVignesh Balasubramanian static ompd_rc_t
ompd_in_final(ompd_task_handle_t * task_handle,ompd_word_t * val)659*b0277befSVignesh Balasubramanian ompd_in_final(ompd_task_handle_t *task_handle, /* IN: OpenMP task handle*/
660*b0277befSVignesh Balasubramanian               ompd_word_t *val                 /* OUT: max number of threads */
661*b0277befSVignesh Balasubramanian ) {
662*b0277befSVignesh Balasubramanian   if (!task_handle->ah)
663*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
664*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = task_handle->ah->context;
665*b0277befSVignesh Balasubramanian   if (!context)
666*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
667*b0277befSVignesh Balasubramanian   if (!callbacks) {
668*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
669*b0277befSVignesh Balasubramanian   }
670*b0277befSVignesh Balasubramanian 
671*b0277befSVignesh Balasubramanian   ompd_rc_t ret = TValue(context, task_handle->th)
672*b0277befSVignesh Balasubramanian                       .cast("kmp_taskdata_t") // td
673*b0277befSVignesh Balasubramanian                       .access("td_flags")     // td->td_flags
674*b0277befSVignesh Balasubramanian                       .cast("kmp_tasking_flags_t")
675*b0277befSVignesh Balasubramanian                       .check("final", val); // td->td_flags.tasktype
676*b0277befSVignesh Balasubramanian 
677*b0277befSVignesh Balasubramanian   return ret;
678*b0277befSVignesh Balasubramanian }
679*b0277befSVignesh Balasubramanian 
ompd_get_max_active_levels(ompd_task_handle_t * task_handle,ompd_word_t * val)680*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_max_active_levels(
681*b0277befSVignesh Balasubramanian     ompd_task_handle_t *task_handle, /* IN: OpenMP task handle*/
682*b0277befSVignesh Balasubramanian     ompd_word_t *val                 /* OUT: max number of threads */
683*b0277befSVignesh Balasubramanian ) {
684*b0277befSVignesh Balasubramanian   if (!task_handle->ah)
685*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
686*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = task_handle->ah->context;
687*b0277befSVignesh Balasubramanian   if (!context)
688*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
689*b0277befSVignesh Balasubramanian   if (!callbacks) {
690*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
691*b0277befSVignesh Balasubramanian   }
692*b0277befSVignesh Balasubramanian 
693*b0277befSVignesh Balasubramanian   ompd_rc_t ret =
694*b0277befSVignesh Balasubramanian       TValue(context, task_handle->th)
695*b0277befSVignesh Balasubramanian           .cast("kmp_taskdata_t") // td
696*b0277befSVignesh Balasubramanian           .access("td_icvs")      // td->td_icvs
697*b0277befSVignesh Balasubramanian           .cast("kmp_internal_control_t", 0)
698*b0277befSVignesh Balasubramanian           .access("max_active_levels") // td->td_icvs.max_active_levels
699*b0277befSVignesh Balasubramanian           .castBase()
700*b0277befSVignesh Balasubramanian           .getValue(*val);
701*b0277befSVignesh Balasubramanian 
702*b0277befSVignesh Balasubramanian   return ret;
703*b0277befSVignesh Balasubramanian }
704*b0277befSVignesh Balasubramanian 
ompd_get_run_schedule(ompd_task_handle_t * task_handle,const char ** run_sched_string)705*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_run_schedule(
706*b0277befSVignesh Balasubramanian     ompd_task_handle_t *task_handle, /* IN: OpenMP task handle*/
707*b0277befSVignesh Balasubramanian     const char **run_sched_string    /* OUT: Run Schedule String
708*b0277befSVignesh Balasubramanian                                         consisting of kind and modifier */
709*b0277befSVignesh Balasubramanian ) {
710*b0277befSVignesh Balasubramanian   if (!task_handle->ah)
711*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
712*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = task_handle->ah->context;
713*b0277befSVignesh Balasubramanian   if (!context)
714*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
715*b0277befSVignesh Balasubramanian   if (!callbacks) {
716*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
717*b0277befSVignesh Balasubramanian   }
718*b0277befSVignesh Balasubramanian 
719*b0277befSVignesh Balasubramanian   int kind;
720*b0277befSVignesh Balasubramanian 
721*b0277befSVignesh Balasubramanian   TValue sched = TValue(context, task_handle->th)
722*b0277befSVignesh Balasubramanian                      .cast("kmp_taskdata_t") // td
723*b0277befSVignesh Balasubramanian                      .access("td_icvs")      // td->td_icvs
724*b0277befSVignesh Balasubramanian                      .cast("kmp_internal_control_t", 0)
725*b0277befSVignesh Balasubramanian                      .access("sched") // td->td_icvs.sched
726*b0277befSVignesh Balasubramanian                      .cast("kmp_r_sched_t", 0);
727*b0277befSVignesh Balasubramanian 
728*b0277befSVignesh Balasubramanian   ompd_rc_t ret = sched
729*b0277befSVignesh Balasubramanian                       .access("r_sched_type") // td->td_icvs.sched.r_sched_type
730*b0277befSVignesh Balasubramanian                       .castBase()
731*b0277befSVignesh Balasubramanian                       .getValue(kind);
732*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok) {
733*b0277befSVignesh Balasubramanian     return ret;
734*b0277befSVignesh Balasubramanian   }
735*b0277befSVignesh Balasubramanian   int chunk = 0;
736*b0277befSVignesh Balasubramanian   ret = sched
737*b0277befSVignesh Balasubramanian             .access("chunk") // td->td_icvs.sched.chunk
738*b0277befSVignesh Balasubramanian             .castBase()
739*b0277befSVignesh Balasubramanian             .getValue(chunk);
740*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok) {
741*b0277befSVignesh Balasubramanian     return ret;
742*b0277befSVignesh Balasubramanian   }
743*b0277befSVignesh Balasubramanian   char *run_sched_var_string;
744*b0277befSVignesh Balasubramanian   ret = callbacks->alloc_memory(100, (void **)&run_sched_var_string);
745*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok) {
746*b0277befSVignesh Balasubramanian     return ret;
747*b0277befSVignesh Balasubramanian   }
748*b0277befSVignesh Balasubramanian   run_sched_var_string[0] = '\0';
749*b0277befSVignesh Balasubramanian   if (SCHEDULE_HAS_MONOTONIC(kind)) {
750*b0277befSVignesh Balasubramanian     strcpy(run_sched_var_string, "monotonic:");
751*b0277befSVignesh Balasubramanian   } else if (SCHEDULE_HAS_NONMONOTONIC(kind)) {
752*b0277befSVignesh Balasubramanian     strcpy(run_sched_var_string, "nonmonotonic:");
753*b0277befSVignesh Balasubramanian   }
754*b0277befSVignesh Balasubramanian 
755*b0277befSVignesh Balasubramanian   bool static_unchunked = false;
756*b0277befSVignesh Balasubramanian   switch (SCHEDULE_WITHOUT_MODIFIERS(kind)) {
757*b0277befSVignesh Balasubramanian   case kmp_sch_static:
758*b0277befSVignesh Balasubramanian   case kmp_sch_static_greedy:
759*b0277befSVignesh Balasubramanian   case kmp_sch_static_balanced:
760*b0277befSVignesh Balasubramanian     static_unchunked = true;
761*b0277befSVignesh Balasubramanian     strcat(run_sched_var_string, "static");
762*b0277befSVignesh Balasubramanian     break;
763*b0277befSVignesh Balasubramanian   case kmp_sch_static_chunked:
764*b0277befSVignesh Balasubramanian     strcat(run_sched_var_string, "static");
765*b0277befSVignesh Balasubramanian     break;
766*b0277befSVignesh Balasubramanian   case kmp_sch_dynamic_chunked:
767*b0277befSVignesh Balasubramanian     strcat(run_sched_var_string, "dynamic");
768*b0277befSVignesh Balasubramanian     break;
769*b0277befSVignesh Balasubramanian   case kmp_sch_guided_chunked:
770*b0277befSVignesh Balasubramanian   case kmp_sch_guided_iterative_chunked:
771*b0277befSVignesh Balasubramanian   case kmp_sch_guided_analytical_chunked:
772*b0277befSVignesh Balasubramanian     strcat(run_sched_var_string, "guided");
773*b0277befSVignesh Balasubramanian     break;
774*b0277befSVignesh Balasubramanian   case kmp_sch_auto:
775*b0277befSVignesh Balasubramanian     strcat(run_sched_var_string, "auto");
776*b0277befSVignesh Balasubramanian     break;
777*b0277befSVignesh Balasubramanian   case kmp_sch_trapezoidal:
778*b0277befSVignesh Balasubramanian     strcat(run_sched_var_string, "trapezoidal");
779*b0277befSVignesh Balasubramanian     break;
780*b0277befSVignesh Balasubramanian   case kmp_sch_static_steal:
781*b0277befSVignesh Balasubramanian     strcat(run_sched_var_string, "static_steal");
782*b0277befSVignesh Balasubramanian     break;
783*b0277befSVignesh Balasubramanian   default:
784*b0277befSVignesh Balasubramanian     ret = callbacks->free_memory((void *)(run_sched_var_string));
785*b0277befSVignesh Balasubramanian     if (ret != ompd_rc_ok) {
786*b0277befSVignesh Balasubramanian       return ret;
787*b0277befSVignesh Balasubramanian     }
788*b0277befSVignesh Balasubramanian     ret = create_empty_string(run_sched_string);
789*b0277befSVignesh Balasubramanian     return ret;
790*b0277befSVignesh Balasubramanian   }
791*b0277befSVignesh Balasubramanian 
792*b0277befSVignesh Balasubramanian   if (static_unchunked == true) {
793*b0277befSVignesh Balasubramanian     // To be in sync with what OMPT returns.
794*b0277befSVignesh Balasubramanian     // Chunk was not set. Shown with a zero value.
795*b0277befSVignesh Balasubramanian     chunk = 0;
796*b0277befSVignesh Balasubramanian   }
797*b0277befSVignesh Balasubramanian 
798*b0277befSVignesh Balasubramanian   char temp_str[16];
799*b0277befSVignesh Balasubramanian   sprintf(temp_str, ",%d", chunk);
800*b0277befSVignesh Balasubramanian   strcat(run_sched_var_string, temp_str);
801*b0277befSVignesh Balasubramanian   *run_sched_string = run_sched_var_string;
802*b0277befSVignesh Balasubramanian   return ret;
803*b0277befSVignesh Balasubramanian }
804*b0277befSVignesh Balasubramanian 
805*b0277befSVignesh Balasubramanian /* Helper routine for the ompd_get_proc_bind routines */
ompd_get_proc_bind_aux(ompd_task_handle_t * task_handle,uint32_t * used,uint32_t * current_nesting_level,uint32_t * proc_bind)806*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_proc_bind_aux(ompd_task_handle_t *task_handle,
807*b0277befSVignesh Balasubramanian                                         uint32_t *used,
808*b0277befSVignesh Balasubramanian                                         uint32_t *current_nesting_level,
809*b0277befSVignesh Balasubramanian                                         uint32_t *proc_bind) {
810*b0277befSVignesh Balasubramanian   if (!task_handle->ah)
811*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
812*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = task_handle->ah->context;
813*b0277befSVignesh Balasubramanian   if (!context)
814*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
815*b0277befSVignesh Balasubramanian   if (!callbacks) {
816*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
817*b0277befSVignesh Balasubramanian   }
818*b0277befSVignesh Balasubramanian 
819*b0277befSVignesh Balasubramanian   ompd_rc_t ret = TValue(context, "__kmp_nested_proc_bind")
820*b0277befSVignesh Balasubramanian                       .cast("kmp_nested_proc_bind_t")
821*b0277befSVignesh Balasubramanian                       .access("used")
822*b0277befSVignesh Balasubramanian                       .castBase(ompd_type_int)
823*b0277befSVignesh Balasubramanian                       .getValue(*used);
824*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
825*b0277befSVignesh Balasubramanian     return ret;
826*b0277befSVignesh Balasubramanian 
827*b0277befSVignesh Balasubramanian   TValue taskdata = TValue(context, task_handle->th) /* td */
828*b0277befSVignesh Balasubramanian                         .cast("kmp_taskdata_t");
829*b0277befSVignesh Balasubramanian 
830*b0277befSVignesh Balasubramanian   ret = taskdata
831*b0277befSVignesh Balasubramanian             .access("td_team") /* td->td_team*/
832*b0277befSVignesh Balasubramanian             .cast("kmp_team_p", 1)
833*b0277befSVignesh Balasubramanian             .access("t")                /* td->td_team->t*/
834*b0277befSVignesh Balasubramanian             .cast("kmp_base_team_t", 0) /*t*/
835*b0277befSVignesh Balasubramanian             .access("t_level")          /*t.t_level*/
836*b0277befSVignesh Balasubramanian             .castBase(ompd_type_int)
837*b0277befSVignesh Balasubramanian             .getValue(*current_nesting_level);
838*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
839*b0277befSVignesh Balasubramanian     return ret;
840*b0277befSVignesh Balasubramanian 
841*b0277befSVignesh Balasubramanian   ret = taskdata
842*b0277befSVignesh Balasubramanian             .access("td_icvs") /* td->td_icvs */
843*b0277befSVignesh Balasubramanian             .cast("kmp_internal_control_t", 0)
844*b0277befSVignesh Balasubramanian             .access("proc_bind") /* td->td_icvs.proc_bind */
845*b0277befSVignesh Balasubramanian             .castBase()
846*b0277befSVignesh Balasubramanian             .getValue(*proc_bind);
847*b0277befSVignesh Balasubramanian   return ret;
848*b0277befSVignesh Balasubramanian }
849*b0277befSVignesh Balasubramanian 
850*b0277befSVignesh Balasubramanian static ompd_rc_t
ompd_get_proc_bind(ompd_task_handle_t * task_handle,ompd_word_t * bind)851*b0277befSVignesh Balasubramanian ompd_get_proc_bind(ompd_task_handle_t *task_handle, /* IN: OpenMP task handle */
852*b0277befSVignesh Balasubramanian                    ompd_word_t *bind /* OUT: Kind of proc-binding */
853*b0277befSVignesh Balasubramanian ) {
854*b0277befSVignesh Balasubramanian   uint32_t used;
855*b0277befSVignesh Balasubramanian   uint32_t proc_bind;
856*b0277befSVignesh Balasubramanian   uint32_t current_nesting_level;
857*b0277befSVignesh Balasubramanian 
858*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
859*b0277befSVignesh Balasubramanian   ret = ompd_get_proc_bind_aux(task_handle, &used, &current_nesting_level,
860*b0277befSVignesh Balasubramanian                                &proc_bind);
861*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
862*b0277befSVignesh Balasubramanian     return ret;
863*b0277befSVignesh Balasubramanian 
864*b0277befSVignesh Balasubramanian   *bind = proc_bind;
865*b0277befSVignesh Balasubramanian   /* If bind-var is a list with more than one element, then the value of
866*b0277befSVignesh Balasubramanian      this ICV cannot be represented by an integer type. In this case,
867*b0277befSVignesh Balasubramanian      ompd_rc_incomplete is returned. The tool can check the return value and
868*b0277befSVignesh Balasubramanian      can choose to invoke ompd_get_icv_string_from_scope() if needed. */
869*b0277befSVignesh Balasubramanian   if (current_nesting_level < used - 1) {
870*b0277befSVignesh Balasubramanian     return ompd_rc_incomplete;
871*b0277befSVignesh Balasubramanian   }
872*b0277befSVignesh Balasubramanian   return ompd_rc_ok;
873*b0277befSVignesh Balasubramanian }
874*b0277befSVignesh Balasubramanian 
ompd_get_proc_bind(ompd_task_handle_t * task_handle,const char ** proc_bind_list_string)875*b0277befSVignesh Balasubramanian static ompd_rc_t ompd_get_proc_bind(
876*b0277befSVignesh Balasubramanian     ompd_task_handle_t *task_handle,   /* IN: OpenMP task handle */
877*b0277befSVignesh Balasubramanian     const char **proc_bind_list_string /* OUT: string list of comma separated
878*b0277befSVignesh Balasubramanian                                           bind-var values */
879*b0277befSVignesh Balasubramanian ) {
880*b0277befSVignesh Balasubramanian   uint32_t used;
881*b0277befSVignesh Balasubramanian   uint32_t proc_bind;
882*b0277befSVignesh Balasubramanian   uint32_t current_nesting_level;
883*b0277befSVignesh Balasubramanian 
884*b0277befSVignesh Balasubramanian   ompd_rc_t ret;
885*b0277befSVignesh Balasubramanian   ret = ompd_get_proc_bind_aux(task_handle, &used, &current_nesting_level,
886*b0277befSVignesh Balasubramanian                                &proc_bind);
887*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
888*b0277befSVignesh Balasubramanian     return ret;
889*b0277befSVignesh Balasubramanian 
890*b0277befSVignesh Balasubramanian   uint32_t num_list_elems;
891*b0277befSVignesh Balasubramanian   if (used == 0 || current_nesting_level >= used) {
892*b0277befSVignesh Balasubramanian     num_list_elems = 1;
893*b0277befSVignesh Balasubramanian   } else {
894*b0277befSVignesh Balasubramanian     num_list_elems = used - current_nesting_level;
895*b0277befSVignesh Balasubramanian   }
896*b0277befSVignesh Balasubramanian   size_t buffer_size = 16 /* digits per element including the comma separator */
897*b0277befSVignesh Balasubramanian                            * num_list_elems +
898*b0277befSVignesh Balasubramanian                        1; /* string terminator NULL */
899*b0277befSVignesh Balasubramanian   char *proc_bind_list_str;
900*b0277befSVignesh Balasubramanian   ret = callbacks->alloc_memory(buffer_size, (void **)&proc_bind_list_str);
901*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
902*b0277befSVignesh Balasubramanian     return ret;
903*b0277befSVignesh Balasubramanian 
904*b0277befSVignesh Balasubramanian   /* The bind-var list would be:
905*b0277befSVignesh Balasubramanian   [td->td_icvs.proc_bind,
906*b0277befSVignesh Balasubramanian    __kmp_nested_proc_bind.bind_types[current_nesting_level + 1],
907*b0277befSVignesh Balasubramanian    __kmp_nested_proc_bind.bind_types[current_nesting_level + 2],
908*b0277befSVignesh Balasubramanian     …,
909*b0277befSVignesh Balasubramanian    __kmp_nested_proc_bind.bind_types[used - 1]]*/
910*b0277befSVignesh Balasubramanian 
911*b0277befSVignesh Balasubramanian   sprintf(proc_bind_list_str, "%d", proc_bind);
912*b0277befSVignesh Balasubramanian   *proc_bind_list_string = proc_bind_list_str;
913*b0277befSVignesh Balasubramanian   if (num_list_elems == 1) {
914*b0277befSVignesh Balasubramanian     return ompd_rc_ok;
915*b0277befSVignesh Balasubramanian   }
916*b0277befSVignesh Balasubramanian 
917*b0277befSVignesh Balasubramanian   char temp_value[16];
918*b0277befSVignesh Balasubramanian   uint32_t bind_types_value;
919*b0277befSVignesh Balasubramanian 
920*b0277befSVignesh Balasubramanian   for (current_nesting_level++; /* the list element for this nesting
921*b0277befSVignesh Balasubramanian                                    level has already been accounted for
922*b0277befSVignesh Balasubramanian                                    by proc_bind */
923*b0277befSVignesh Balasubramanian        current_nesting_level < used; current_nesting_level++) {
924*b0277befSVignesh Balasubramanian 
925*b0277befSVignesh Balasubramanian     ret = TValue(task_handle->ah->context, "__kmp_nested_proc_bind")
926*b0277befSVignesh Balasubramanian               .cast("kmp_nested_proc_bind_t")
927*b0277befSVignesh Balasubramanian               .access("bind_types")
928*b0277befSVignesh Balasubramanian               .cast("int", 1)
929*b0277befSVignesh Balasubramanian               .getArrayElement(current_nesting_level)
930*b0277befSVignesh Balasubramanian               .castBase(ompd_type_int)
931*b0277befSVignesh Balasubramanian               .getValue(bind_types_value);
932*b0277befSVignesh Balasubramanian 
933*b0277befSVignesh Balasubramanian     if (ret != ompd_rc_ok)
934*b0277befSVignesh Balasubramanian       return ret;
935*b0277befSVignesh Balasubramanian 
936*b0277befSVignesh Balasubramanian     sprintf(temp_value, ",%d", bind_types_value);
937*b0277befSVignesh Balasubramanian     strcat(proc_bind_list_str, temp_value);
938*b0277befSVignesh Balasubramanian   }
939*b0277befSVignesh Balasubramanian 
940*b0277befSVignesh Balasubramanian   return ompd_rc_ok;
941*b0277befSVignesh Balasubramanian }
942*b0277befSVignesh Balasubramanian 
943*b0277befSVignesh Balasubramanian static ompd_rc_t
ompd_is_implicit(ompd_task_handle_t * task_handle,ompd_word_t * val)944*b0277befSVignesh Balasubramanian ompd_is_implicit(ompd_task_handle_t *task_handle, /* IN: OpenMP task handle*/
945*b0277befSVignesh Balasubramanian                  ompd_word_t *val /* OUT: max number of threads */
946*b0277befSVignesh Balasubramanian ) {
947*b0277befSVignesh Balasubramanian   if (!task_handle)
948*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
949*b0277befSVignesh Balasubramanian   if (!task_handle->ah)
950*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
951*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = task_handle->ah->context;
952*b0277befSVignesh Balasubramanian   if (!context)
953*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
954*b0277befSVignesh Balasubramanian   if (!callbacks) {
955*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
956*b0277befSVignesh Balasubramanian   }
957*b0277befSVignesh Balasubramanian 
958*b0277befSVignesh Balasubramanian   ompd_rc_t ret = TValue(context, task_handle->th)
959*b0277befSVignesh Balasubramanian                       .cast("kmp_taskdata_t") // td
960*b0277befSVignesh Balasubramanian                       .access("td_flags")     // td->td_flags
961*b0277befSVignesh Balasubramanian                       .cast("kmp_tasking_flags_t")
962*b0277befSVignesh Balasubramanian                       .check("tasktype", val); // td->td_flags.tasktype
963*b0277befSVignesh Balasubramanian   *val ^= 1; // tasktype: explicit = 1, implicit = 0 => invert the value
964*b0277befSVignesh Balasubramanian   return ret;
965*b0277befSVignesh Balasubramanian }
966*b0277befSVignesh Balasubramanian 
ompd_get_num_threads(ompd_parallel_handle_t * parallel_handle,ompd_word_t * val)967*b0277befSVignesh Balasubramanian ompd_rc_t ompd_get_num_threads(
968*b0277befSVignesh Balasubramanian     ompd_parallel_handle_t *parallel_handle, /* IN: OpenMP parallel handle */
969*b0277befSVignesh Balasubramanian     ompd_word_t *val                         /* OUT: number of threads */
970*b0277befSVignesh Balasubramanian ) {
971*b0277befSVignesh Balasubramanian   if (!parallel_handle->ah)
972*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
973*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = parallel_handle->ah->context;
974*b0277befSVignesh Balasubramanian   if (!context)
975*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
976*b0277befSVignesh Balasubramanian   if (!callbacks) {
977*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
978*b0277befSVignesh Balasubramanian   }
979*b0277befSVignesh Balasubramanian 
980*b0277befSVignesh Balasubramanian   ompd_rc_t ret = ompd_rc_ok;
981*b0277befSVignesh Balasubramanian   if (parallel_handle->lwt.address != 0) {
982*b0277befSVignesh Balasubramanian     *val = 1;
983*b0277befSVignesh Balasubramanian   } else {
984*b0277befSVignesh Balasubramanian     uint32_t res;
985*b0277befSVignesh Balasubramanian     ret = TValue(context, parallel_handle->th)
986*b0277befSVignesh Balasubramanian               .cast("kmp_base_team_t", 0) /*t*/
987*b0277befSVignesh Balasubramanian               .access("t_nproc")          /*t.t_nproc*/
988*b0277befSVignesh Balasubramanian               .castBase()
989*b0277befSVignesh Balasubramanian               .getValue(res);
990*b0277befSVignesh Balasubramanian     *val = res;
991*b0277befSVignesh Balasubramanian   }
992*b0277befSVignesh Balasubramanian   return ret;
993*b0277befSVignesh Balasubramanian }
994*b0277befSVignesh Balasubramanian 
ompd_get_icv_from_scope(void * handle,ompd_scope_t scope,ompd_icv_id_t icv_id,ompd_word_t * icv_value)995*b0277befSVignesh Balasubramanian ompd_rc_t ompd_get_icv_from_scope(void *handle, ompd_scope_t scope,
996*b0277befSVignesh Balasubramanian                                   ompd_icv_id_t icv_id,
997*b0277befSVignesh Balasubramanian                                   ompd_word_t *icv_value) {
998*b0277befSVignesh Balasubramanian   if (!handle) {
999*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
1000*b0277befSVignesh Balasubramanian   }
1001*b0277befSVignesh Balasubramanian   if (icv_id >= ompd_icv_after_last_icv || icv_id == 0) {
1002*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
1003*b0277befSVignesh Balasubramanian   }
1004*b0277befSVignesh Balasubramanian   if (scope != ompd_icv_scope_values[icv_id]) {
1005*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
1006*b0277befSVignesh Balasubramanian   }
1007*b0277befSVignesh Balasubramanian 
1008*b0277befSVignesh Balasubramanian   ompd_device_t device_kind;
1009*b0277befSVignesh Balasubramanian 
1010*b0277befSVignesh Balasubramanian   switch (scope) {
1011*b0277befSVignesh Balasubramanian   case ompd_scope_thread:
1012*b0277befSVignesh Balasubramanian     device_kind = ((ompd_thread_handle_t *)handle)->ah->kind;
1013*b0277befSVignesh Balasubramanian     break;
1014*b0277befSVignesh Balasubramanian   case ompd_scope_parallel:
1015*b0277befSVignesh Balasubramanian     device_kind = ((ompd_parallel_handle_t *)handle)->ah->kind;
1016*b0277befSVignesh Balasubramanian     break;
1017*b0277befSVignesh Balasubramanian   case ompd_scope_address_space:
1018*b0277befSVignesh Balasubramanian     device_kind = ((ompd_address_space_handle_t *)handle)->kind;
1019*b0277befSVignesh Balasubramanian     break;
1020*b0277befSVignesh Balasubramanian   case ompd_scope_task:
1021*b0277befSVignesh Balasubramanian     device_kind = ((ompd_task_handle_t *)handle)->ah->kind;
1022*b0277befSVignesh Balasubramanian     break;
1023*b0277befSVignesh Balasubramanian   default:
1024*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
1025*b0277befSVignesh Balasubramanian   }
1026*b0277befSVignesh Balasubramanian 
1027*b0277befSVignesh Balasubramanian   if (device_kind == OMPD_DEVICE_KIND_HOST) {
1028*b0277befSVignesh Balasubramanian     switch (icv_id) {
1029*b0277befSVignesh Balasubramanian     case ompd_icv_dyn_var:
1030*b0277befSVignesh Balasubramanian       return ompd_get_dynamic((ompd_thread_handle_t *)handle, icv_value);
1031*b0277befSVignesh Balasubramanian     case ompd_icv_run_sched_var:
1032*b0277befSVignesh Balasubramanian       return ompd_rc_incompatible;
1033*b0277befSVignesh Balasubramanian     case ompd_icv_stacksize_var:
1034*b0277befSVignesh Balasubramanian       return ompd_get_stacksize((ompd_address_space_handle_t *)handle,
1035*b0277befSVignesh Balasubramanian                                 icv_value);
1036*b0277befSVignesh Balasubramanian     case ompd_icv_cancel_var:
1037*b0277befSVignesh Balasubramanian       return ompd_get_cancellation((ompd_address_space_handle_t *)handle,
1038*b0277befSVignesh Balasubramanian                                    icv_value);
1039*b0277befSVignesh Balasubramanian     case ompd_icv_max_task_priority_var:
1040*b0277befSVignesh Balasubramanian       return ompd_get_max_task_priority((ompd_address_space_handle_t *)handle,
1041*b0277befSVignesh Balasubramanian                                         icv_value);
1042*b0277befSVignesh Balasubramanian     case ompd_icv_debug_var:
1043*b0277befSVignesh Balasubramanian       return ompd_get_debug((ompd_address_space_handle_t *)handle, icv_value);
1044*b0277befSVignesh Balasubramanian     case ompd_icv_nthreads_var:
1045*b0277befSVignesh Balasubramanian       return ompd_get_nthreads((ompd_thread_handle_t *)handle, icv_value);
1046*b0277befSVignesh Balasubramanian     case ompd_icv_display_affinity_var:
1047*b0277befSVignesh Balasubramanian       return ompd_get_display_affinity((ompd_address_space_handle_t *)handle,
1048*b0277befSVignesh Balasubramanian                                        icv_value);
1049*b0277befSVignesh Balasubramanian     case ompd_icv_affinity_format_var:
1050*b0277befSVignesh Balasubramanian       return ompd_rc_incompatible;
1051*b0277befSVignesh Balasubramanian     case ompd_icv_tool_libraries_var:
1052*b0277befSVignesh Balasubramanian       return ompd_rc_incompatible;
1053*b0277befSVignesh Balasubramanian     case ompd_icv_default_device_var:
1054*b0277befSVignesh Balasubramanian       return ompd_get_default_device((ompd_thread_handle_t *)handle, icv_value);
1055*b0277befSVignesh Balasubramanian     case ompd_icv_tool_var:
1056*b0277befSVignesh Balasubramanian       return ompd_get_tool((ompd_address_space_handle_t *)handle, icv_value);
1057*b0277befSVignesh Balasubramanian     case ompd_icv_tool_verbose_init_var:
1058*b0277befSVignesh Balasubramanian       return ompd_rc_incompatible;
1059*b0277befSVignesh Balasubramanian     case ompd_icv_levels_var:
1060*b0277befSVignesh Balasubramanian       return ompd_get_level((ompd_parallel_handle_t *)handle, icv_value);
1061*b0277befSVignesh Balasubramanian     case ompd_icv_active_levels_var:
1062*b0277befSVignesh Balasubramanian       return ompd_get_active_level((ompd_parallel_handle_t *)handle, icv_value);
1063*b0277befSVignesh Balasubramanian     case ompd_icv_thread_limit_var:
1064*b0277befSVignesh Balasubramanian       return ompd_get_thread_limit((ompd_task_handle_t *)handle, icv_value);
1065*b0277befSVignesh Balasubramanian     case ompd_icv_max_active_levels_var:
1066*b0277befSVignesh Balasubramanian       return ompd_get_max_active_levels((ompd_task_handle_t *)handle,
1067*b0277befSVignesh Balasubramanian                                         icv_value);
1068*b0277befSVignesh Balasubramanian     case ompd_icv_bind_var:
1069*b0277befSVignesh Balasubramanian       return ompd_get_proc_bind((ompd_task_handle_t *)handle, icv_value);
1070*b0277befSVignesh Balasubramanian     case ompd_icv_num_procs_var:
1071*b0277befSVignesh Balasubramanian     case ompd_icv_ompd_num_procs_var:
1072*b0277befSVignesh Balasubramanian       return ompd_get_num_procs((ompd_address_space_handle_t *)handle,
1073*b0277befSVignesh Balasubramanian                                 icv_value);
1074*b0277befSVignesh Balasubramanian     case ompd_icv_thread_num_var:
1075*b0277befSVignesh Balasubramanian     case ompd_icv_ompd_thread_num_var:
1076*b0277befSVignesh Balasubramanian       return ompd_get_thread_num((ompd_thread_handle_t *)handle, icv_value);
1077*b0277befSVignesh Balasubramanian     case ompd_icv_final_var:
1078*b0277befSVignesh Balasubramanian     case ompd_icv_ompd_final_var:
1079*b0277befSVignesh Balasubramanian     case ompd_icv_ompd_final_task_var:
1080*b0277befSVignesh Balasubramanian       return ompd_in_final((ompd_task_handle_t *)handle, icv_value);
1081*b0277befSVignesh Balasubramanian     case ompd_icv_implicit_var:
1082*b0277befSVignesh Balasubramanian     case ompd_icv_ompd_implicit_var:
1083*b0277befSVignesh Balasubramanian     case ompd_icv_ompd_implicit_task_var:
1084*b0277befSVignesh Balasubramanian       return ompd_is_implicit((ompd_task_handle_t *)handle, icv_value);
1085*b0277befSVignesh Balasubramanian     case ompd_icv_team_size_var:
1086*b0277befSVignesh Balasubramanian     case ompd_icv_ompd_team_size_var:
1087*b0277befSVignesh Balasubramanian       return ompd_get_num_threads((ompd_parallel_handle_t *)handle, icv_value);
1088*b0277befSVignesh Balasubramanian     default:
1089*b0277befSVignesh Balasubramanian       return ompd_rc_unsupported;
1090*b0277befSVignesh Balasubramanian     }
1091*b0277befSVignesh Balasubramanian   }
1092*b0277befSVignesh Balasubramanian   return ompd_rc_unsupported;
1093*b0277befSVignesh Balasubramanian }
1094*b0277befSVignesh Balasubramanian 
ompd_get_icv_string_from_scope(void * handle,ompd_scope_t scope,ompd_icv_id_t icv_id,const char ** icv_string)1095*b0277befSVignesh Balasubramanian ompd_rc_t ompd_get_icv_string_from_scope(void *handle, ompd_scope_t scope,
1096*b0277befSVignesh Balasubramanian                                          ompd_icv_id_t icv_id,
1097*b0277befSVignesh Balasubramanian                                          const char **icv_string) {
1098*b0277befSVignesh Balasubramanian   if (!handle) {
1099*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
1100*b0277befSVignesh Balasubramanian   }
1101*b0277befSVignesh Balasubramanian   if (icv_id >= ompd_icv_after_last_icv || icv_id == 0) {
1102*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
1103*b0277befSVignesh Balasubramanian   }
1104*b0277befSVignesh Balasubramanian   if (scope != ompd_icv_scope_values[icv_id]) {
1105*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
1106*b0277befSVignesh Balasubramanian   }
1107*b0277befSVignesh Balasubramanian 
1108*b0277befSVignesh Balasubramanian   ompd_device_t device_kind;
1109*b0277befSVignesh Balasubramanian 
1110*b0277befSVignesh Balasubramanian   switch (scope) {
1111*b0277befSVignesh Balasubramanian   case ompd_scope_thread:
1112*b0277befSVignesh Balasubramanian     device_kind = ((ompd_thread_handle_t *)handle)->ah->kind;
1113*b0277befSVignesh Balasubramanian     break;
1114*b0277befSVignesh Balasubramanian   case ompd_scope_parallel:
1115*b0277befSVignesh Balasubramanian     device_kind = ((ompd_parallel_handle_t *)handle)->ah->kind;
1116*b0277befSVignesh Balasubramanian     break;
1117*b0277befSVignesh Balasubramanian   case ompd_scope_address_space:
1118*b0277befSVignesh Balasubramanian     device_kind = ((ompd_address_space_handle_t *)handle)->kind;
1119*b0277befSVignesh Balasubramanian     break;
1120*b0277befSVignesh Balasubramanian   case ompd_scope_task:
1121*b0277befSVignesh Balasubramanian     device_kind = ((ompd_task_handle_t *)handle)->ah->kind;
1122*b0277befSVignesh Balasubramanian     break;
1123*b0277befSVignesh Balasubramanian   default:
1124*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
1125*b0277befSVignesh Balasubramanian   }
1126*b0277befSVignesh Balasubramanian 
1127*b0277befSVignesh Balasubramanian   if (device_kind == OMPD_DEVICE_KIND_HOST) {
1128*b0277befSVignesh Balasubramanian     switch (icv_id) {
1129*b0277befSVignesh Balasubramanian     case ompd_icv_run_sched_var:
1130*b0277befSVignesh Balasubramanian       return ompd_get_run_schedule((ompd_task_handle_t *)handle, icv_string);
1131*b0277befSVignesh Balasubramanian     case ompd_icv_nthreads_var:
1132*b0277befSVignesh Balasubramanian       return ompd_get_nthreads((ompd_thread_handle_t *)handle, icv_string);
1133*b0277befSVignesh Balasubramanian     case ompd_icv_bind_var:
1134*b0277befSVignesh Balasubramanian       return ompd_get_proc_bind((ompd_task_handle_t *)handle, icv_string);
1135*b0277befSVignesh Balasubramanian     case ompd_icv_affinity_format_var:
1136*b0277befSVignesh Balasubramanian       return ompd_get_affinity_format((ompd_address_space_handle_t *)handle,
1137*b0277befSVignesh Balasubramanian                                       icv_string);
1138*b0277befSVignesh Balasubramanian     case ompd_icv_tool_libraries_var:
1139*b0277befSVignesh Balasubramanian       return ompd_get_tool_libraries((ompd_address_space_handle_t *)handle,
1140*b0277befSVignesh Balasubramanian                                      icv_string);
1141*b0277befSVignesh Balasubramanian     case ompd_icv_tool_verbose_init_var:
1142*b0277befSVignesh Balasubramanian       return ompd_get_tool_verbose_init((ompd_address_space_handle_t *)handle,
1143*b0277befSVignesh Balasubramanian                                         icv_string);
1144*b0277befSVignesh Balasubramanian     default:
1145*b0277befSVignesh Balasubramanian       return ompd_rc_unsupported;
1146*b0277befSVignesh Balasubramanian     }
1147*b0277befSVignesh Balasubramanian   }
1148*b0277befSVignesh Balasubramanian   return ompd_rc_unsupported;
1149*b0277befSVignesh Balasubramanian }
1150*b0277befSVignesh Balasubramanian 
__ompd_get_tool_data(TValue & dataValue,ompd_word_t * value,ompd_address_t * ptr)1151*b0277befSVignesh Balasubramanian static ompd_rc_t __ompd_get_tool_data(TValue &dataValue, ompd_word_t *value,
1152*b0277befSVignesh Balasubramanian                                       ompd_address_t *ptr) {
1153*b0277befSVignesh Balasubramanian   ompd_rc_t ret = dataValue.getError();
1154*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
1155*b0277befSVignesh Balasubramanian     return ret;
1156*b0277befSVignesh Balasubramanian   ret = dataValue.access("value").castBase().getValue(*value);
1157*b0277befSVignesh Balasubramanian   if (ret != ompd_rc_ok)
1158*b0277befSVignesh Balasubramanian     return ret;
1159*b0277befSVignesh Balasubramanian   ptr->segment = OMPD_SEGMENT_UNSPECIFIED;
1160*b0277befSVignesh Balasubramanian   ret = dataValue.access("ptr").castBase().getValue(ptr->address);
1161*b0277befSVignesh Balasubramanian   return ret;
1162*b0277befSVignesh Balasubramanian }
1163*b0277befSVignesh Balasubramanian 
ompd_get_task_data(ompd_task_handle_t * task_handle,ompd_word_t * value,ompd_address_t * ptr)1164*b0277befSVignesh Balasubramanian ompd_rc_t ompd_get_task_data(ompd_task_handle_t *task_handle,
1165*b0277befSVignesh Balasubramanian                              ompd_word_t *value, ompd_address_t *ptr) {
1166*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = task_handle->ah->context;
1167*b0277befSVignesh Balasubramanian   if (!context)
1168*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
1169*b0277befSVignesh Balasubramanian   if (!callbacks) {
1170*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
1171*b0277befSVignesh Balasubramanian   }
1172*b0277befSVignesh Balasubramanian 
1173*b0277befSVignesh Balasubramanian   TValue dataValue;
1174*b0277befSVignesh Balasubramanian   if (task_handle->lwt.address) {
1175*b0277befSVignesh Balasubramanian     dataValue = TValue(context, task_handle->lwt)
1176*b0277befSVignesh Balasubramanian                     .cast("ompt_lw_taskteam_t") /*lwt*/
1177*b0277befSVignesh Balasubramanian                     .access("ompt_task_info")   // lwt->ompt_task_info
1178*b0277befSVignesh Balasubramanian                     .cast("ompt_task_info_t")
1179*b0277befSVignesh Balasubramanian                     .access("task_data") // lwt->ompd_task_info.task_data
1180*b0277befSVignesh Balasubramanian                     .cast("ompt_data_t");
1181*b0277befSVignesh Balasubramanian   } else {
1182*b0277befSVignesh Balasubramanian     dataValue = TValue(context, task_handle->th)
1183*b0277befSVignesh Balasubramanian                     .cast("kmp_taskdata_t")   /*td*/
1184*b0277befSVignesh Balasubramanian                     .access("ompt_task_info") // td->ompt_task_info
1185*b0277befSVignesh Balasubramanian                     .cast("ompt_task_info_t")
1186*b0277befSVignesh Balasubramanian                     .access("task_data") // td->ompd_task_info.task_data
1187*b0277befSVignesh Balasubramanian                     .cast("ompt_data_t");
1188*b0277befSVignesh Balasubramanian   }
1189*b0277befSVignesh Balasubramanian   return __ompd_get_tool_data(dataValue, value, ptr);
1190*b0277befSVignesh Balasubramanian }
1191*b0277befSVignesh Balasubramanian 
ompd_get_parallel_data(ompd_parallel_handle_t * parallel_handle,ompd_word_t * value,ompd_address_t * ptr)1192*b0277befSVignesh Balasubramanian ompd_rc_t ompd_get_parallel_data(ompd_parallel_handle_t *parallel_handle,
1193*b0277befSVignesh Balasubramanian                                  ompd_word_t *value, ompd_address_t *ptr) {
1194*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = parallel_handle->ah->context;
1195*b0277befSVignesh Balasubramanian   if (!context)
1196*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
1197*b0277befSVignesh Balasubramanian   if (!callbacks) {
1198*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
1199*b0277befSVignesh Balasubramanian   }
1200*b0277befSVignesh Balasubramanian 
1201*b0277befSVignesh Balasubramanian   TValue dataValue;
1202*b0277befSVignesh Balasubramanian   if (parallel_handle->lwt.address) {
1203*b0277befSVignesh Balasubramanian     dataValue =
1204*b0277befSVignesh Balasubramanian         TValue(context, parallel_handle->lwt)
1205*b0277befSVignesh Balasubramanian             .cast("ompt_lw_taskteam_t") /*lwt*/
1206*b0277befSVignesh Balasubramanian             .access("ompt_team_info")   // lwt->ompt_team_info
1207*b0277befSVignesh Balasubramanian             .cast("ompt_team_info_t")
1208*b0277befSVignesh Balasubramanian             .access("parallel_data") // lwt->ompt_team_info.parallel_data
1209*b0277befSVignesh Balasubramanian             .cast("ompt_data_t");
1210*b0277befSVignesh Balasubramanian   } else {
1211*b0277befSVignesh Balasubramanian     dataValue = TValue(context, parallel_handle->th)
1212*b0277befSVignesh Balasubramanian                     .cast("kmp_base_team_t")  /*t*/
1213*b0277befSVignesh Balasubramanian                     .access("ompt_team_info") // t->ompt_team_info
1214*b0277befSVignesh Balasubramanian                     .cast("ompt_team_info_t")
1215*b0277befSVignesh Balasubramanian                     .access("parallel_data") // t->ompt_team_info.parallel_data
1216*b0277befSVignesh Balasubramanian                     .cast("ompt_data_t");
1217*b0277befSVignesh Balasubramanian   }
1218*b0277befSVignesh Balasubramanian   return __ompd_get_tool_data(dataValue, value, ptr);
1219*b0277befSVignesh Balasubramanian }
1220*b0277befSVignesh Balasubramanian 
ompd_get_thread_data(ompd_thread_handle_t * thread_handle,ompd_word_t * value,ompd_address_t * ptr)1221*b0277befSVignesh Balasubramanian ompd_rc_t ompd_get_thread_data(ompd_thread_handle_t *thread_handle,
1222*b0277befSVignesh Balasubramanian                                ompd_word_t *value, ompd_address_t *ptr) {
1223*b0277befSVignesh Balasubramanian   ompd_address_space_context_t *context = thread_handle->ah->context;
1224*b0277befSVignesh Balasubramanian   if (!context)
1225*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
1226*b0277befSVignesh Balasubramanian   if (!callbacks) {
1227*b0277befSVignesh Balasubramanian     return ompd_rc_callback_error;
1228*b0277befSVignesh Balasubramanian   }
1229*b0277befSVignesh Balasubramanian 
1230*b0277befSVignesh Balasubramanian   TValue dataValue =
1231*b0277befSVignesh Balasubramanian       TValue(context, thread_handle->th)
1232*b0277befSVignesh Balasubramanian           .cast("kmp_base_info_t")    /*th*/
1233*b0277befSVignesh Balasubramanian           .access("ompt_thread_info") // th->ompt_thread_info
1234*b0277befSVignesh Balasubramanian           .cast("ompt_thread_info_t")
1235*b0277befSVignesh Balasubramanian           .access("thread_data") // th->ompt_thread_info.thread_data
1236*b0277befSVignesh Balasubramanian           .cast("ompt_data_t");
1237*b0277befSVignesh Balasubramanian   return __ompd_get_tool_data(dataValue, value, ptr);
1238*b0277befSVignesh Balasubramanian }
1239*b0277befSVignesh Balasubramanian 
ompd_get_tool_data(void * handle,ompd_scope_t scope,ompd_word_t * value,ompd_address_t * ptr)1240*b0277befSVignesh Balasubramanian ompd_rc_t ompd_get_tool_data(void *handle, ompd_scope_t scope,
1241*b0277befSVignesh Balasubramanian                              ompd_word_t *value, ompd_address_t *ptr) {
1242*b0277befSVignesh Balasubramanian   if (!handle) {
1243*b0277befSVignesh Balasubramanian     return ompd_rc_stale_handle;
1244*b0277befSVignesh Balasubramanian   }
1245*b0277befSVignesh Balasubramanian 
1246*b0277befSVignesh Balasubramanian   ompd_device_t device_kind;
1247*b0277befSVignesh Balasubramanian 
1248*b0277befSVignesh Balasubramanian   switch (scope) {
1249*b0277befSVignesh Balasubramanian   case ompd_scope_thread:
1250*b0277befSVignesh Balasubramanian     device_kind = ((ompd_thread_handle_t *)handle)->ah->kind;
1251*b0277befSVignesh Balasubramanian     break;
1252*b0277befSVignesh Balasubramanian   case ompd_scope_parallel:
1253*b0277befSVignesh Balasubramanian     device_kind = ((ompd_parallel_handle_t *)handle)->ah->kind;
1254*b0277befSVignesh Balasubramanian     break;
1255*b0277befSVignesh Balasubramanian   case ompd_scope_task:
1256*b0277befSVignesh Balasubramanian     device_kind = ((ompd_task_handle_t *)handle)->ah->kind;
1257*b0277befSVignesh Balasubramanian     break;
1258*b0277befSVignesh Balasubramanian   default:
1259*b0277befSVignesh Balasubramanian     return ompd_rc_bad_input;
1260*b0277befSVignesh Balasubramanian   }
1261*b0277befSVignesh Balasubramanian 
1262*b0277befSVignesh Balasubramanian   if (device_kind == OMPD_DEVICE_KIND_HOST) {
1263*b0277befSVignesh Balasubramanian     switch (scope) {
1264*b0277befSVignesh Balasubramanian     case ompd_scope_thread:
1265*b0277befSVignesh Balasubramanian       return ompd_get_thread_data((ompd_thread_handle_t *)handle, value, ptr);
1266*b0277befSVignesh Balasubramanian     case ompd_scope_parallel:
1267*b0277befSVignesh Balasubramanian       return ompd_get_parallel_data((ompd_parallel_handle_t *)handle, value,
1268*b0277befSVignesh Balasubramanian                                     ptr);
1269*b0277befSVignesh Balasubramanian     case ompd_scope_task:
1270*b0277befSVignesh Balasubramanian       return ompd_get_task_data((ompd_task_handle_t *)handle, value, ptr);
1271*b0277befSVignesh Balasubramanian     default:
1272*b0277befSVignesh Balasubramanian       return ompd_rc_unsupported;
1273*b0277befSVignesh Balasubramanian     }
1274*b0277befSVignesh Balasubramanian   }
1275*b0277befSVignesh Balasubramanian   return ompd_rc_unsupported;
1276*b0277befSVignesh Balasubramanian }
1277