summaryrefslogtreecommitdiff
path: root/openmp/libomptarget/include/ompt_device_callbacks.h
blob: 127e1895024931bc35ffe4a01da8f2dcc6f0cd67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//===--------- ompt_device_callbacks.h - OMPT callbacks -- C++ ----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Interface used by both target-independent and device-dependent runtimes
// to coordinate registration and invocation of OMPT callbacks
//
//===----------------------------------------------------------------------===//

#ifndef _OMPT_DEVICE_CALLBACKS_H
#define _OMPT_DEVICE_CALLBACKS_H

#ifdef OMPT_SUPPORT

#include "Debug.h"
#include <omp-tools.h>

#define DEBUG_PREFIX "OMPT"

#define FOREACH_OMPT_TARGET_CALLBACK(macro)                                    \
  FOREACH_OMPT_DEVICE_EVENT(macro)                                             \
  FOREACH_OMPT_NOEMI_EVENT(macro)                                              \
  FOREACH_OMPT_EMI_EVENT(macro)

/// Internal representation for OMPT device callback functions.
class OmptDeviceCallbacksTy {
public:
  /// Initialize the enabled flag and all the callbacks
  void init() {
    Enabled = false;
#define initName(Name, Type, Code) Name##_fn = 0;
    FOREACH_OMPT_TARGET_CALLBACK(initName)
#undef initName
  }

  /// Used to register callbacks. \p Lookup is used to query a given callback
  /// by name and the result is assigned to the corresponding callback function.
  void registerCallbacks(ompt_function_lookup_t Lookup) {
    Enabled = true;
#define OmptBindCallback(Name, Type, Code)                                     \
  Name##_fn = (Name##_t)Lookup(#Name);                                         \
  DP("OMPT: class bound %s=%p\n", #Name, ((void *)(uint64_t)Name##_fn));

    FOREACH_OMPT_TARGET_CALLBACK(OmptBindCallback);
#undef OmptBindCallback
  }

  /// Used to find a callback given its name
  ompt_interface_fn_t lookupCallback(const char *InterfaceFunctionName) {
#define OmptLookup(Name, Type, Code)                                           \
  if (strcmp(InterfaceFunctionName, #Name) == 0)                               \
    return (ompt_interface_fn_t)Name##_fn;

    FOREACH_OMPT_TARGET_CALLBACK(OmptLookup);
#undef OmptLookup
    return (ompt_interface_fn_t) nullptr;
  }

  /// Wrapper function to find a callback given its name
  static ompt_interface_fn_t doLookup(const char *InterfaceFunctionName);

private:
  /// Set to true if callbacks for this library have been initialized
  bool Enabled;

  /// Callback functions
#define DeclareName(Name, Type, Code) Name##_t Name##_fn;
  FOREACH_OMPT_TARGET_CALLBACK(DeclareName)
#undef DeclareName
};

/// Device callbacks object for the library that performs the instantiation
extern OmptDeviceCallbacksTy OmptDeviceCallbacks;

#endif // OMPT_SUPPORT

#endif // _OMPT_DEVICE_CALLBACKS_H