| //===-- IntelJITEventsWrapper.h - Intel JIT Events API Wrapper --*- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines a wrapper for the Intel JIT Events API. It allows for the |
| // implementation of the jitprofiling library to be swapped with an alternative |
| // implementation (for testing). To include this file, you must have the |
| // jitprofiling.h header available; it is available in Intel(R) VTune(TM) |
| // Amplifier XE 2011. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef INTEL_JIT_EVENTS_WRAPPER_H |
| #define INTEL_JIT_EVENTS_WRAPPER_H |
| |
| #include "jitprofiling.h" |
| |
| namespace llvm { |
| |
| class IntelJITEventsWrapper { |
| // Function pointer types for testing implementation of Intel jitprofiling |
| // library |
| typedef int (*NotifyEventPtr)(iJIT_JVM_EVENT, void*); |
| typedef void (*RegisterCallbackExPtr)(void *, iJIT_ModeChangedEx ); |
| typedef iJIT_IsProfilingActiveFlags (*IsProfilingActivePtr)(void); |
| typedef void (*FinalizeThreadPtr)(void); |
| typedef void (*FinalizeProcessPtr)(void); |
| typedef unsigned int (*GetNewMethodIDPtr)(void); |
| |
| NotifyEventPtr NotifyEventFunc; |
| RegisterCallbackExPtr RegisterCallbackExFunc; |
| IsProfilingActivePtr IsProfilingActiveFunc; |
| GetNewMethodIDPtr GetNewMethodIDFunc; |
| |
| public: |
| bool isAmplifierRunning() { |
| return iJIT_IsProfilingActive() == iJIT_SAMPLING_ON; |
| } |
| |
| IntelJITEventsWrapper() |
| : NotifyEventFunc(::iJIT_NotifyEvent), |
| RegisterCallbackExFunc(::iJIT_RegisterCallbackEx), |
| IsProfilingActiveFunc(::iJIT_IsProfilingActive), |
| GetNewMethodIDFunc(::iJIT_GetNewMethodID) { |
| } |
| |
| IntelJITEventsWrapper(NotifyEventPtr NotifyEventImpl, |
| RegisterCallbackExPtr RegisterCallbackExImpl, |
| IsProfilingActivePtr IsProfilingActiveImpl, |
| FinalizeThreadPtr FinalizeThreadImpl, |
| FinalizeProcessPtr FinalizeProcessImpl, |
| GetNewMethodIDPtr GetNewMethodIDImpl) |
| : NotifyEventFunc(NotifyEventImpl), |
| RegisterCallbackExFunc(RegisterCallbackExImpl), |
| IsProfilingActiveFunc(IsProfilingActiveImpl), |
| GetNewMethodIDFunc(GetNewMethodIDImpl) { |
| } |
| |
| // Sends an event announcing that a function has been emitted |
| // return values are event-specific. See Intel documentation for details. |
| int iJIT_NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) { |
| if (!NotifyEventFunc) |
| return -1; |
| return NotifyEventFunc(EventType, EventSpecificData); |
| } |
| |
| // Registers a callback function to receive notice of profiling state changes |
| void iJIT_RegisterCallbackEx(void *UserData, |
| iJIT_ModeChangedEx NewModeCallBackFuncEx) { |
| if (RegisterCallbackExFunc) |
| RegisterCallbackExFunc(UserData, NewModeCallBackFuncEx); |
| } |
| |
| // Returns the current profiler mode |
| iJIT_IsProfilingActiveFlags iJIT_IsProfilingActive(void) { |
| if (!IsProfilingActiveFunc) |
| return iJIT_NOTHING_RUNNING; |
| return IsProfilingActiveFunc(); |
| } |
| |
| // Generates a locally unique method ID for use in code registration |
| unsigned int iJIT_GetNewMethodID(void) { |
| if (!GetNewMethodIDFunc) |
| return -1; |
| return GetNewMethodIDFunc(); |
| } |
| }; |
| |
| } //namespace llvm |
| |
| #endif //INTEL_JIT_EVENTS_WRAPPER_H |