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