xref: /freebsd/contrib/llvm-project/openmp/runtime/src/ompt-internal.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric /*
2*0b57cec5SDimitry Andric  * ompt-internal.h - header of OMPT internal data structures
3*0b57cec5SDimitry Andric  */
4*0b57cec5SDimitry Andric 
5*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
9*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10*0b57cec5SDimitry Andric //
11*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
12*0b57cec5SDimitry Andric 
13*0b57cec5SDimitry Andric #ifndef __OMPT_INTERNAL_H__
14*0b57cec5SDimitry Andric #define __OMPT_INTERNAL_H__
15*0b57cec5SDimitry Andric 
16*0b57cec5SDimitry Andric #include "ompt-event-specific.h"
17*0b57cec5SDimitry Andric #include "omp-tools.h"
18*0b57cec5SDimitry Andric 
19*0b57cec5SDimitry Andric #define OMPT_VERSION 1
20*0b57cec5SDimitry Andric 
21*0b57cec5SDimitry Andric #define _OMP_EXTERN extern "C"
22*0b57cec5SDimitry Andric 
23*0b57cec5SDimitry Andric #define OMPT_INVOKER(x)                                                        \
24*0b57cec5SDimitry Andric   ((x == fork_context_gnu) ? ompt_parallel_invoker_program                     \
25*0b57cec5SDimitry Andric                            : ompt_parallel_invoker_runtime)
26*0b57cec5SDimitry Andric 
27*0b57cec5SDimitry Andric #define ompt_callback(e) e##_callback
28*0b57cec5SDimitry Andric 
29*0b57cec5SDimitry Andric typedef struct ompt_callbacks_internal_s {
30*0b57cec5SDimitry Andric #define ompt_event_macro(event, callback, eventid)                             \
31*0b57cec5SDimitry Andric   callback ompt_callback(event);
32*0b57cec5SDimitry Andric 
33*0b57cec5SDimitry Andric   FOREACH_OMPT_EVENT(ompt_event_macro)
34*0b57cec5SDimitry Andric 
35*0b57cec5SDimitry Andric #undef ompt_event_macro
36*0b57cec5SDimitry Andric } ompt_callbacks_internal_t;
37*0b57cec5SDimitry Andric 
38*0b57cec5SDimitry Andric typedef struct ompt_callbacks_active_s {
39*0b57cec5SDimitry Andric   unsigned int enabled : 1;
40*0b57cec5SDimitry Andric #define ompt_event_macro(event, callback, eventid) unsigned int event : 1;
41*0b57cec5SDimitry Andric 
42*0b57cec5SDimitry Andric   FOREACH_OMPT_EVENT(ompt_event_macro)
43*0b57cec5SDimitry Andric 
44*0b57cec5SDimitry Andric #undef ompt_event_macro
45*0b57cec5SDimitry Andric } ompt_callbacks_active_t;
46*0b57cec5SDimitry Andric 
47*0b57cec5SDimitry Andric #define TASK_TYPE_DETAILS_FORMAT(info)                                         \
48*0b57cec5SDimitry Andric   ((info->td_flags.task_serial || info->td_flags.tasking_ser)                  \
49*0b57cec5SDimitry Andric        ? ompt_task_undeferred                                                  \
50*0b57cec5SDimitry Andric        : 0x0) |                                                                \
51*0b57cec5SDimitry Andric       ((!(info->td_flags.tiedness)) ? ompt_task_untied : 0x0) |                \
52*0b57cec5SDimitry Andric       (info->td_flags.final ? ompt_task_final : 0x0) |                         \
53*0b57cec5SDimitry Andric       (info->td_flags.merged_if0 ? ompt_task_mergeable : 0x0)
54*0b57cec5SDimitry Andric 
55*0b57cec5SDimitry Andric typedef struct {
56*0b57cec5SDimitry Andric   ompt_frame_t frame;
57*0b57cec5SDimitry Andric   ompt_data_t task_data;
58*0b57cec5SDimitry Andric   struct kmp_taskdata *scheduling_parent;
59*0b57cec5SDimitry Andric   int thread_num;
60*0b57cec5SDimitry Andric   int ndeps;
61*0b57cec5SDimitry Andric   ompt_dependence_t *deps;
62*0b57cec5SDimitry Andric } ompt_task_info_t;
63*0b57cec5SDimitry Andric 
64*0b57cec5SDimitry Andric typedef struct {
65*0b57cec5SDimitry Andric   ompt_data_t parallel_data;
66*0b57cec5SDimitry Andric   void *master_return_address;
67*0b57cec5SDimitry Andric } ompt_team_info_t;
68*0b57cec5SDimitry Andric 
69*0b57cec5SDimitry Andric typedef struct ompt_lw_taskteam_s {
70*0b57cec5SDimitry Andric   ompt_team_info_t ompt_team_info;
71*0b57cec5SDimitry Andric   ompt_task_info_t ompt_task_info;
72*0b57cec5SDimitry Andric   int heap;
73*0b57cec5SDimitry Andric   struct ompt_lw_taskteam_s *parent;
74*0b57cec5SDimitry Andric } ompt_lw_taskteam_t;
75*0b57cec5SDimitry Andric 
76*0b57cec5SDimitry Andric typedef struct {
77*0b57cec5SDimitry Andric   ompt_data_t thread_data;
78*0b57cec5SDimitry Andric   ompt_data_t task_data; /* stored here from implicit barrier-begin until
79*0b57cec5SDimitry Andric                             implicit-task-end */
80*0b57cec5SDimitry Andric   void *return_address; /* stored here on entry of runtime */
81*0b57cec5SDimitry Andric   ompt_state_t state;
82*0b57cec5SDimitry Andric   ompt_wait_id_t wait_id;
83*0b57cec5SDimitry Andric   int ompt_task_yielded;
84*0b57cec5SDimitry Andric   void *idle_frame;
85*0b57cec5SDimitry Andric } ompt_thread_info_t;
86*0b57cec5SDimitry Andric 
87*0b57cec5SDimitry Andric extern ompt_callbacks_internal_t ompt_callbacks;
88*0b57cec5SDimitry Andric 
89*0b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL
90*0b57cec5SDimitry Andric #if USE_FAST_MEMORY
91*0b57cec5SDimitry Andric #define KMP_OMPT_DEPS_ALLOC __kmp_fast_allocate
92*0b57cec5SDimitry Andric #define KMP_OMPT_DEPS_FREE __kmp_fast_free
93*0b57cec5SDimitry Andric #else
94*0b57cec5SDimitry Andric #define KMP_OMPT_DEPS_ALLOC __kmp_thread_malloc
95*0b57cec5SDimitry Andric #define KMP_OMPT_DEPS_FREE __kmp_thread_free
96*0b57cec5SDimitry Andric #endif
97*0b57cec5SDimitry Andric #endif /* OMPT_SUPPORT && OMPT_OPTIONAL */
98*0b57cec5SDimitry Andric 
99*0b57cec5SDimitry Andric #ifdef __cplusplus
100*0b57cec5SDimitry Andric extern "C" {
101*0b57cec5SDimitry Andric #endif
102*0b57cec5SDimitry Andric 
103*0b57cec5SDimitry Andric void ompt_pre_init(void);
104*0b57cec5SDimitry Andric void ompt_post_init(void);
105*0b57cec5SDimitry Andric void ompt_fini(void);
106*0b57cec5SDimitry Andric 
107*0b57cec5SDimitry Andric #define OMPT_GET_RETURN_ADDRESS(level) __builtin_return_address(level)
108*0b57cec5SDimitry Andric #define OMPT_GET_FRAME_ADDRESS(level) __builtin_frame_address(level)
109*0b57cec5SDimitry Andric 
110*0b57cec5SDimitry Andric int __kmp_control_tool(uint64_t command, uint64_t modifier, void *arg);
111*0b57cec5SDimitry Andric 
112*0b57cec5SDimitry Andric extern ompt_callbacks_active_t ompt_enabled;
113*0b57cec5SDimitry Andric 
114*0b57cec5SDimitry Andric #if KMP_OS_WINDOWS
115*0b57cec5SDimitry Andric #define UNLIKELY(x) (x)
116*0b57cec5SDimitry Andric #define OMPT_NOINLINE __declspec(noinline)
117*0b57cec5SDimitry Andric #else
118*0b57cec5SDimitry Andric #define UNLIKELY(x) __builtin_expect(!!(x), 0)
119*0b57cec5SDimitry Andric #define OMPT_NOINLINE __attribute__((noinline))
120*0b57cec5SDimitry Andric #endif
121*0b57cec5SDimitry Andric 
122*0b57cec5SDimitry Andric #ifdef __cplusplus
123*0b57cec5SDimitry Andric };
124*0b57cec5SDimitry Andric #endif
125*0b57cec5SDimitry Andric 
126*0b57cec5SDimitry Andric #endif
127