1345153Sdim/*
2345153Sdim * ompt-internal.h - header of OMPT internal data structures
3345153Sdim */
4345153Sdim
5345153Sdim//===----------------------------------------------------------------------===//
6345153Sdim//
7353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8353358Sdim// See https://llvm.org/LICENSE.txt for license information.
9353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10345153Sdim//
11345153Sdim//===----------------------------------------------------------------------===//
12345153Sdim
13345153Sdim#ifndef __OMPT_INTERNAL_H__
14345153Sdim#define __OMPT_INTERNAL_H__
15345153Sdim
16345153Sdim#include "ompt-event-specific.h"
17345153Sdim#include "omp-tools.h"
18345153Sdim
19345153Sdim#define OMPT_VERSION 1
20345153Sdim
21345153Sdim#define _OMP_EXTERN extern "C"
22345153Sdim
23345153Sdim#define OMPT_INVOKER(x)                                                        \
24345153Sdim  ((x == fork_context_gnu) ? ompt_parallel_invoker_program                     \
25345153Sdim                           : ompt_parallel_invoker_runtime)
26345153Sdim
27345153Sdim#define ompt_callback(e) e##_callback
28345153Sdim
29345153Sdimtypedef struct ompt_callbacks_internal_s {
30345153Sdim#define ompt_event_macro(event, callback, eventid)                             \
31345153Sdim  callback ompt_callback(event);
32345153Sdim
33345153Sdim  FOREACH_OMPT_EVENT(ompt_event_macro)
34345153Sdim
35345153Sdim#undef ompt_event_macro
36345153Sdim} ompt_callbacks_internal_t;
37345153Sdim
38345153Sdimtypedef struct ompt_callbacks_active_s {
39345153Sdim  unsigned int enabled : 1;
40345153Sdim#define ompt_event_macro(event, callback, eventid) unsigned int event : 1;
41345153Sdim
42345153Sdim  FOREACH_OMPT_EVENT(ompt_event_macro)
43345153Sdim
44345153Sdim#undef ompt_event_macro
45345153Sdim} ompt_callbacks_active_t;
46345153Sdim
47345153Sdim#define TASK_TYPE_DETAILS_FORMAT(info)                                         \
48345153Sdim  ((info->td_flags.task_serial || info->td_flags.tasking_ser)                  \
49345153Sdim       ? ompt_task_undeferred                                                  \
50345153Sdim       : 0x0) |                                                                \
51345153Sdim      ((!(info->td_flags.tiedness)) ? ompt_task_untied : 0x0) |                \
52345153Sdim      (info->td_flags.final ? ompt_task_final : 0x0) |                         \
53345153Sdim      (info->td_flags.merged_if0 ? ompt_task_mergeable : 0x0)
54345153Sdim
55345153Sdimtypedef struct {
56345153Sdim  ompt_frame_t frame;
57345153Sdim  ompt_data_t task_data;
58345153Sdim  struct kmp_taskdata *scheduling_parent;
59345153Sdim  int thread_num;
60345153Sdim  int ndeps;
61345153Sdim  ompt_dependence_t *deps;
62345153Sdim} ompt_task_info_t;
63345153Sdim
64345153Sdimtypedef struct {
65345153Sdim  ompt_data_t parallel_data;
66345153Sdim  void *master_return_address;
67345153Sdim} ompt_team_info_t;
68345153Sdim
69345153Sdimtypedef struct ompt_lw_taskteam_s {
70345153Sdim  ompt_team_info_t ompt_team_info;
71345153Sdim  ompt_task_info_t ompt_task_info;
72345153Sdim  int heap;
73345153Sdim  struct ompt_lw_taskteam_s *parent;
74345153Sdim} ompt_lw_taskteam_t;
75345153Sdim
76345153Sdimtypedef struct {
77345153Sdim  ompt_data_t thread_data;
78345153Sdim  ompt_data_t task_data; /* stored here from implicit barrier-begin until
79345153Sdim                            implicit-task-end */
80345153Sdim  void *return_address; /* stored here on entry of runtime */
81345153Sdim  ompt_state_t state;
82345153Sdim  ompt_wait_id_t wait_id;
83345153Sdim  int ompt_task_yielded;
84360784Sdim  int parallel_flags; // information for the last parallel region invoked
85345153Sdim  void *idle_frame;
86345153Sdim} ompt_thread_info_t;
87345153Sdim
88345153Sdimextern ompt_callbacks_internal_t ompt_callbacks;
89345153Sdim
90353358Sdim#if OMPT_SUPPORT && OMPT_OPTIONAL
91345153Sdim#if USE_FAST_MEMORY
92345153Sdim#define KMP_OMPT_DEPS_ALLOC __kmp_fast_allocate
93345153Sdim#define KMP_OMPT_DEPS_FREE __kmp_fast_free
94345153Sdim#else
95345153Sdim#define KMP_OMPT_DEPS_ALLOC __kmp_thread_malloc
96345153Sdim#define KMP_OMPT_DEPS_FREE __kmp_thread_free
97345153Sdim#endif
98353358Sdim#endif /* OMPT_SUPPORT && OMPT_OPTIONAL */
99345153Sdim
100345153Sdim#ifdef __cplusplus
101345153Sdimextern "C" {
102345153Sdim#endif
103345153Sdim
104345153Sdimvoid ompt_pre_init(void);
105345153Sdimvoid ompt_post_init(void);
106345153Sdimvoid ompt_fini(void);
107345153Sdim
108345153Sdim#define OMPT_GET_RETURN_ADDRESS(level) __builtin_return_address(level)
109345153Sdim#define OMPT_GET_FRAME_ADDRESS(level) __builtin_frame_address(level)
110345153Sdim
111345153Sdimint __kmp_control_tool(uint64_t command, uint64_t modifier, void *arg);
112345153Sdim
113345153Sdimextern ompt_callbacks_active_t ompt_enabled;
114345153Sdim
115345153Sdim#if KMP_OS_WINDOWS
116345153Sdim#define UNLIKELY(x) (x)
117345153Sdim#define OMPT_NOINLINE __declspec(noinline)
118345153Sdim#else
119345153Sdim#define UNLIKELY(x) __builtin_expect(!!(x), 0)
120345153Sdim#define OMPT_NOINLINE __attribute__((noinline))
121345153Sdim#endif
122345153Sdim
123345153Sdim#ifdef __cplusplus
124345153Sdim};
125345153Sdim#endif
126345153Sdim
127345153Sdim#endif
128