1 //===-- IntelJITEventsWrapper.h - Intel JIT Events API Wrapper --*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines a wrapper for the Intel JIT Events API. It allows for the 11 // implementation of the jitprofiling library to be swapped with an alternative 12 // implementation (for testing). To include this file, you must have the 13 // jitprofiling.h header available; it is available in Intel(R) VTune(TM) 14 // Amplifier XE 2011. 15 // 16 //===----------------------------------------------------------------------===// 17 18 #ifndef INTEL_JIT_EVENTS_WRAPPER_H 19 #define INTEL_JIT_EVENTS_WRAPPER_H 20 21 #include "jitprofiling.h" 22 23 namespace llvm { 24 25 class IntelJITEventsWrapper { 26 // Function pointer types for testing implementation of Intel jitprofiling 27 // library 28 typedef int (*NotifyEventPtr)(iJIT_JVM_EVENT, void*); 29 typedef void (*RegisterCallbackExPtr)(void *, iJIT_ModeChangedEx ); 30 typedef iJIT_IsProfilingActiveFlags (*IsProfilingActivePtr)(void); 31 typedef void (*FinalizeThreadPtr)(void); 32 typedef void (*FinalizeProcessPtr)(void); 33 typedef unsigned int (*GetNewMethodIDPtr)(void); 34 35 NotifyEventPtr NotifyEventFunc; 36 RegisterCallbackExPtr RegisterCallbackExFunc; 37 IsProfilingActivePtr IsProfilingActiveFunc; 38 GetNewMethodIDPtr GetNewMethodIDFunc; 39 40 public: 41 bool isAmplifierRunning() { 42 return iJIT_IsProfilingActive() == iJIT_SAMPLING_ON; 43 } 44 45 IntelJITEventsWrapper() 46 : NotifyEventFunc(::iJIT_NotifyEvent), 47 RegisterCallbackExFunc(::iJIT_RegisterCallbackEx), 48 IsProfilingActiveFunc(::iJIT_IsProfilingActive), 49 GetNewMethodIDFunc(::iJIT_GetNewMethodID) { 50 } 51 52 IntelJITEventsWrapper(NotifyEventPtr NotifyEventImpl, 53 RegisterCallbackExPtr RegisterCallbackExImpl, 54 IsProfilingActivePtr IsProfilingActiveImpl, 55 FinalizeThreadPtr FinalizeThreadImpl, 56 FinalizeProcessPtr FinalizeProcessImpl, 57 GetNewMethodIDPtr GetNewMethodIDImpl) 58 : NotifyEventFunc(NotifyEventImpl), 59 RegisterCallbackExFunc(RegisterCallbackExImpl), 60 IsProfilingActiveFunc(IsProfilingActiveImpl), 61 GetNewMethodIDFunc(GetNewMethodIDImpl) { 62 } 63 64 // Sends an event anncouncing that a function has been emitted 65 // return values are event-specific. See Intel documentation for details. 66 int iJIT_NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) { 67 if (!NotifyEventFunc) 68 return -1; 69 return NotifyEventFunc(EventType, EventSpecificData); 70 } 71 72 // Registers a callback function to receive notice of profiling state changes 73 void iJIT_RegisterCallbackEx(void *UserData, 74 iJIT_ModeChangedEx NewModeCallBackFuncEx) { 75 if (RegisterCallbackExFunc) 76 RegisterCallbackExFunc(UserData, NewModeCallBackFuncEx); 77 } 78 79 // Returns the current profiler mode 80 iJIT_IsProfilingActiveFlags iJIT_IsProfilingActive(void) { 81 if (!IsProfilingActiveFunc) 82 return iJIT_NOTHING_RUNNING; 83 return IsProfilingActiveFunc(); 84 } 85 86 // Generates a locally unique method ID for use in code registration 87 unsigned int iJIT_GetNewMethodID(void) { 88 if (!GetNewMethodIDFunc) 89 return -1; 90 return GetNewMethodIDFunc(); 91 } 92 }; 93 94 } //namespace llvm 95 96 #endif //INTEL_JIT_EVENTS_WRAPPER_H 97