| //===--------- 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 |