xref: /llvm-project/openmp/libompd/src/omp-debug.cpp (revision 62fddd5ff5cdd5d66a58a01c46dc58c8ca9cd62e)
1*62fddd5fSVignesh Balu /*
2*62fddd5fSVignesh Balu  * omp-debug.cpp
3*62fddd5fSVignesh Balu  *
4*62fddd5fSVignesh Balu  *  Created on: Jan 14, 2015
5*62fddd5fSVignesh Balu  *      Author: Ignacio Laguna
6*62fddd5fSVignesh Balu  *              Joachim Protze
7*62fddd5fSVignesh Balu  *     Contact: ilaguna@llnl.gov
8*62fddd5fSVignesh Balu  *              protze@llnl.gov
9*62fddd5fSVignesh Balu  */
10*62fddd5fSVignesh Balu /*******************************************************************************
11*62fddd5fSVignesh Balu  * This implements an OMPD DLL for the LLVM OpenMP runtime library.
12*62fddd5fSVignesh Balu  */
13*62fddd5fSVignesh Balu 
14*62fddd5fSVignesh Balu //===----------------------------------------------------------------------===//
15*62fddd5fSVignesh Balu //
16*62fddd5fSVignesh Balu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
17*62fddd5fSVignesh Balu // See https://llvm.org/LICENSE.txt for license information.
18*62fddd5fSVignesh Balu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
19*62fddd5fSVignesh Balu //
20*62fddd5fSVignesh Balu //===----------------------------------------------------------------------===//
21*62fddd5fSVignesh Balu 
22*62fddd5fSVignesh Balu #define NDEBUG 1
23*62fddd5fSVignesh Balu 
24*62fddd5fSVignesh Balu #include "omp-debug.h"
25*62fddd5fSVignesh Balu #include "TargetValue.h"
26*62fddd5fSVignesh Balu #include "omp.h"
27*62fddd5fSVignesh Balu #include "ompd-private.h"
28*62fddd5fSVignesh Balu #include <assert.h>
29*62fddd5fSVignesh Balu #include <cstdio>
30*62fddd5fSVignesh Balu #include <inttypes.h>
31*62fddd5fSVignesh Balu #include <pthread.h>
32*62fddd5fSVignesh Balu #include <stdint.h>
33*62fddd5fSVignesh Balu 
34*62fddd5fSVignesh Balu ompd_device_type_sizes_t type_sizes;
35*62fddd5fSVignesh Balu uint64_t ompd_state;
36*62fddd5fSVignesh Balu ompd_rc_t ompd_get_num_threads(
37*62fddd5fSVignesh Balu     ompd_parallel_handle_t *parallel_handle, /* IN: OpenMP parallel handle */
38*62fddd5fSVignesh Balu     ompd_word_t *val /* OUT: number of threads */);
39*62fddd5fSVignesh Balu 
40*62fddd5fSVignesh Balu /* --- OMPD functions ------------------------------------------------------- */
41*62fddd5fSVignesh Balu 
42*62fddd5fSVignesh Balu /* --- Initialization ------------------------------------------------------- */
43*62fddd5fSVignesh Balu 
ompd_initialize(ompd_word_t version,const ompd_callbacks_t * table)44*62fddd5fSVignesh Balu ompd_rc_t ompd_initialize(ompd_word_t version, const ompd_callbacks_t *table) {
45*62fddd5fSVignesh Balu   ompd_rc_t ret = ompd_rc_ok;
46*62fddd5fSVignesh Balu   ompd_word_t ompd_version;
47*62fddd5fSVignesh Balu 
48*62fddd5fSVignesh Balu   if (!table)
49*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
50*62fddd5fSVignesh Balu 
51*62fddd5fSVignesh Balu   ompd_get_api_version(&ompd_version);
52*62fddd5fSVignesh Balu   if (version != ompd_version)
53*62fddd5fSVignesh Balu     return ompd_rc_unsupported;
54*62fddd5fSVignesh Balu   callbacks = table;
55*62fddd5fSVignesh Balu   TValue::callbacks = table;
56*62fddd5fSVignesh Balu   __ompd_init_icvs(table);
57*62fddd5fSVignesh Balu   __ompd_init_states(table);
58*62fddd5fSVignesh Balu 
59*62fddd5fSVignesh Balu   return ret;
60*62fddd5fSVignesh Balu }
61*62fddd5fSVignesh Balu 
ompd_finalize(void)62*62fddd5fSVignesh Balu ompd_rc_t ompd_finalize(void) { return ompd_rc_ok; }
63*62fddd5fSVignesh Balu 
ompd_process_initialize(ompd_address_space_context_t * context,ompd_address_space_handle_t ** handle)64*62fddd5fSVignesh Balu ompd_rc_t ompd_process_initialize(
65*62fddd5fSVignesh Balu     ompd_address_space_context_t
66*62fddd5fSVignesh Balu         *context, /* IN: debugger handle for the target */
67*62fddd5fSVignesh Balu     ompd_address_space_handle_t **handle /* OUT: ompd handle for the target */
68*62fddd5fSVignesh Balu ) {
69*62fddd5fSVignesh Balu   if (!context)
70*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
71*62fddd5fSVignesh Balu   if (!handle)
72*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
73*62fddd5fSVignesh Balu 
74*62fddd5fSVignesh Balu   ompd_rc_t ret = initTypeSizes(context);
75*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
76*62fddd5fSVignesh Balu     return ret;
77*62fddd5fSVignesh Balu 
78*62fddd5fSVignesh Balu   ret = TValue(context, "ompd_state")
79*62fddd5fSVignesh Balu             .castBase(ompd_type_long_long)
80*62fddd5fSVignesh Balu             .getValue(ompd_state);
81*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
82*62fddd5fSVignesh Balu     return ret;
83*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_address_space_handle_t),
84*62fddd5fSVignesh Balu                                 (void **)(handle));
85*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
86*62fddd5fSVignesh Balu     return ret;
87*62fddd5fSVignesh Balu   if (!*handle)
88*62fddd5fSVignesh Balu     return ompd_rc_error;
89*62fddd5fSVignesh Balu 
90*62fddd5fSVignesh Balu   (*handle)->context = context;
91*62fddd5fSVignesh Balu   (*handle)->kind = OMPD_DEVICE_KIND_HOST;
92*62fddd5fSVignesh Balu 
93*62fddd5fSVignesh Balu   return ompd_rc_ok;
94*62fddd5fSVignesh Balu }
95*62fddd5fSVignesh Balu 
96*62fddd5fSVignesh Balu ompd_rc_t
ompd_get_omp_version(ompd_address_space_handle_t * address_space,ompd_word_t * version)97*62fddd5fSVignesh Balu ompd_get_omp_version(ompd_address_space_handle_t
98*62fddd5fSVignesh Balu                          *address_space, /* IN: handle for the address space */
99*62fddd5fSVignesh Balu                      ompd_word_t *version) {
100*62fddd5fSVignesh Balu   if (!address_space)
101*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
102*62fddd5fSVignesh Balu   if (!version)
103*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
104*62fddd5fSVignesh Balu 
105*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = address_space->context;
106*62fddd5fSVignesh Balu   ompd_rc_t ret;
107*62fddd5fSVignesh Balu 
108*62fddd5fSVignesh Balu   if (!context)
109*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
110*62fddd5fSVignesh Balu 
111*62fddd5fSVignesh Balu   if (!callbacks) {
112*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
113*62fddd5fSVignesh Balu   }
114*62fddd5fSVignesh Balu 
115*62fddd5fSVignesh Balu   ret = TValue(context, "__kmp_openmp_version")
116*62fddd5fSVignesh Balu             .castBase(ompd_type_int)
117*62fddd5fSVignesh Balu             .getValue(*version);
118*62fddd5fSVignesh Balu   return ret;
119*62fddd5fSVignesh Balu }
120*62fddd5fSVignesh Balu 
ompd_get_omp_version_string(ompd_address_space_handle_t * address_space,const char ** string)121*62fddd5fSVignesh Balu ompd_rc_t ompd_get_omp_version_string(
122*62fddd5fSVignesh Balu     ompd_address_space_handle_t
123*62fddd5fSVignesh Balu         *address_space, /* IN: handle for the address space */
124*62fddd5fSVignesh Balu     const char **string) {
125*62fddd5fSVignesh Balu   if (!address_space)
126*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
127*62fddd5fSVignesh Balu   if (!string)
128*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
129*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = address_space->context;
130*62fddd5fSVignesh Balu   ompd_word_t ver;
131*62fddd5fSVignesh Balu   ompd_rc_t ret;
132*62fddd5fSVignesh Balu   char *omp_version;
133*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(10, /* max digit can be store on int*/
134*62fddd5fSVignesh Balu                                 (void **)&omp_version);
135*62fddd5fSVignesh Balu 
136*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
137*62fddd5fSVignesh Balu     return ret;
138*62fddd5fSVignesh Balu 
139*62fddd5fSVignesh Balu   ret = TValue(context, "__kmp_openmp_version")
140*62fddd5fSVignesh Balu             .castBase(ompd_type_int)
141*62fddd5fSVignesh Balu             .getValue(ver);
142*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
143*62fddd5fSVignesh Balu     return ret;
144*62fddd5fSVignesh Balu 
145*62fddd5fSVignesh Balu   sprintf(omp_version, "%ld", ver);
146*62fddd5fSVignesh Balu   *string = omp_version;
147*62fddd5fSVignesh Balu   return ret;
148*62fddd5fSVignesh Balu }
149*62fddd5fSVignesh Balu 
ompd_rel_address_space_handle(ompd_address_space_handle_t * addr_handle)150*62fddd5fSVignesh Balu ompd_rc_t ompd_rel_address_space_handle(
151*62fddd5fSVignesh Balu     ompd_address_space_handle_t
152*62fddd5fSVignesh Balu         *addr_handle /* IN: handle for the address space */
153*62fddd5fSVignesh Balu ) {
154*62fddd5fSVignesh Balu   if (!addr_handle)
155*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
156*62fddd5fSVignesh Balu 
157*62fddd5fSVignesh Balu   ompd_rc_t ret = callbacks->free_memory((void *)(addr_handle));
158*62fddd5fSVignesh Balu   //  delete addr_handle;
159*62fddd5fSVignesh Balu   return ret;
160*62fddd5fSVignesh Balu }
161*62fddd5fSVignesh Balu 
ompd_device_initialize(ompd_address_space_handle_t * process_handle,ompd_address_space_context_t * device_context,ompd_device_t kind,ompd_size_t sizeof_id,void * id,ompd_address_space_handle_t ** device_handle)162*62fddd5fSVignesh Balu ompd_rc_t ompd_device_initialize(ompd_address_space_handle_t *process_handle,
163*62fddd5fSVignesh Balu                                  ompd_address_space_context_t *device_context,
164*62fddd5fSVignesh Balu                                  ompd_device_t kind, ompd_size_t sizeof_id,
165*62fddd5fSVignesh Balu                                  void *id,
166*62fddd5fSVignesh Balu                                  ompd_address_space_handle_t **device_handle) {
167*62fddd5fSVignesh Balu   if (!device_context)
168*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
169*62fddd5fSVignesh Balu 
170*62fddd5fSVignesh Balu   return ompd_rc_unavailable;
171*62fddd5fSVignesh Balu }
172*62fddd5fSVignesh Balu 
173*62fddd5fSVignesh Balu /* --- Thread Handles ------------------------------------------------------- */
174*62fddd5fSVignesh Balu 
175*62fddd5fSVignesh Balu /* thread_handle is of type (kmp_base_info_t) */
176*62fddd5fSVignesh Balu 
ompd_get_thread_in_parallel(ompd_parallel_handle_t * parallel_handle,int thread_num,ompd_thread_handle_t ** thread_handle)177*62fddd5fSVignesh Balu ompd_rc_t ompd_get_thread_in_parallel(
178*62fddd5fSVignesh Balu     ompd_parallel_handle_t *parallel_handle, /* IN: OpenMP parallel handle */
179*62fddd5fSVignesh Balu     int thread_num, /* IN: Thread num, handle of which is to be returned */
180*62fddd5fSVignesh Balu     ompd_thread_handle_t **thread_handle /* OUT: handle */
181*62fddd5fSVignesh Balu ) {
182*62fddd5fSVignesh Balu   if (!parallel_handle)
183*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
184*62fddd5fSVignesh Balu   if (!parallel_handle->ah)
185*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
186*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = parallel_handle->ah->context;
187*62fddd5fSVignesh Balu   ompd_rc_t ret;
188*62fddd5fSVignesh Balu 
189*62fddd5fSVignesh Balu   if (!context)
190*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
191*62fddd5fSVignesh Balu 
192*62fddd5fSVignesh Balu   if (!callbacks) {
193*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
194*62fddd5fSVignesh Balu   }
195*62fddd5fSVignesh Balu 
196*62fddd5fSVignesh Balu   ompd_word_t team_size_var;
197*62fddd5fSVignesh Balu   ret = ompd_get_num_threads(parallel_handle, &team_size_var);
198*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
199*62fddd5fSVignesh Balu     return ret;
200*62fddd5fSVignesh Balu   if (thread_num < 0 || thread_num >= team_size_var)
201*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
202*62fddd5fSVignesh Balu 
203*62fddd5fSVignesh Balu   ompd_address_t taddr = {OMPD_SEGMENT_UNSPECIFIED, 0};
204*62fddd5fSVignesh Balu 
205*62fddd5fSVignesh Balu   ret = TValue(context, parallel_handle->th) /* t */
206*62fddd5fSVignesh Balu             .cast("kmp_base_team_t", 0)
207*62fddd5fSVignesh Balu             .access("t_threads") /*t.t_threads*/
208*62fddd5fSVignesh Balu             .cast("kmp_info_t", 2)
209*62fddd5fSVignesh Balu             .getArrayElement(thread_num) /*t.t_threads[nth_handle]*/
210*62fddd5fSVignesh Balu             .access("th")                /*t.t_threads[i]->th*/
211*62fddd5fSVignesh Balu             .getAddress(&taddr);
212*62fddd5fSVignesh Balu 
213*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
214*62fddd5fSVignesh Balu     return ret;
215*62fddd5fSVignesh Balu 
216*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_thread_handle_t),
217*62fddd5fSVignesh Balu                                 (void **)(thread_handle));
218*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
219*62fddd5fSVignesh Balu     return ret;
220*62fddd5fSVignesh Balu 
221*62fddd5fSVignesh Balu   (*thread_handle)->th = taddr;
222*62fddd5fSVignesh Balu   (*thread_handle)->ah = parallel_handle->ah;
223*62fddd5fSVignesh Balu   return ret;
224*62fddd5fSVignesh Balu }
225*62fddd5fSVignesh Balu 
ompd_rel_thread_handle(ompd_thread_handle_t * thread_handle)226*62fddd5fSVignesh Balu ompd_rc_t ompd_rel_thread_handle(
227*62fddd5fSVignesh Balu     ompd_thread_handle_t
228*62fddd5fSVignesh Balu         *thread_handle /* IN: OpenMP thread handle to be released */
229*62fddd5fSVignesh Balu ) {
230*62fddd5fSVignesh Balu   if (!thread_handle)
231*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
232*62fddd5fSVignesh Balu   ompd_rc_t ret = callbacks->free_memory((void *)(thread_handle));
233*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
234*62fddd5fSVignesh Balu     return ret;
235*62fddd5fSVignesh Balu   return ompd_rc_ok;
236*62fddd5fSVignesh Balu }
237*62fddd5fSVignesh Balu 
ompd_thread_handle_compare(ompd_thread_handle_t * thread_handle_1,ompd_thread_handle_t * thread_handle_2,int * cmp_value)238*62fddd5fSVignesh Balu ompd_rc_t ompd_thread_handle_compare(ompd_thread_handle_t *thread_handle_1,
239*62fddd5fSVignesh Balu                                      ompd_thread_handle_t *thread_handle_2,
240*62fddd5fSVignesh Balu                                      int *cmp_value) {
241*62fddd5fSVignesh Balu   if (!thread_handle_1)
242*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
243*62fddd5fSVignesh Balu   if (!thread_handle_2)
244*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
245*62fddd5fSVignesh Balu   if (!cmp_value)
246*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
247*62fddd5fSVignesh Balu   if (thread_handle_1->ah->kind != thread_handle_2->ah->kind)
248*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
249*62fddd5fSVignesh Balu   *cmp_value = thread_handle_1->th.address - thread_handle_2->th.address;
250*62fddd5fSVignesh Balu 
251*62fddd5fSVignesh Balu   return ompd_rc_ok;
252*62fddd5fSVignesh Balu }
253*62fddd5fSVignesh Balu 
254*62fddd5fSVignesh Balu /* --- Parallel Region Handles----------------------------------------------- */
255*62fddd5fSVignesh Balu 
256*62fddd5fSVignesh Balu /* parallel_handle is of type (kmp_base_team_t)*/
257*62fddd5fSVignesh Balu 
ompd_get_curr_parallel_handle(ompd_thread_handle_t * thread_handle,ompd_parallel_handle_t ** parallel_handle)258*62fddd5fSVignesh Balu ompd_rc_t ompd_get_curr_parallel_handle(
259*62fddd5fSVignesh Balu     ompd_thread_handle_t *thread_handle,     /* IN: OpenMP thread handle*/
260*62fddd5fSVignesh Balu     ompd_parallel_handle_t **parallel_handle /* OUT: OpenMP parallel handle */
261*62fddd5fSVignesh Balu ) {
262*62fddd5fSVignesh Balu   if (!thread_handle)
263*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
264*62fddd5fSVignesh Balu   if (!thread_handle->ah)
265*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
266*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = thread_handle->ah->context;
267*62fddd5fSVignesh Balu   ompd_thread_context_t *thread_context = thread_handle->thread_context;
268*62fddd5fSVignesh Balu   if (!context || !thread_context)
269*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
270*62fddd5fSVignesh Balu 
271*62fddd5fSVignesh Balu   if (!callbacks) {
272*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
273*62fddd5fSVignesh Balu   }
274*62fddd5fSVignesh Balu 
275*62fddd5fSVignesh Balu   ompd_rc_t ret;
276*62fddd5fSVignesh Balu 
277*62fddd5fSVignesh Balu   ompd_address_t taddr = {OMPD_SEGMENT_UNSPECIFIED, 0},
278*62fddd5fSVignesh Balu                  lwt = {OMPD_SEGMENT_UNSPECIFIED, 0};
279*62fddd5fSVignesh Balu 
280*62fddd5fSVignesh Balu   TValue teamdata = TValue(context, thread_handle->th) /*__kmp_threads[t]->th*/
281*62fddd5fSVignesh Balu                         .cast("kmp_base_info_t")
282*62fddd5fSVignesh Balu                         .access("th_team") /*__kmp_threads[t]->th.th_team*/
283*62fddd5fSVignesh Balu                         .cast("kmp_team_p", 1)
284*62fddd5fSVignesh Balu                         .access("t"); /*__kmp_threads[t]->th.th_team->t*/
285*62fddd5fSVignesh Balu 
286*62fddd5fSVignesh Balu   ret = teamdata.getAddress(&taddr);
287*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
288*62fddd5fSVignesh Balu     return ret;
289*62fddd5fSVignesh Balu 
290*62fddd5fSVignesh Balu   lwt.segment = OMPD_SEGMENT_UNSPECIFIED;
291*62fddd5fSVignesh Balu   ret = teamdata.cast("kmp_base_team_t", 0)
292*62fddd5fSVignesh Balu             .access("ompt_serialized_team_info")
293*62fddd5fSVignesh Balu             .castBase()
294*62fddd5fSVignesh Balu             .getValue(lwt.address);
295*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
296*62fddd5fSVignesh Balu     return ret;
297*62fddd5fSVignesh Balu 
298*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_parallel_handle_t),
299*62fddd5fSVignesh Balu                                 (void **)(parallel_handle));
300*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
301*62fddd5fSVignesh Balu     return ret;
302*62fddd5fSVignesh Balu 
303*62fddd5fSVignesh Balu   (*parallel_handle)->ah = thread_handle->ah;
304*62fddd5fSVignesh Balu   (*parallel_handle)->th = taddr;
305*62fddd5fSVignesh Balu   (*parallel_handle)->lwt = lwt;
306*62fddd5fSVignesh Balu   return ompd_rc_ok;
307*62fddd5fSVignesh Balu }
308*62fddd5fSVignesh Balu 
ompd_get_enclosing_parallel_handle(ompd_parallel_handle_t * parallel_handle,ompd_parallel_handle_t ** enclosing_parallel_handle)309*62fddd5fSVignesh Balu ompd_rc_t ompd_get_enclosing_parallel_handle(
310*62fddd5fSVignesh Balu     ompd_parallel_handle_t *parallel_handle, /* IN: OpenMP parallel handle */
311*62fddd5fSVignesh Balu     ompd_parallel_handle_t *
312*62fddd5fSVignesh Balu         *enclosing_parallel_handle /* OUT: OpenMP parallel handle */
313*62fddd5fSVignesh Balu ) {
314*62fddd5fSVignesh Balu   if (!parallel_handle)
315*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
316*62fddd5fSVignesh Balu   if (!parallel_handle->ah)
317*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
318*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = parallel_handle->ah->context;
319*62fddd5fSVignesh Balu 
320*62fddd5fSVignesh Balu   if (!context)
321*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
322*62fddd5fSVignesh Balu 
323*62fddd5fSVignesh Balu   if (!callbacks) {
324*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
325*62fddd5fSVignesh Balu   }
326*62fddd5fSVignesh Balu 
327*62fddd5fSVignesh Balu   ompd_address_t taddr = parallel_handle->th,
328*62fddd5fSVignesh Balu                  lwt = {OMPD_SEGMENT_UNSPECIFIED, 0};
329*62fddd5fSVignesh Balu   ompd_rc_t ret;
330*62fddd5fSVignesh Balu 
331*62fddd5fSVignesh Balu   ret = ompd_rc_stale_handle;
332*62fddd5fSVignesh Balu   TValue lwtValue = TValue(context, parallel_handle->lwt);
333*62fddd5fSVignesh Balu   if (lwtValue.getError() == ompd_rc_ok) // lwt == 0x0
334*62fddd5fSVignesh Balu   {                                      // if we are in lwt, get parent
335*62fddd5fSVignesh Balu     ret = lwtValue.cast("ompt_lw_taskteam_t", 0)
336*62fddd5fSVignesh Balu               .access("parent")
337*62fddd5fSVignesh Balu               .cast("ompt_lw_taskteam_t", 1)
338*62fddd5fSVignesh Balu               .dereference()
339*62fddd5fSVignesh Balu               .getAddress(&lwt);
340*62fddd5fSVignesh Balu   }
341*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok) { // no lwt or parent==0x0
342*62fddd5fSVignesh Balu 
343*62fddd5fSVignesh Balu     TValue teamdata =
344*62fddd5fSVignesh Balu         TValue(context, parallel_handle->th) /*__kmp_threads[t]->th*/
345*62fddd5fSVignesh Balu             .cast("kmp_base_team_t", 0)      /*t*/
346*62fddd5fSVignesh Balu             .access("t_parent")              /*t.t_parent*/
347*62fddd5fSVignesh Balu             .cast("kmp_team_p", 1)
348*62fddd5fSVignesh Balu             .access("t"); /*t.t_parent->t*/
349*62fddd5fSVignesh Balu 
350*62fddd5fSVignesh Balu     ret = teamdata.getAddress(&taddr);
351*62fddd5fSVignesh Balu     if (ret != ompd_rc_ok)
352*62fddd5fSVignesh Balu       return ret;
353*62fddd5fSVignesh Balu 
354*62fddd5fSVignesh Balu     lwt.segment = OMPD_SEGMENT_UNSPECIFIED;
355*62fddd5fSVignesh Balu     ret = teamdata.cast("kmp_base_team_t", 0)
356*62fddd5fSVignesh Balu               .access("ompt_serialized_team_info")
357*62fddd5fSVignesh Balu               .castBase()
358*62fddd5fSVignesh Balu               .getValue(lwt.address);
359*62fddd5fSVignesh Balu     if (ret != ompd_rc_ok)
360*62fddd5fSVignesh Balu       return ret;
361*62fddd5fSVignesh Balu   }
362*62fddd5fSVignesh Balu 
363*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_parallel_handle_t),
364*62fddd5fSVignesh Balu                                 (void **)(enclosing_parallel_handle));
365*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
366*62fddd5fSVignesh Balu     return ret;
367*62fddd5fSVignesh Balu   (*enclosing_parallel_handle)->th = taddr;
368*62fddd5fSVignesh Balu   (*enclosing_parallel_handle)->lwt = lwt;
369*62fddd5fSVignesh Balu   (*enclosing_parallel_handle)->ah = parallel_handle->ah;
370*62fddd5fSVignesh Balu   return ompd_rc_ok;
371*62fddd5fSVignesh Balu }
372*62fddd5fSVignesh Balu 
ompd_get_task_parallel_handle(ompd_task_handle_t * task_handle,ompd_parallel_handle_t ** task_parallel_handle)373*62fddd5fSVignesh Balu ompd_rc_t ompd_get_task_parallel_handle(
374*62fddd5fSVignesh Balu     ompd_task_handle_t *task_handle, /* IN: OpenMP task handle */
375*62fddd5fSVignesh Balu     ompd_parallel_handle_t *
376*62fddd5fSVignesh Balu         *task_parallel_handle /* OUT: OpenMP parallel handle */
377*62fddd5fSVignesh Balu ) {
378*62fddd5fSVignesh Balu   if (!task_handle)
379*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
380*62fddd5fSVignesh Balu   if (!task_handle->ah)
381*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
382*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = task_handle->ah->context;
383*62fddd5fSVignesh Balu 
384*62fddd5fSVignesh Balu   if (!context)
385*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
386*62fddd5fSVignesh Balu 
387*62fddd5fSVignesh Balu   if (!callbacks) {
388*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
389*62fddd5fSVignesh Balu   }
390*62fddd5fSVignesh Balu 
391*62fddd5fSVignesh Balu   ompd_address_t taddr = {OMPD_SEGMENT_UNSPECIFIED, 0};
392*62fddd5fSVignesh Balu 
393*62fddd5fSVignesh Balu   ompd_rc_t ret;
394*62fddd5fSVignesh Balu 
395*62fddd5fSVignesh Balu   ret = TValue(context, task_handle->th)
396*62fddd5fSVignesh Balu             .cast("kmp_taskdata_t") /*td*/
397*62fddd5fSVignesh Balu             .access("td_team")      /*td.td_team*/
398*62fddd5fSVignesh Balu             .cast("kmp_team_p", 1)
399*62fddd5fSVignesh Balu             .access("t") /*td.td_team->t*/
400*62fddd5fSVignesh Balu             .getAddress(&taddr);
401*62fddd5fSVignesh Balu 
402*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
403*62fddd5fSVignesh Balu     return ret;
404*62fddd5fSVignesh Balu 
405*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_parallel_handle_t),
406*62fddd5fSVignesh Balu                                 (void **)(task_parallel_handle));
407*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
408*62fddd5fSVignesh Balu     return ret;
409*62fddd5fSVignesh Balu 
410*62fddd5fSVignesh Balu   (*task_parallel_handle)->ah = task_handle->ah;
411*62fddd5fSVignesh Balu   (*task_parallel_handle)->lwt = task_handle->lwt;
412*62fddd5fSVignesh Balu   (*task_parallel_handle)->th = taddr;
413*62fddd5fSVignesh Balu   return ompd_rc_ok;
414*62fddd5fSVignesh Balu }
415*62fddd5fSVignesh Balu 
ompd_rel_parallel_handle(ompd_parallel_handle_t * parallel_handle)416*62fddd5fSVignesh Balu ompd_rc_t ompd_rel_parallel_handle(
417*62fddd5fSVignesh Balu     ompd_parallel_handle_t *parallel_handle /* IN: OpenMP parallel handle */
418*62fddd5fSVignesh Balu ) {
419*62fddd5fSVignesh Balu   if (!parallel_handle)
420*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
421*62fddd5fSVignesh Balu   ompd_rc_t ret = callbacks->free_memory((void *)(parallel_handle));
422*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
423*62fddd5fSVignesh Balu     return ret;
424*62fddd5fSVignesh Balu   return ompd_rc_ok;
425*62fddd5fSVignesh Balu }
426*62fddd5fSVignesh Balu 
427*62fddd5fSVignesh Balu ompd_rc_t
ompd_parallel_handle_compare(ompd_parallel_handle_t * parallel_handle_1,ompd_parallel_handle_t * parallel_handle_2,int * cmp_value)428*62fddd5fSVignesh Balu ompd_parallel_handle_compare(ompd_parallel_handle_t *parallel_handle_1,
429*62fddd5fSVignesh Balu                              ompd_parallel_handle_t *parallel_handle_2,
430*62fddd5fSVignesh Balu                              int *cmp_value) {
431*62fddd5fSVignesh Balu   if (!parallel_handle_1)
432*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
433*62fddd5fSVignesh Balu   if (!parallel_handle_2)
434*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
435*62fddd5fSVignesh Balu   if (!cmp_value)
436*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
437*62fddd5fSVignesh Balu   if (parallel_handle_1->ah->kind != parallel_handle_2->ah->kind)
438*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
439*62fddd5fSVignesh Balu   if (parallel_handle_1->ah->kind == OMPD_DEVICE_KIND_HOST) {
440*62fddd5fSVignesh Balu     if (parallel_handle_1->th.address - parallel_handle_2->th.address)
441*62fddd5fSVignesh Balu       *cmp_value =
442*62fddd5fSVignesh Balu           parallel_handle_1->th.address - parallel_handle_2->th.address;
443*62fddd5fSVignesh Balu     else
444*62fddd5fSVignesh Balu       *cmp_value =
445*62fddd5fSVignesh Balu           parallel_handle_1->lwt.address - parallel_handle_2->lwt.address;
446*62fddd5fSVignesh Balu   } else {
447*62fddd5fSVignesh Balu     *cmp_value = parallel_handle_1->th.address - parallel_handle_2->th.address;
448*62fddd5fSVignesh Balu   }
449*62fddd5fSVignesh Balu   return ompd_rc_ok;
450*62fddd5fSVignesh Balu }
451*62fddd5fSVignesh Balu 
452*62fddd5fSVignesh Balu /* ------- Task Handles ----------------------------------------------------- */
453*62fddd5fSVignesh Balu 
454*62fddd5fSVignesh Balu /* task_handle is of type (kmp_taskdata_t) */
455*62fddd5fSVignesh Balu 
ompd_get_curr_task_handle(ompd_thread_handle_t * thread_handle,ompd_task_handle_t ** task_handle)456*62fddd5fSVignesh Balu ompd_rc_t ompd_get_curr_task_handle(
457*62fddd5fSVignesh Balu     ompd_thread_handle_t *thread_handle, /* IN: OpenMP thread handle*/
458*62fddd5fSVignesh Balu     ompd_task_handle_t **task_handle     /* OUT: OpenMP task handle */
459*62fddd5fSVignesh Balu ) {
460*62fddd5fSVignesh Balu   if (!thread_handle)
461*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
462*62fddd5fSVignesh Balu   if (!thread_handle->ah)
463*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
464*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = thread_handle->ah->context;
465*62fddd5fSVignesh Balu   if (!context)
466*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
467*62fddd5fSVignesh Balu 
468*62fddd5fSVignesh Balu   if (!callbacks) {
469*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
470*62fddd5fSVignesh Balu   }
471*62fddd5fSVignesh Balu 
472*62fddd5fSVignesh Balu   ompd_address_t taddr = {OMPD_SEGMENT_UNSPECIFIED, 0},
473*62fddd5fSVignesh Balu                  lwt = {OMPD_SEGMENT_UNSPECIFIED, 0};
474*62fddd5fSVignesh Balu   ompd_rc_t ret = ompd_rc_ok;
475*62fddd5fSVignesh Balu 
476*62fddd5fSVignesh Balu   lwt.segment = OMPD_SEGMENT_UNSPECIFIED;
477*62fddd5fSVignesh Balu 
478*62fddd5fSVignesh Balu   TValue taskdata =
479*62fddd5fSVignesh Balu       TValue(context, thread_handle->th) /*__kmp_threads[t]->th*/
480*62fddd5fSVignesh Balu           .cast("kmp_base_info_t")
481*62fddd5fSVignesh Balu           .access("th_current_task") /*__kmp_threads[t]->th.th_current_task*/
482*62fddd5fSVignesh Balu           .cast("kmp_taskdata_t", 1);
483*62fddd5fSVignesh Balu 
484*62fddd5fSVignesh Balu   ret = taskdata.dereference().getAddress(&taddr);
485*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
486*62fddd5fSVignesh Balu     return ret;
487*62fddd5fSVignesh Balu 
488*62fddd5fSVignesh Balu   ret = taskdata
489*62fddd5fSVignesh Balu             .access("td_team") /*td.td_team*/
490*62fddd5fSVignesh Balu             .cast("kmp_team_p", 1)
491*62fddd5fSVignesh Balu             .access("t") /*td.td_team->t*/
492*62fddd5fSVignesh Balu             .cast("kmp_base_team_t", 0)
493*62fddd5fSVignesh Balu             .access("ompt_serialized_team_info")
494*62fddd5fSVignesh Balu             .castBase()
495*62fddd5fSVignesh Balu             .getValue(lwt.address);
496*62fddd5fSVignesh Balu 
497*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
498*62fddd5fSVignesh Balu     return ret;
499*62fddd5fSVignesh Balu 
500*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_task_handle_t),
501*62fddd5fSVignesh Balu                                 (void **)(task_handle));
502*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
503*62fddd5fSVignesh Balu     return ret;
504*62fddd5fSVignesh Balu 
505*62fddd5fSVignesh Balu   (*task_handle)->th = taddr;
506*62fddd5fSVignesh Balu   (*task_handle)->lwt = lwt;
507*62fddd5fSVignesh Balu   (*task_handle)->ah = thread_handle->ah;
508*62fddd5fSVignesh Balu   return ompd_rc_ok;
509*62fddd5fSVignesh Balu }
510*62fddd5fSVignesh Balu 
ompd_get_generating_task_handle(ompd_task_handle_t * task_handle,ompd_task_handle_t ** parent_task_handle)511*62fddd5fSVignesh Balu ompd_rc_t ompd_get_generating_task_handle(
512*62fddd5fSVignesh Balu     ompd_task_handle_t *task_handle,        /* IN: OpenMP task handle */
513*62fddd5fSVignesh Balu     ompd_task_handle_t **parent_task_handle /* OUT: OpenMP task handle */
514*62fddd5fSVignesh Balu ) {
515*62fddd5fSVignesh Balu   if (!task_handle)
516*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
517*62fddd5fSVignesh Balu   if (!task_handle->ah)
518*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
519*62fddd5fSVignesh Balu 
520*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = task_handle->ah->context;
521*62fddd5fSVignesh Balu   if (!context)
522*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
523*62fddd5fSVignesh Balu   if (!callbacks) {
524*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
525*62fddd5fSVignesh Balu   }
526*62fddd5fSVignesh Balu 
527*62fddd5fSVignesh Balu   ompd_address_t taddr = task_handle->th, lwt = {OMPD_SEGMENT_UNSPECIFIED, 0};
528*62fddd5fSVignesh Balu 
529*62fddd5fSVignesh Balu   ompd_rc_t ret = ompd_rc_stale_handle;
530*62fddd5fSVignesh Balu   TValue lwtValue = TValue(context, task_handle->lwt);
531*62fddd5fSVignesh Balu   if (lwtValue.getError() == ompd_rc_ok) // lwt == 0x0
532*62fddd5fSVignesh Balu   {                                      // if we are in lwt, get parent
533*62fddd5fSVignesh Balu     ret = lwtValue.cast("ompt_lw_taskteam_t", 0)
534*62fddd5fSVignesh Balu               .access("parent")
535*62fddd5fSVignesh Balu               .cast("ompt_lw_taskteam_t", 1)
536*62fddd5fSVignesh Balu               .dereference()
537*62fddd5fSVignesh Balu               .getAddress(&lwt);
538*62fddd5fSVignesh Balu   }
539*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok) { // no lwt or parent==0x0
540*62fddd5fSVignesh Balu 
541*62fddd5fSVignesh Balu     TValue taskdata = TValue(context, task_handle->th) /*__kmp_threads[t]->th*/
542*62fddd5fSVignesh Balu                           .cast("kmp_taskdata_t")      /*td*/
543*62fddd5fSVignesh Balu                           .access("td_parent")         /*td->td_parent*/
544*62fddd5fSVignesh Balu                           .cast("kmp_taskdata_t", 1);
545*62fddd5fSVignesh Balu 
546*62fddd5fSVignesh Balu     ret = taskdata.dereference().getAddress(&taddr);
547*62fddd5fSVignesh Balu     if (ret != ompd_rc_ok)
548*62fddd5fSVignesh Balu       return ret;
549*62fddd5fSVignesh Balu 
550*62fddd5fSVignesh Balu     lwt.segment = OMPD_SEGMENT_UNSPECIFIED;
551*62fddd5fSVignesh Balu     ret = taskdata
552*62fddd5fSVignesh Balu               .access("td_team") /*td.td_team*/
553*62fddd5fSVignesh Balu               .cast("kmp_team_p", 1)
554*62fddd5fSVignesh Balu               .access("t") /*td.td_team->t*/
555*62fddd5fSVignesh Balu               .cast("kmp_base_team_t", 0)
556*62fddd5fSVignesh Balu               .access("ompt_serialized_team_info")
557*62fddd5fSVignesh Balu               .castBase()
558*62fddd5fSVignesh Balu               .getValue(lwt.address);
559*62fddd5fSVignesh Balu     if (ret != ompd_rc_ok)
560*62fddd5fSVignesh Balu       return ret;
561*62fddd5fSVignesh Balu   }
562*62fddd5fSVignesh Balu 
563*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_task_handle_t),
564*62fddd5fSVignesh Balu                                 (void **)(parent_task_handle));
565*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
566*62fddd5fSVignesh Balu     return ret;
567*62fddd5fSVignesh Balu 
568*62fddd5fSVignesh Balu   (*parent_task_handle)->th = taddr;
569*62fddd5fSVignesh Balu   (*parent_task_handle)->lwt = lwt;
570*62fddd5fSVignesh Balu   (*parent_task_handle)->ah = task_handle->ah;
571*62fddd5fSVignesh Balu   return ret;
572*62fddd5fSVignesh Balu }
573*62fddd5fSVignesh Balu 
ompd_get_scheduling_task_handle(ompd_task_handle_t * task_handle,ompd_task_handle_t ** parent_task_handle)574*62fddd5fSVignesh Balu ompd_rc_t ompd_get_scheduling_task_handle(
575*62fddd5fSVignesh Balu     ompd_task_handle_t *task_handle,        /* IN: OpenMP task handle */
576*62fddd5fSVignesh Balu     ompd_task_handle_t **parent_task_handle /* OUT: OpenMP task handle */
577*62fddd5fSVignesh Balu ) {
578*62fddd5fSVignesh Balu   if (!task_handle)
579*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
580*62fddd5fSVignesh Balu   if (!task_handle->ah)
581*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
582*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = task_handle->ah->context;
583*62fddd5fSVignesh Balu   if (!context)
584*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
585*62fddd5fSVignesh Balu 
586*62fddd5fSVignesh Balu   if (!callbacks) {
587*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
588*62fddd5fSVignesh Balu   }
589*62fddd5fSVignesh Balu 
590*62fddd5fSVignesh Balu   ompd_address_t taddr = {OMPD_SEGMENT_UNSPECIFIED, 0};
591*62fddd5fSVignesh Balu   ompd_rc_t ret;
592*62fddd5fSVignesh Balu 
593*62fddd5fSVignesh Balu   ret = TValue(context, task_handle->th)
594*62fddd5fSVignesh Balu             .cast("kmp_taskdata_t")   /*td*/
595*62fddd5fSVignesh Balu             .access("ompt_task_info") // td->ompt_task_info
596*62fddd5fSVignesh Balu             .cast("ompt_task_info_t")
597*62fddd5fSVignesh Balu             .access("scheduling_parent") // td->ompd_task_info.scheduling_parent
598*62fddd5fSVignesh Balu             .cast("kmp_taskdata_t", 1)
599*62fddd5fSVignesh Balu             .castBase()
600*62fddd5fSVignesh Balu             .getValue(taddr.address);
601*62fddd5fSVignesh Balu   if (taddr.address == 0) {
602*62fddd5fSVignesh Balu     return ompd_rc_unavailable;
603*62fddd5fSVignesh Balu   }
604*62fddd5fSVignesh Balu 
605*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
606*62fddd5fSVignesh Balu     return ret;
607*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_task_handle_t),
608*62fddd5fSVignesh Balu                                 (void **)(parent_task_handle));
609*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
610*62fddd5fSVignesh Balu     return ret;
611*62fddd5fSVignesh Balu 
612*62fddd5fSVignesh Balu   (*parent_task_handle)->th = taddr;
613*62fddd5fSVignesh Balu   (*parent_task_handle)->lwt = {OMPD_SEGMENT_UNSPECIFIED, 0};
614*62fddd5fSVignesh Balu   (*parent_task_handle)->ah = task_handle->ah;
615*62fddd5fSVignesh Balu   return ret;
616*62fddd5fSVignesh Balu }
617*62fddd5fSVignesh Balu 
ompd_get_task_in_parallel(ompd_parallel_handle_t * parallel_handle,int thread_num,ompd_task_handle_t ** task_handle)618*62fddd5fSVignesh Balu ompd_rc_t ompd_get_task_in_parallel(
619*62fddd5fSVignesh Balu     ompd_parallel_handle_t *parallel_handle, /* IN: OpenMP parallel handle */
620*62fddd5fSVignesh Balu     int thread_num, /* IN: thread num of implicit task of team */
621*62fddd5fSVignesh Balu     ompd_task_handle_t **task_handle /* OUT: OpenMP task handle */
622*62fddd5fSVignesh Balu ) {
623*62fddd5fSVignesh Balu   if (!parallel_handle)
624*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
625*62fddd5fSVignesh Balu   if (!parallel_handle->ah)
626*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
627*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = parallel_handle->ah->context;
628*62fddd5fSVignesh Balu   if (!context)
629*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
630*62fddd5fSVignesh Balu 
631*62fddd5fSVignesh Balu   if (!callbacks) {
632*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
633*62fddd5fSVignesh Balu   }
634*62fddd5fSVignesh Balu 
635*62fddd5fSVignesh Balu   ompd_rc_t ret;
636*62fddd5fSVignesh Balu   ompd_word_t team_size_var;
637*62fddd5fSVignesh Balu   ret = ompd_get_num_threads(parallel_handle, &team_size_var);
638*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
639*62fddd5fSVignesh Balu     return ret;
640*62fddd5fSVignesh Balu   if (thread_num < 0 || thread_num >= team_size_var)
641*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
642*62fddd5fSVignesh Balu 
643*62fddd5fSVignesh Balu   ompd_address_t taddr = {OMPD_SEGMENT_UNSPECIFIED, 0};
644*62fddd5fSVignesh Balu 
645*62fddd5fSVignesh Balu   ret = TValue(context, parallel_handle->th) /* t */
646*62fddd5fSVignesh Balu             .cast("kmp_base_team_t", 0)
647*62fddd5fSVignesh Balu             .access("t_implicit_task_taskdata") /*t.t_implicit_task_taskdata*/
648*62fddd5fSVignesh Balu             .cast("kmp_taskdata_t", 1)
649*62fddd5fSVignesh Balu             .getArrayElement(
650*62fddd5fSVignesh Balu                 thread_num) /*t.t_implicit_task_taskdata[nth_handle]*/
651*62fddd5fSVignesh Balu             .getAddress(&taddr);
652*62fddd5fSVignesh Balu 
653*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
654*62fddd5fSVignesh Balu     return ret;
655*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_task_handle_t),
656*62fddd5fSVignesh Balu                                 (void **)(task_handle));
657*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
658*62fddd5fSVignesh Balu     return ret;
659*62fddd5fSVignesh Balu 
660*62fddd5fSVignesh Balu   (*task_handle)->th = taddr;
661*62fddd5fSVignesh Balu   (*task_handle)->ah = parallel_handle->ah;
662*62fddd5fSVignesh Balu   (*task_handle)->lwt = {OMPD_SEGMENT_UNSPECIFIED, 0};
663*62fddd5fSVignesh Balu   return ret;
664*62fddd5fSVignesh Balu }
665*62fddd5fSVignesh Balu 
ompd_rel_task_handle(ompd_task_handle_t * task_handle)666*62fddd5fSVignesh Balu ompd_rc_t ompd_rel_task_handle(
667*62fddd5fSVignesh Balu     ompd_task_handle_t *task_handle /* IN: OpenMP task handle */
668*62fddd5fSVignesh Balu ) {
669*62fddd5fSVignesh Balu   if (!task_handle)
670*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
671*62fddd5fSVignesh Balu   ompd_rc_t ret = callbacks->free_memory((void *)(task_handle));
672*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
673*62fddd5fSVignesh Balu     return ret;
674*62fddd5fSVignesh Balu   return ompd_rc_ok;
675*62fddd5fSVignesh Balu }
676*62fddd5fSVignesh Balu 
ompd_task_handle_compare(ompd_task_handle_t * task_handle_1,ompd_task_handle_t * task_handle_2,int * cmp_value)677*62fddd5fSVignesh Balu ompd_rc_t ompd_task_handle_compare(ompd_task_handle_t *task_handle_1,
678*62fddd5fSVignesh Balu                                    ompd_task_handle_t *task_handle_2,
679*62fddd5fSVignesh Balu                                    int *cmp_value) {
680*62fddd5fSVignesh Balu   if (!task_handle_1)
681*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
682*62fddd5fSVignesh Balu   if (!task_handle_2)
683*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
684*62fddd5fSVignesh Balu   if (!cmp_value)
685*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
686*62fddd5fSVignesh Balu   if (task_handle_1->ah->kind != task_handle_2->ah->kind)
687*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
688*62fddd5fSVignesh Balu   if (task_handle_1->th.address - task_handle_2->th.address)
689*62fddd5fSVignesh Balu     *cmp_value = task_handle_1->th.address - task_handle_2->th.address;
690*62fddd5fSVignesh Balu   else
691*62fddd5fSVignesh Balu     *cmp_value = task_handle_1->lwt.address - task_handle_2->lwt.address;
692*62fddd5fSVignesh Balu   return ompd_rc_ok;
693*62fddd5fSVignesh Balu }
694*62fddd5fSVignesh Balu 
ompd_get_thread_handle(ompd_address_space_handle_t * handle,ompd_thread_id_t kind,ompd_size_t sizeof_thread_id,const void * thread_id,ompd_thread_handle_t ** thread_handle)695*62fddd5fSVignesh Balu ompd_rc_t ompd_get_thread_handle(
696*62fddd5fSVignesh Balu     ompd_address_space_handle_t *handle, /* IN: handle for the address space */
697*62fddd5fSVignesh Balu     ompd_thread_id_t kind, ompd_size_t sizeof_thread_id, const void *thread_id,
698*62fddd5fSVignesh Balu     ompd_thread_handle_t **thread_handle) {
699*62fddd5fSVignesh Balu   if (!handle)
700*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
701*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = handle->context;
702*62fddd5fSVignesh Balu   ompd_rc_t ret;
703*62fddd5fSVignesh Balu 
704*62fddd5fSVignesh Balu   if (!context)
705*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
706*62fddd5fSVignesh Balu 
707*62fddd5fSVignesh Balu   if (!callbacks) {
708*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
709*62fddd5fSVignesh Balu   }
710*62fddd5fSVignesh Balu   ompd_thread_context_t *tcontext;
711*62fddd5fSVignesh Balu   ret = callbacks->get_thread_context_for_thread_id(
712*62fddd5fSVignesh Balu       context, kind, sizeof_thread_id, thread_id, &tcontext);
713*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
714*62fddd5fSVignesh Balu     return ret;
715*62fddd5fSVignesh Balu 
716*62fddd5fSVignesh Balu   int tId;
717*62fddd5fSVignesh Balu 
718*62fddd5fSVignesh Balu   ret = TValue(context, tcontext, "__kmp_gtid")
719*62fddd5fSVignesh Balu             .castBase("__kmp_gtid")
720*62fddd5fSVignesh Balu             .getValue(tId);
721*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
722*62fddd5fSVignesh Balu     return ret;
723*62fddd5fSVignesh Balu 
724*62fddd5fSVignesh Balu   if (tId < 0) // thread is no omp worker
725*62fddd5fSVignesh Balu     return ompd_rc_unavailable;
726*62fddd5fSVignesh Balu 
727*62fddd5fSVignesh Balu   TValue th = TValue(context, "__kmp_threads") // __kmp_threads
728*62fddd5fSVignesh Balu                   .cast("kmp_info_t", 2)
729*62fddd5fSVignesh Balu                   .getArrayElement(tId) /*__kmp_threads[t]*/
730*62fddd5fSVignesh Balu                   .access("th");        /*__kmp_threads[t]->th*/
731*62fddd5fSVignesh Balu 
732*62fddd5fSVignesh Balu   ompd_address_t taddr = {OMPD_SEGMENT_UNSPECIFIED, 0};
733*62fddd5fSVignesh Balu   ret = th.getAddress(&taddr);
734*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
735*62fddd5fSVignesh Balu     return ret;
736*62fddd5fSVignesh Balu   ret = callbacks->alloc_memory(sizeof(ompd_thread_handle_t),
737*62fddd5fSVignesh Balu                                 (void **)(thread_handle));
738*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
739*62fddd5fSVignesh Balu     return ret;
740*62fddd5fSVignesh Balu   (*thread_handle)->ah = handle;
741*62fddd5fSVignesh Balu   (*thread_handle)->th = taddr;
742*62fddd5fSVignesh Balu 
743*62fddd5fSVignesh Balu #ifndef NDEBUG
744*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
745*62fddd5fSVignesh Balu     return ret;
746*62fddd5fSVignesh Balu 
747*62fddd5fSVignesh Balu   pthread_t oshandle;
748*62fddd5fSVignesh Balu   TBaseValue ds_handle =
749*62fddd5fSVignesh Balu       th.cast("kmp_base_info_t")
750*62fddd5fSVignesh Balu           .access("th_info") /*__kmp_threads[t]->th.th_info*/
751*62fddd5fSVignesh Balu           .cast("kmp_desc_t")
752*62fddd5fSVignesh Balu           .access("ds") /*__kmp_threads[t]->th.th_info.ds*/
753*62fddd5fSVignesh Balu           .cast("kmp_desc_base_t")
754*62fddd5fSVignesh Balu           .access("ds_thread") /*__kmp_threads[t]->th.th_info.ds.ds_thread*/
755*62fddd5fSVignesh Balu           .castBase();
756*62fddd5fSVignesh Balu 
757*62fddd5fSVignesh Balu   assert(ompd_rc_ok == ds_handle.getValue(oshandle) &&
758*62fddd5fSVignesh Balu          oshandle == *(pthread_t *)(thread_id) &&
759*62fddd5fSVignesh Balu          "Callback table not initialized!");
760*62fddd5fSVignesh Balu #endif
761*62fddd5fSVignesh Balu 
762*62fddd5fSVignesh Balu   (*thread_handle)->thread_context = tcontext;
763*62fddd5fSVignesh Balu   return ret;
764*62fddd5fSVignesh Balu }
765*62fddd5fSVignesh Balu 
ompd_get_thread_id(ompd_thread_handle_t * thread_handle,ompd_thread_id_t kind,ompd_size_t sizeof_thread_id,void * thread_id)766*62fddd5fSVignesh Balu ompd_rc_t ompd_get_thread_id(
767*62fddd5fSVignesh Balu     ompd_thread_handle_t *thread_handle, /* IN: OpenMP thread handle*/
768*62fddd5fSVignesh Balu     ompd_thread_id_t kind, ompd_size_t sizeof_thread_id, void *thread_id) {
769*62fddd5fSVignesh Balu   if (kind != OMPD_THREAD_ID_PTHREAD)
770*62fddd5fSVignesh Balu     return ompd_rc_unsupported;
771*62fddd5fSVignesh Balu   if (!thread_id)
772*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
773*62fddd5fSVignesh Balu   if (!thread_handle)
774*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
775*62fddd5fSVignesh Balu   if (!thread_handle->ah)
776*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
777*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = thread_handle->ah->context;
778*62fddd5fSVignesh Balu   if (!context)
779*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
780*62fddd5fSVignesh Balu   ompd_rc_t ret;
781*62fddd5fSVignesh Balu 
782*62fddd5fSVignesh Balu   ompd_size_t size;
783*62fddd5fSVignesh Balu   ret = tf.getType(context, "kmp_thread_t").getSize(&size);
784*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
785*62fddd5fSVignesh Balu     return ret;
786*62fddd5fSVignesh Balu   if (sizeof_thread_id != size)
787*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
788*62fddd5fSVignesh Balu 
789*62fddd5fSVignesh Balu   if (!callbacks) {
790*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
791*62fddd5fSVignesh Balu   }
792*62fddd5fSVignesh Balu 
793*62fddd5fSVignesh Balu   ret = TValue(context, thread_handle->th) /*__kmp_threads[t]->th*/
794*62fddd5fSVignesh Balu             .cast("kmp_base_info_t")
795*62fddd5fSVignesh Balu             .access("th_info") /*__kmp_threads[t]->th.th_info*/
796*62fddd5fSVignesh Balu             .cast("kmp_desc_t")
797*62fddd5fSVignesh Balu             .access("ds") /*__kmp_threads[t]->th.th_info.ds*/
798*62fddd5fSVignesh Balu             .cast("kmp_desc_base_t")
799*62fddd5fSVignesh Balu             .access("ds_thread") /*__kmp_threads[t]->th.th_info.ds.ds_thread*/
800*62fddd5fSVignesh Balu             .cast("kmp_thread_t")
801*62fddd5fSVignesh Balu             .getRawValue(thread_id, 1);
802*62fddd5fSVignesh Balu 
803*62fddd5fSVignesh Balu   return ret;
804*62fddd5fSVignesh Balu }
805*62fddd5fSVignesh Balu 
806*62fddd5fSVignesh Balu /* --- OMPT Thread State Inquiry Analogue ----------------------------------- */
807*62fddd5fSVignesh Balu 
ompd_get_state(ompd_thread_handle_t * thread_handle,ompd_word_t * state,ompd_wait_id_t * wait_id)808*62fddd5fSVignesh Balu ompd_rc_t ompd_get_state(
809*62fddd5fSVignesh Balu     ompd_thread_handle_t *thread_handle, /* IN: OpenMP thread handle*/
810*62fddd5fSVignesh Balu     ompd_word_t *state,                  /* OUT: State of this thread */
811*62fddd5fSVignesh Balu     ompd_wait_id_t *wait_id              /* OUT: Wait ID */
812*62fddd5fSVignesh Balu ) {
813*62fddd5fSVignesh Balu   if (!thread_handle)
814*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
815*62fddd5fSVignesh Balu   if (!thread_handle->ah)
816*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
817*62fddd5fSVignesh Balu   if (!state)
818*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
819*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = thread_handle->ah->context;
820*62fddd5fSVignesh Balu   if (!context)
821*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
822*62fddd5fSVignesh Balu   if (!ompd_state)
823*62fddd5fSVignesh Balu     return ompd_rc_needs_state_tracking;
824*62fddd5fSVignesh Balu 
825*62fddd5fSVignesh Balu   if (!callbacks) {
826*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
827*62fddd5fSVignesh Balu   }
828*62fddd5fSVignesh Balu   ompd_rc_t ret;
829*62fddd5fSVignesh Balu 
830*62fddd5fSVignesh Balu   TValue ompt_thread_info =
831*62fddd5fSVignesh Balu       TValue(context, thread_handle->th) /*__kmp_threads[t]->th*/
832*62fddd5fSVignesh Balu           .cast("kmp_base_info_t")
833*62fddd5fSVignesh Balu           .access("ompt_thread_info") /*__kmp_threads[t]->th.ompt_thread_info*/
834*62fddd5fSVignesh Balu           .cast("ompt_thread_info_t");
835*62fddd5fSVignesh Balu   if (ompt_thread_info.gotError())
836*62fddd5fSVignesh Balu     return ompt_thread_info.getError();
837*62fddd5fSVignesh Balu   ret = ompt_thread_info
838*62fddd5fSVignesh Balu             .access("state") /*__kmp_threads[t]->th.ompt_thread_info.state*/
839*62fddd5fSVignesh Balu             .castBase()
840*62fddd5fSVignesh Balu             .getValue(*state);
841*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
842*62fddd5fSVignesh Balu     return ret;
843*62fddd5fSVignesh Balu   if (wait_id)
844*62fddd5fSVignesh Balu     ret = ompt_thread_info
845*62fddd5fSVignesh Balu               .access("wait_id") /*__kmp_threads[t]->th.ompt_thread_info.state*/
846*62fddd5fSVignesh Balu               .castBase()
847*62fddd5fSVignesh Balu               .getValue(*wait_id);
848*62fddd5fSVignesh Balu 
849*62fddd5fSVignesh Balu   return ret;
850*62fddd5fSVignesh Balu }
851*62fddd5fSVignesh Balu 
852*62fddd5fSVignesh Balu /* ---  Task Inquiry -------------------------------------------------------- */
853*62fddd5fSVignesh Balu 
854*62fddd5fSVignesh Balu /* ---  Task Settings ------------------------------------------------------- */
855*62fddd5fSVignesh Balu 
856*62fddd5fSVignesh Balu /* ---  OMPT Task Inquiry Analogues ----------------------------------------- */
857*62fddd5fSVignesh Balu 
858*62fddd5fSVignesh Balu ompd_rc_t
ompd_get_task_frame(ompd_task_handle_t * task_handle,ompd_frame_info_t * exit_frame,ompd_frame_info_t * enter_frame)859*62fddd5fSVignesh Balu ompd_get_task_frame(ompd_task_handle_t *task_handle, /* IN: OpenMP task handle*/
860*62fddd5fSVignesh Balu                     ompd_frame_info_t *exit_frame,
861*62fddd5fSVignesh Balu                     ompd_frame_info_t *enter_frame) {
862*62fddd5fSVignesh Balu   if (!task_handle)
863*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
864*62fddd5fSVignesh Balu   if (!task_handle->ah)
865*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
866*62fddd5fSVignesh Balu   if (!exit_frame || !enter_frame)
867*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
868*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = task_handle->ah->context;
869*62fddd5fSVignesh Balu   if (!context)
870*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
871*62fddd5fSVignesh Balu   if (!ompd_state)
872*62fddd5fSVignesh Balu     return ompd_rc_needs_state_tracking;
873*62fddd5fSVignesh Balu 
874*62fddd5fSVignesh Balu   if (!callbacks) {
875*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
876*62fddd5fSVignesh Balu   }
877*62fddd5fSVignesh Balu 
878*62fddd5fSVignesh Balu   ompd_rc_t ret;
879*62fddd5fSVignesh Balu 
880*62fddd5fSVignesh Balu   TValue taskInfo;
881*62fddd5fSVignesh Balu   if (task_handle->lwt.address != 0)
882*62fddd5fSVignesh Balu     taskInfo =
883*62fddd5fSVignesh Balu         TValue(context, task_handle->lwt).cast("ompt_lw_taskteam_t", 0); /*lwt*/
884*62fddd5fSVignesh Balu   else
885*62fddd5fSVignesh Balu     taskInfo = TValue(context, task_handle->th).cast("kmp_taskdata_t", 0); /*t*/
886*62fddd5fSVignesh Balu   TValue frame = taskInfo
887*62fddd5fSVignesh Balu                      .access("ompt_task_info") // td->ompt_task_info
888*62fddd5fSVignesh Balu                      .cast("ompt_task_info_t")
889*62fddd5fSVignesh Balu                      .access("frame") // td->ompd_task_info.frame
890*62fddd5fSVignesh Balu                      .cast("ompt_frame_t", 0);
891*62fddd5fSVignesh Balu   enter_frame->frame_address.segment = OMPD_SEGMENT_UNSPECIFIED;
892*62fddd5fSVignesh Balu   ret = frame
893*62fddd5fSVignesh Balu             .access("enter_frame") // td->ompt_task_info.frame.enter_frame
894*62fddd5fSVignesh Balu             .castBase()
895*62fddd5fSVignesh Balu             .getValue(enter_frame->frame_address.address);
896*62fddd5fSVignesh Balu 
897*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
898*62fddd5fSVignesh Balu     return ret;
899*62fddd5fSVignesh Balu 
900*62fddd5fSVignesh Balu   exit_frame->frame_address.segment = OMPD_SEGMENT_UNSPECIFIED;
901*62fddd5fSVignesh Balu   ret = frame
902*62fddd5fSVignesh Balu             .access("exit_frame") // td->ompt_task_info.frame.exit_frame
903*62fddd5fSVignesh Balu             .castBase()
904*62fddd5fSVignesh Balu             .getValue(exit_frame->frame_address.address);
905*62fddd5fSVignesh Balu 
906*62fddd5fSVignesh Balu   return ret;
907*62fddd5fSVignesh Balu }
908*62fddd5fSVignesh Balu 
ompd_get_task_function(ompd_task_handle_t * task_handle,ompd_address_t * task_addr)909*62fddd5fSVignesh Balu ompd_rc_t ompd_get_task_function(
910*62fddd5fSVignesh Balu     ompd_task_handle_t *task_handle, /* IN: OpenMP task handle */
911*62fddd5fSVignesh Balu     ompd_address_t *task_addr /* OUT: first instruction in the task region */
912*62fddd5fSVignesh Balu ) {
913*62fddd5fSVignesh Balu   if (!task_handle)
914*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
915*62fddd5fSVignesh Balu   if (!task_handle->ah)
916*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
917*62fddd5fSVignesh Balu   if (!task_addr)
918*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
919*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = task_handle->ah->context;
920*62fddd5fSVignesh Balu   if (!context)
921*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
922*62fddd5fSVignesh Balu   if (!ompd_state)
923*62fddd5fSVignesh Balu     return ompd_rc_needs_state_tracking;
924*62fddd5fSVignesh Balu   if (!callbacks) {
925*62fddd5fSVignesh Balu     return ompd_rc_callback_error;
926*62fddd5fSVignesh Balu   }
927*62fddd5fSVignesh Balu 
928*62fddd5fSVignesh Balu   ompd_rc_t ret;
929*62fddd5fSVignesh Balu 
930*62fddd5fSVignesh Balu   task_addr->segment = OMPD_SEGMENT_UNSPECIFIED;
931*62fddd5fSVignesh Balu   TValue taskInfo;
932*62fddd5fSVignesh Balu   if (task_handle->lwt.address != 0)
933*62fddd5fSVignesh Balu     return ompd_rc_bad_input; // We need to decide what we do here.
934*62fddd5fSVignesh Balu   else {
935*62fddd5fSVignesh Balu     ompd_word_t val;
936*62fddd5fSVignesh Balu     ret = TValue(context, task_handle->th)
937*62fddd5fSVignesh Balu               .cast("kmp_taskdata_t") // td
938*62fddd5fSVignesh Balu               .access("td_flags")     // td->td_flags
939*62fddd5fSVignesh Balu               .cast("kmp_tasking_flags_t")
940*62fddd5fSVignesh Balu               .check("tasktype", &val); // td->td_flags.tasktype
941*62fddd5fSVignesh Balu 
942*62fddd5fSVignesh Balu     if (ret != ompd_rc_ok)
943*62fddd5fSVignesh Balu       return ret;
944*62fddd5fSVignesh Balu 
945*62fddd5fSVignesh Balu     if (val == 1) { // tasktype: explicit = 1, implicit = 0
946*62fddd5fSVignesh Balu 
947*62fddd5fSVignesh Balu       ret = TValue(context, task_handle->th)
948*62fddd5fSVignesh Balu                 .cast("kmp_taskdata_t", 0) /*t*/
949*62fddd5fSVignesh Balu                 .getArrayElement(
950*62fddd5fSVignesh Balu                     1) /* see kmp.h: #define KMP_TASKDATA_TO_TASK(taskdata)
951*62fddd5fSVignesh Balu                           (kmp_task_t *)(taskdata + 1) */
952*62fddd5fSVignesh Balu                 .cast("kmp_task_t", 0) /* (kmp_task_t *) */
953*62fddd5fSVignesh Balu                 .access("routine")     /*td->ompt_task_info*/
954*62fddd5fSVignesh Balu                 .castBase()
955*62fddd5fSVignesh Balu                 .getValue(task_addr->address);
956*62fddd5fSVignesh Balu 
957*62fddd5fSVignesh Balu     } else {
958*62fddd5fSVignesh Balu 
959*62fddd5fSVignesh Balu       ret = TValue(context, task_handle->th)
960*62fddd5fSVignesh Balu                 .cast("kmp_taskdata_t") /*td*/
961*62fddd5fSVignesh Balu                 .access("td_team")      /*td.td_team*/
962*62fddd5fSVignesh Balu                 .cast("kmp_team_p", 1)
963*62fddd5fSVignesh Balu                 .access("t") /*td.td_team->t*/
964*62fddd5fSVignesh Balu                 .cast("kmp_base_team_t", 0)
965*62fddd5fSVignesh Balu                 .access("t_pkfn") /*td.td_team->t.t_pkfn*/
966*62fddd5fSVignesh Balu                 .castBase()
967*62fddd5fSVignesh Balu                 .getValue(task_addr->address);
968*62fddd5fSVignesh Balu     }
969*62fddd5fSVignesh Balu   }
970*62fddd5fSVignesh Balu 
971*62fddd5fSVignesh Balu   return ret;
972*62fddd5fSVignesh Balu }
973*62fddd5fSVignesh Balu 
974*62fddd5fSVignesh Balu /* ------- OMPD Version and Compatibility Information ----------------------- */
975*62fddd5fSVignesh Balu 
ompd_get_api_version(ompd_word_t * version)976*62fddd5fSVignesh Balu ompd_rc_t ompd_get_api_version(ompd_word_t *version) {
977*62fddd5fSVignesh Balu   if (!version)
978*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
979*62fddd5fSVignesh Balu 
980*62fddd5fSVignesh Balu   *version = OMPD_VERSION;
981*62fddd5fSVignesh Balu   return ompd_rc_ok;
982*62fddd5fSVignesh Balu }
983*62fddd5fSVignesh Balu 
984*62fddd5fSVignesh Balu ompd_rc_t
ompd_get_version_string(const char ** string)985*62fddd5fSVignesh Balu ompd_get_version_string(const char **string /* OUT: OMPD version string */
986*62fddd5fSVignesh Balu ) {
987*62fddd5fSVignesh Balu   if (!string)
988*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
989*62fddd5fSVignesh Balu 
990*62fddd5fSVignesh Balu   static const char version_string[] =
991*62fddd5fSVignesh Balu       "LLVM OpenMP " STR(OMPD_IMPLEMENTS_OPENMP) "." STR(
992*62fddd5fSVignesh Balu           OMPD_IMPLEMENTS_OPENMP_SUBVERSION) " Debugging Library implmenting "
993*62fddd5fSVignesh Balu                                              "TR " STR(OMPD_TR_VERSION) "" STR(
994*62fddd5fSVignesh Balu                                                  OMPD_TR_SUBVERSION);
995*62fddd5fSVignesh Balu   *string = version_string;
996*62fddd5fSVignesh Balu   return ompd_rc_ok;
997*62fddd5fSVignesh Balu }
998*62fddd5fSVignesh Balu 
999*62fddd5fSVignesh Balu /* ------ Display Control Variables ----------------------------------------- */
1000*62fddd5fSVignesh Balu 
ompd_get_display_control_vars(ompd_address_space_handle_t * handle,const char * const ** control_vars)1001*62fddd5fSVignesh Balu ompd_rc_t ompd_get_display_control_vars(ompd_address_space_handle_t *handle,
1002*62fddd5fSVignesh Balu                                         const char *const **control_vars) {
1003*62fddd5fSVignesh Balu   if (!handle)
1004*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
1005*62fddd5fSVignesh Balu   if (!control_vars)
1006*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
1007*62fddd5fSVignesh Balu 
1008*62fddd5fSVignesh Balu   ompd_address_space_context_t *context = handle->context;
1009*62fddd5fSVignesh Balu   if (!context)
1010*62fddd5fSVignesh Balu     return ompd_rc_stale_handle;
1011*62fddd5fSVignesh Balu 
1012*62fddd5fSVignesh Balu   // runtime keeps a full dump of OMP/KMP definitions in this format
1013*62fddd5fSVignesh Balu   // <var1 name>=<var1 value>\n<var2 name>=<var2 value>\n...
1014*62fddd5fSVignesh Balu   ompd_address_t block_addr = {ompd_segment_none, 0};
1015*62fddd5fSVignesh Balu   OMPD_GET_VALUE(context, NULL, "ompd_env_block", type_sizes.sizeof_pointer,
1016*62fddd5fSVignesh Balu                  &block_addr.address);
1017*62fddd5fSVignesh Balu 
1018*62fddd5fSVignesh Balu   // query size of the block
1019*62fddd5fSVignesh Balu   ompd_size_t block_size;
1020*62fddd5fSVignesh Balu   OMPD_GET_VALUE(context, NULL, "ompd_env_block_size", sizeof(ompd_size_t),
1021*62fddd5fSVignesh Balu                  &block_size);
1022*62fddd5fSVignesh Balu 
1023*62fddd5fSVignesh Balu   // copy raw data from the address space
1024*62fddd5fSVignesh Balu   char *block;
1025*62fddd5fSVignesh Balu   OMPD_CALLBACK(alloc_memory, block_size, (void **)&block);
1026*62fddd5fSVignesh Balu   OMPD_CALLBACK(read_memory, context, NULL, &block_addr, block_size, block);
1027*62fddd5fSVignesh Balu 
1028*62fddd5fSVignesh Balu   // count number of items, replace new line to zero.
1029*62fddd5fSVignesh Balu   int block_items = 1; // also count the last "NULL" item
1030*62fddd5fSVignesh Balu   for (ompd_size_t i = 0; i < block_size; i++) {
1031*62fddd5fSVignesh Balu     if (block[i] == '\n') {
1032*62fddd5fSVignesh Balu       block_items++;
1033*62fddd5fSVignesh Balu       block[i] = '\0';
1034*62fddd5fSVignesh Balu     }
1035*62fddd5fSVignesh Balu   }
1036*62fddd5fSVignesh Balu 
1037*62fddd5fSVignesh Balu   // create vector of char*
1038*62fddd5fSVignesh Balu   const char **ctl_vars;
1039*62fddd5fSVignesh Balu   OMPD_CALLBACK(alloc_memory, block_items * sizeof(char *),
1040*62fddd5fSVignesh Balu                 (void **)(&ctl_vars));
1041*62fddd5fSVignesh Balu   char *pos = block;
1042*62fddd5fSVignesh Balu   ctl_vars[0] = block;
1043*62fddd5fSVignesh Balu 
1044*62fddd5fSVignesh Balu   // ctl_vars[0] points to the entire block, ctl_vars[1]... points to the
1045*62fddd5fSVignesh Balu   // smaller subsets of the block, and ctl_vars[block_items-2] points to the
1046*62fddd5fSVignesh Balu   // last string in the block.
1047*62fddd5fSVignesh Balu   for (int i = 1; i < block_items - 1; i++) {
1048*62fddd5fSVignesh Balu     while (*pos++ != '\0')
1049*62fddd5fSVignesh Balu       ;
1050*62fddd5fSVignesh Balu     if (pos > block + block_size)
1051*62fddd5fSVignesh Balu       return ompd_rc_error;
1052*62fddd5fSVignesh Balu     ctl_vars[i] = pos;
1053*62fddd5fSVignesh Balu   }
1054*62fddd5fSVignesh Balu   // last item must be NULL
1055*62fddd5fSVignesh Balu   ctl_vars[block_items - 1] = NULL;
1056*62fddd5fSVignesh Balu 
1057*62fddd5fSVignesh Balu   *control_vars = ctl_vars;
1058*62fddd5fSVignesh Balu 
1059*62fddd5fSVignesh Balu   return ompd_rc_ok;
1060*62fddd5fSVignesh Balu }
1061*62fddd5fSVignesh Balu 
ompd_rel_display_control_vars(const char * const ** control_vars)1062*62fddd5fSVignesh Balu ompd_rc_t ompd_rel_display_control_vars(const char *const **control_vars) {
1063*62fddd5fSVignesh Balu   if (!control_vars)
1064*62fddd5fSVignesh Balu     return ompd_rc_bad_input;
1065*62fddd5fSVignesh Balu 
1066*62fddd5fSVignesh Balu   char **ctl_vars = const_cast<char **>(*control_vars);
1067*62fddd5fSVignesh Balu 
1068*62fddd5fSVignesh Balu   // remove the raw block first
1069*62fddd5fSVignesh Balu   OMPD_CALLBACK(free_memory, (void *)ctl_vars[0]);
1070*62fddd5fSVignesh Balu   // remove the vector
1071*62fddd5fSVignesh Balu   OMPD_CALLBACK(free_memory, (void *)ctl_vars);
1072*62fddd5fSVignesh Balu 
1073*62fddd5fSVignesh Balu   return ompd_rc_ok;
1074*62fddd5fSVignesh Balu }
1075*62fddd5fSVignesh Balu 
1076*62fddd5fSVignesh Balu /* --- Helper functions ----------------------------------------------------- */
1077*62fddd5fSVignesh Balu 
initTypeSizes(ompd_address_space_context_t * context)1078*62fddd5fSVignesh Balu ompd_rc_t initTypeSizes(ompd_address_space_context_t *context) {
1079*62fddd5fSVignesh Balu   static int inited = 0;
1080*62fddd5fSVignesh Balu   static ompd_rc_t ret;
1081*62fddd5fSVignesh Balu   if (inited)
1082*62fddd5fSVignesh Balu     return ret;
1083*62fddd5fSVignesh Balu   ret = callbacks->sizeof_type(context, &type_sizes);
1084*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
1085*62fddd5fSVignesh Balu     return ret;
1086*62fddd5fSVignesh Balu   if (!(type_sizes.sizeof_pointer > 0))
1087*62fddd5fSVignesh Balu     return ompd_rc_error;
1088*62fddd5fSVignesh Balu   ret = callbacks->sizeof_type(context, &TValue::type_sizes);
1089*62fddd5fSVignesh Balu   if (ret != ompd_rc_ok)
1090*62fddd5fSVignesh Balu     return ret;
1091*62fddd5fSVignesh Balu   inited = 1;
1092*62fddd5fSVignesh Balu   return ret;
1093*62fddd5fSVignesh Balu }
1094