|  | //===-- IntelJITEventsWrapper.h - Intel JIT Events API Wrapper --*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // 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 |