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