diff --git a/openmp/libomptarget/include/ompt_device_callbacks.h b/openmp/libomptarget/include/ompt_device_callbacks.h new file mode 100644 --- /dev/null +++ b/openmp/libomptarget/include/ompt_device_callbacks.h @@ -0,0 +1,64 @@ +//===--------- 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 + +#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 + } + +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 ompt_device_callbacks; + +#endif // OMPT_SUPPORT + +#endif // _OMPT_DEVICE_CALLBACKS_H diff --git a/openmp/libomptarget/src/ompt_callback.cpp b/openmp/libomptarget/src/ompt_callback.cpp --- a/openmp/libomptarget/src/ompt_callback.cpp +++ b/openmp/libomptarget/src/ompt_callback.cpp @@ -19,12 +19,15 @@ #include "omp-tools.h" #include "ompt_connector.h" +#include "ompt_device_callbacks.h" #include "private.h" #define fnptr_to_ptr(x) ((void *)(uint64_t)x) /// Used to indicate whether OMPT was enabled for this library bool ompt_enabled = false; +/// Object maintaining all the callbacks for this library +OmptDeviceCallbacksTy ompt_device_callbacks; /// This is the function called by the higher layer (libomp) responsible /// for initializing OMPT in this library. This is passed to libomp @@ -37,7 +40,11 @@ ompt_data_t *tool_data) { DP("enter ompt_libomptarget_initialize!\n"); ompt_enabled = true; - // TODO use the parameters to populate callbacks in libomptarget + // The lookup parameter is provided by libomp which already has the + // tool callbacks registered at this point. The registration call + // below causes the same callback functions to be registered in + // libomptarget as well + ompt_device_callbacks.registerCallbacks(lookup); DP("exit ompt_libomptarget_initialize!\n"); return 0; } @@ -68,6 +75,9 @@ OmptResult.finalize = ompt_libomptarget_finalize; OmptResult.tool_data.value = 0; + // Initialize the device callbacks first + ompt_device_callbacks.init(); + // Now call connect that causes the above init/fini functions to be called LibompConnector.connect(&OmptResult); DP("OMPT: Exit ompt_init\n");