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