10b57cec5SDimitry Andric /*
20b57cec5SDimitry Andric  * ompt-internal.h - header of OMPT internal data structures
30b57cec5SDimitry Andric  */
40b57cec5SDimitry Andric 
50b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
80b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
90b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef __OMPT_INTERNAL_H__
140b57cec5SDimitry Andric #define __OMPT_INTERNAL_H__
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "ompt-event-specific.h"
170b57cec5SDimitry Andric #include "omp-tools.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric #define OMPT_VERSION 1
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric #define _OMP_EXTERN extern "C"
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric #define OMPT_INVOKER(x)                                                        \
240b57cec5SDimitry Andric   ((x == fork_context_gnu) ? ompt_parallel_invoker_program                     \
250b57cec5SDimitry Andric                            : ompt_parallel_invoker_runtime)
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric #define ompt_callback(e) e##_callback
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric typedef struct ompt_callbacks_internal_s {
300b57cec5SDimitry Andric #define ompt_event_macro(event, callback, eventid)                             \
310b57cec5SDimitry Andric   callback ompt_callback(event);
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric   FOREACH_OMPT_EVENT(ompt_event_macro)
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric #undef ompt_event_macro
360b57cec5SDimitry Andric } ompt_callbacks_internal_t;
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric typedef struct ompt_callbacks_active_s {
390b57cec5SDimitry Andric   unsigned int enabled : 1;
400b57cec5SDimitry Andric #define ompt_event_macro(event, callback, eventid) unsigned int event : 1;
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric   FOREACH_OMPT_EVENT(ompt_event_macro)
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric #undef ompt_event_macro
450b57cec5SDimitry Andric } ompt_callbacks_active_t;
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric #define TASK_TYPE_DETAILS_FORMAT(info)                                         \
480b57cec5SDimitry Andric   ((info->td_flags.task_serial || info->td_flags.tasking_ser)                  \
490b57cec5SDimitry Andric        ? ompt_task_undeferred                                                  \
500b57cec5SDimitry Andric        : 0x0) |                                                                \
510b57cec5SDimitry Andric       ((!(info->td_flags.tiedness)) ? ompt_task_untied : 0x0) |                \
520b57cec5SDimitry Andric       (info->td_flags.final ? ompt_task_final : 0x0) |                         \
530b57cec5SDimitry Andric       (info->td_flags.merged_if0 ? ompt_task_mergeable : 0x0)
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric typedef struct {
560b57cec5SDimitry Andric   ompt_frame_t frame;
570b57cec5SDimitry Andric   ompt_data_t task_data;
580b57cec5SDimitry Andric   struct kmp_taskdata *scheduling_parent;
590b57cec5SDimitry Andric   int thread_num;
6081ad6265SDimitry Andric   ompt_dispatch_chunk_t dispatch_chunk;
610b57cec5SDimitry Andric } ompt_task_info_t;
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric typedef struct {
640b57cec5SDimitry Andric   ompt_data_t parallel_data;
650b57cec5SDimitry Andric   void *master_return_address;
660b57cec5SDimitry Andric } ompt_team_info_t;
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric typedef struct ompt_lw_taskteam_s {
690b57cec5SDimitry Andric   ompt_team_info_t ompt_team_info;
700b57cec5SDimitry Andric   ompt_task_info_t ompt_task_info;
710b57cec5SDimitry Andric   int heap;
720b57cec5SDimitry Andric   struct ompt_lw_taskteam_s *parent;
730b57cec5SDimitry Andric } ompt_lw_taskteam_t;
740b57cec5SDimitry Andric 
750b57cec5SDimitry Andric typedef struct {
760b57cec5SDimitry Andric   ompt_data_t thread_data;
770b57cec5SDimitry Andric   ompt_data_t task_data; /* stored here from implicit barrier-begin until
780b57cec5SDimitry Andric                             implicit-task-end */
7906c3fb27SDimitry Andric   ompt_data_t target_task_data; /* required by target support */
800b57cec5SDimitry Andric   void *return_address; /* stored here on entry of runtime */
810b57cec5SDimitry Andric   ompt_state_t state;
820b57cec5SDimitry Andric   ompt_wait_id_t wait_id;
830b57cec5SDimitry Andric   int ompt_task_yielded;
84489b1cf2SDimitry Andric   int parallel_flags; // information for the last parallel region invoked
850b57cec5SDimitry Andric   void *idle_frame;
860b57cec5SDimitry Andric } ompt_thread_info_t;
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric extern ompt_callbacks_internal_t ompt_callbacks;
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
910b57cec5SDimitry Andric #if USE_FAST_MEMORY
920b57cec5SDimitry Andric #define KMP_OMPT_DEPS_ALLOC __kmp_fast_allocate
930b57cec5SDimitry Andric #define KMP_OMPT_DEPS_FREE __kmp_fast_free
940b57cec5SDimitry Andric #else
950b57cec5SDimitry Andric #define KMP_OMPT_DEPS_ALLOC __kmp_thread_malloc
960b57cec5SDimitry Andric #define KMP_OMPT_DEPS_FREE __kmp_thread_free
970b57cec5SDimitry Andric #endif
980b57cec5SDimitry Andric #endif /* OMPT_SUPPORT && OMPT_OPTIONAL */
990b57cec5SDimitry Andric 
1000b57cec5SDimitry Andric #ifdef __cplusplus
1010b57cec5SDimitry Andric extern "C" {
1020b57cec5SDimitry Andric #endif
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric void ompt_pre_init(void);
1050b57cec5SDimitry Andric void ompt_post_init(void);
1060b57cec5SDimitry Andric void ompt_fini(void);
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric #define OMPT_GET_RETURN_ADDRESS(level) __builtin_return_address(level)
1090b57cec5SDimitry Andric #define OMPT_GET_FRAME_ADDRESS(level) __builtin_frame_address(level)
1100b57cec5SDimitry Andric 
1110b57cec5SDimitry Andric int __kmp_control_tool(uint64_t command, uint64_t modifier, void *arg);
1120b57cec5SDimitry Andric 
1130b57cec5SDimitry Andric extern ompt_callbacks_active_t ompt_enabled;
1140b57cec5SDimitry Andric 
1150b57cec5SDimitry Andric #if KMP_OS_WINDOWS
1160b57cec5SDimitry Andric #define UNLIKELY(x) (x)
1170b57cec5SDimitry Andric #define OMPT_NOINLINE __declspec(noinline)
1180b57cec5SDimitry Andric #else
1190b57cec5SDimitry Andric #define UNLIKELY(x) __builtin_expect(!!(x), 0)
1200b57cec5SDimitry Andric #define OMPT_NOINLINE __attribute__((noinline))
1210b57cec5SDimitry Andric #endif
1220b57cec5SDimitry Andric 
1230b57cec5SDimitry Andric #ifdef __cplusplus
124fe6060f1SDimitry Andric }
1250b57cec5SDimitry Andric #endif
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric #endif
128