1*9880d681SAndroid Build Coastguard Worker /*===-- jitprofiling.h - JIT Profiling API-------------------------*- C -*-===* 2*9880d681SAndroid Build Coastguard Worker * 3*9880d681SAndroid Build Coastguard Worker * The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker * 5*9880d681SAndroid Build Coastguard Worker * This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker * License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker * 8*9880d681SAndroid Build Coastguard Worker *===----------------------------------------------------------------------===* 9*9880d681SAndroid Build Coastguard Worker * 10*9880d681SAndroid Build Coastguard Worker * This file provides Intel(R) Performance Analyzer JIT (Just-In-Time) 11*9880d681SAndroid Build Coastguard Worker * Profiling API declaration. 12*9880d681SAndroid Build Coastguard Worker * 13*9880d681SAndroid Build Coastguard Worker * NOTE: This file comes in a style different from the rest of LLVM 14*9880d681SAndroid Build Coastguard Worker * source base since this is a piece of code shared from Intel(R) 15*9880d681SAndroid Build Coastguard Worker * products. Please do not reformat / re-style this code to make 16*9880d681SAndroid Build Coastguard Worker * subsequent merges and contributions from the original source base eaiser. 17*9880d681SAndroid Build Coastguard Worker * 18*9880d681SAndroid Build Coastguard Worker *===----------------------------------------------------------------------===*/ 19*9880d681SAndroid Build Coastguard Worker #ifndef __JITPROFILING_H__ 20*9880d681SAndroid Build Coastguard Worker #define __JITPROFILING_H__ 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker /* 23*9880d681SAndroid Build Coastguard Worker * Various constants used by functions 24*9880d681SAndroid Build Coastguard Worker */ 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker /* event notification */ 27*9880d681SAndroid Build Coastguard Worker typedef enum iJIT_jvm_event 28*9880d681SAndroid Build Coastguard Worker { 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker /* shutdown */ 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker /* 33*9880d681SAndroid Build Coastguard Worker * Program exiting EventSpecificData NA 34*9880d681SAndroid Build Coastguard Worker */ 35*9880d681SAndroid Build Coastguard Worker iJVM_EVENT_TYPE_SHUTDOWN = 2, 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker /* JIT profiling */ 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker /* 40*9880d681SAndroid Build Coastguard Worker * issued after method code jitted into memory but before code is executed 41*9880d681SAndroid Build Coastguard Worker * EventSpecificData is an iJIT_Method_Load 42*9880d681SAndroid Build Coastguard Worker */ 43*9880d681SAndroid Build Coastguard Worker iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED=13, 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker /* issued before unload. Method code will no longer be executed, but code 46*9880d681SAndroid Build Coastguard Worker * and info are still in memory. The VTune profiler may capture method 47*9880d681SAndroid Build Coastguard Worker * code only at this point EventSpecificData is iJIT_Method_Id 48*9880d681SAndroid Build Coastguard Worker */ 49*9880d681SAndroid Build Coastguard Worker iJVM_EVENT_TYPE_METHOD_UNLOAD_START, 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker /* Method Profiling */ 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker /* method name, Id and stack is supplied 54*9880d681SAndroid Build Coastguard Worker * issued when a method is about to be entered EventSpecificData is 55*9880d681SAndroid Build Coastguard Worker * iJIT_Method_NIDS 56*9880d681SAndroid Build Coastguard Worker */ 57*9880d681SAndroid Build Coastguard Worker iJVM_EVENT_TYPE_ENTER_NIDS = 19, 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker /* method name, Id and stack is supplied 60*9880d681SAndroid Build Coastguard Worker * issued when a method is about to be left EventSpecificData is 61*9880d681SAndroid Build Coastguard Worker * iJIT_Method_NIDS 62*9880d681SAndroid Build Coastguard Worker */ 63*9880d681SAndroid Build Coastguard Worker iJVM_EVENT_TYPE_LEAVE_NIDS 64*9880d681SAndroid Build Coastguard Worker } iJIT_JVM_EVENT; 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker typedef enum _iJIT_ModeFlags 67*9880d681SAndroid Build Coastguard Worker { 68*9880d681SAndroid Build Coastguard Worker /* No need to Notify VTune, since VTune is not running */ 69*9880d681SAndroid Build Coastguard Worker iJIT_NO_NOTIFICATIONS = 0x0000, 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker /* when turned on the jit must call 72*9880d681SAndroid Build Coastguard Worker * iJIT_NotifyEvent 73*9880d681SAndroid Build Coastguard Worker * ( 74*9880d681SAndroid Build Coastguard Worker * iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, 75*9880d681SAndroid Build Coastguard Worker * ) 76*9880d681SAndroid Build Coastguard Worker * for all the method already jitted 77*9880d681SAndroid Build Coastguard Worker */ 78*9880d681SAndroid Build Coastguard Worker iJIT_BE_NOTIFY_ON_LOAD = 0x0001, 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker /* when turned on the jit must call 81*9880d681SAndroid Build Coastguard Worker * iJIT_NotifyEvent 82*9880d681SAndroid Build Coastguard Worker * ( 83*9880d681SAndroid Build Coastguard Worker * iJVM_EVENT_TYPE_METHOD_UNLOAD_FINISHED, 84*9880d681SAndroid Build Coastguard Worker * ) for all the method that are unloaded 85*9880d681SAndroid Build Coastguard Worker */ 86*9880d681SAndroid Build Coastguard Worker iJIT_BE_NOTIFY_ON_UNLOAD = 0x0002, 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker /* when turned on the jit must instrument all 89*9880d681SAndroid Build Coastguard Worker * the currently jited code with calls on 90*9880d681SAndroid Build Coastguard Worker * method entries 91*9880d681SAndroid Build Coastguard Worker */ 92*9880d681SAndroid Build Coastguard Worker iJIT_BE_NOTIFY_ON_METHOD_ENTRY = 0x0004, 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker /* when turned on the jit must instrument all 95*9880d681SAndroid Build Coastguard Worker * the currently jited code with calls 96*9880d681SAndroid Build Coastguard Worker * on method exit 97*9880d681SAndroid Build Coastguard Worker */ 98*9880d681SAndroid Build Coastguard Worker iJIT_BE_NOTIFY_ON_METHOD_EXIT = 0x0008 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker } iJIT_ModeFlags; 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker /* Flags used by iJIT_IsProfilingActive() */ 104*9880d681SAndroid Build Coastguard Worker typedef enum _iJIT_IsProfilingActiveFlags 105*9880d681SAndroid Build Coastguard Worker { 106*9880d681SAndroid Build Coastguard Worker /* No profiler is running. Currently not used */ 107*9880d681SAndroid Build Coastguard Worker iJIT_NOTHING_RUNNING = 0x0000, 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker /* Sampling is running. This is the default value 110*9880d681SAndroid Build Coastguard Worker * returned by iJIT_IsProfilingActive() 111*9880d681SAndroid Build Coastguard Worker */ 112*9880d681SAndroid Build Coastguard Worker iJIT_SAMPLING_ON = 0x0001, 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker /* Call Graph is running */ 115*9880d681SAndroid Build Coastguard Worker iJIT_CALLGRAPH_ON = 0x0002 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker } iJIT_IsProfilingActiveFlags; 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker /* Enumerator for the environment of methods*/ 120*9880d681SAndroid Build Coastguard Worker typedef enum _iJDEnvironmentType 121*9880d681SAndroid Build Coastguard Worker { 122*9880d681SAndroid Build Coastguard Worker iJDE_JittingAPI = 2 123*9880d681SAndroid Build Coastguard Worker } iJDEnvironmentType; 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker /********************************** 126*9880d681SAndroid Build Coastguard Worker * Data structures for the events * 127*9880d681SAndroid Build Coastguard Worker **********************************/ 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker /* structure for the events: 130*9880d681SAndroid Build Coastguard Worker * iJVM_EVENT_TYPE_METHOD_UNLOAD_START 131*9880d681SAndroid Build Coastguard Worker */ 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker typedef struct _iJIT_Method_Id 134*9880d681SAndroid Build Coastguard Worker { 135*9880d681SAndroid Build Coastguard Worker /* Id of the method (same as the one passed in 136*9880d681SAndroid Build Coastguard Worker * the iJIT_Method_Load struct 137*9880d681SAndroid Build Coastguard Worker */ 138*9880d681SAndroid Build Coastguard Worker unsigned int method_id; 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker } *piJIT_Method_Id, iJIT_Method_Id; 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker /* structure for the events: 144*9880d681SAndroid Build Coastguard Worker * iJVM_EVENT_TYPE_ENTER_NIDS, 145*9880d681SAndroid Build Coastguard Worker * iJVM_EVENT_TYPE_LEAVE_NIDS, 146*9880d681SAndroid Build Coastguard Worker * iJVM_EVENT_TYPE_EXCEPTION_OCCURRED_NIDS 147*9880d681SAndroid Build Coastguard Worker */ 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker typedef struct _iJIT_Method_NIDS 150*9880d681SAndroid Build Coastguard Worker { 151*9880d681SAndroid Build Coastguard Worker /* unique method ID */ 152*9880d681SAndroid Build Coastguard Worker unsigned int method_id; 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker /* NOTE: no need to fill this field, it's filled by VTune */ 155*9880d681SAndroid Build Coastguard Worker unsigned int stack_id; 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker /* method name (just the method, without the class) */ 158*9880d681SAndroid Build Coastguard Worker char* method_name; 159*9880d681SAndroid Build Coastguard Worker } *piJIT_Method_NIDS, iJIT_Method_NIDS; 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker /* structures for the events: 162*9880d681SAndroid Build Coastguard Worker * iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED 163*9880d681SAndroid Build Coastguard Worker */ 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker typedef struct _LineNumberInfo 166*9880d681SAndroid Build Coastguard Worker { 167*9880d681SAndroid Build Coastguard Worker /* x86 Offset from the beginning of the method*/ 168*9880d681SAndroid Build Coastguard Worker unsigned int Offset; 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker /* source line number from the beginning of the source file */ 171*9880d681SAndroid Build Coastguard Worker unsigned int LineNumber; 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker } *pLineNumberInfo, LineNumberInfo; 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker typedef struct _iJIT_Method_Load 176*9880d681SAndroid Build Coastguard Worker { 177*9880d681SAndroid Build Coastguard Worker /* unique method ID - can be any unique value, (except 0 - 999) */ 178*9880d681SAndroid Build Coastguard Worker unsigned int method_id; 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker /* method name (can be with or without the class and signature, in any case 181*9880d681SAndroid Build Coastguard Worker * the class name will be added to it) 182*9880d681SAndroid Build Coastguard Worker */ 183*9880d681SAndroid Build Coastguard Worker char* method_name; 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker /* virtual address of that method - This determines the method range for the 186*9880d681SAndroid Build Coastguard Worker * iJVM_EVENT_TYPE_ENTER/LEAVE_METHOD_ADDR events 187*9880d681SAndroid Build Coastguard Worker */ 188*9880d681SAndroid Build Coastguard Worker void* method_load_address; 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker /* Size in memory - Must be exact */ 191*9880d681SAndroid Build Coastguard Worker unsigned int method_size; 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker /* Line Table size in number of entries - Zero if none */ 194*9880d681SAndroid Build Coastguard Worker unsigned int line_number_size; 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker /* Pointer to the beginning of the line numbers info array */ 197*9880d681SAndroid Build Coastguard Worker pLineNumberInfo line_number_table; 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker /* unique class ID */ 200*9880d681SAndroid Build Coastguard Worker unsigned int class_id; 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker /* class file name */ 203*9880d681SAndroid Build Coastguard Worker char* class_file_name; 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker /* source file name */ 206*9880d681SAndroid Build Coastguard Worker char* source_file_name; 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker /* bits supplied by the user for saving in the JIT file */ 209*9880d681SAndroid Build Coastguard Worker void* user_data; 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker /* the size of the user data buffer */ 212*9880d681SAndroid Build Coastguard Worker unsigned int user_data_size; 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker /* NOTE: no need to fill this field, it's filled by VTune */ 215*9880d681SAndroid Build Coastguard Worker iJDEnvironmentType env; 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker } *piJIT_Method_Load, iJIT_Method_Load; 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Worker /* API Functions */ 220*9880d681SAndroid Build Coastguard Worker #ifdef __cplusplus 221*9880d681SAndroid Build Coastguard Worker extern "C" { 222*9880d681SAndroid Build Coastguard Worker #endif 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker #ifndef CDECL 225*9880d681SAndroid Build Coastguard Worker # if defined WIN32 || defined _WIN32 226*9880d681SAndroid Build Coastguard Worker # define CDECL __cdecl 227*9880d681SAndroid Build Coastguard Worker # else /* defined WIN32 || defined _WIN32 */ 228*9880d681SAndroid Build Coastguard Worker # if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ 229*9880d681SAndroid Build Coastguard Worker # define CDECL /* not actual on x86_64 platform */ 230*9880d681SAndroid Build Coastguard Worker # else /* _M_X64 || _M_AMD64 || __x86_64__ */ 231*9880d681SAndroid Build Coastguard Worker # define CDECL __attribute__ ((cdecl)) 232*9880d681SAndroid Build Coastguard Worker # endif /* _M_X64 || _M_AMD64 || __x86_64__ */ 233*9880d681SAndroid Build Coastguard Worker # endif /* defined WIN32 || defined _WIN32 */ 234*9880d681SAndroid Build Coastguard Worker #endif /* CDECL */ 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker #define JITAPI CDECL 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker /* called when the settings are changed with new settings */ 239*9880d681SAndroid Build Coastguard Worker typedef void (*iJIT_ModeChangedEx)(void *UserData, iJIT_ModeFlags Flags); 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Worker int JITAPI iJIT_NotifyEvent(iJIT_JVM_EVENT event_type, void *EventSpecificData); 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker /* The new mode call back routine */ 244*9880d681SAndroid Build Coastguard Worker void JITAPI iJIT_RegisterCallbackEx(void *userdata, 245*9880d681SAndroid Build Coastguard Worker iJIT_ModeChangedEx NewModeCallBackFuncEx); 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive(void); 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker void JITAPI FinalizeThread(void); 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker void JITAPI FinalizeProcess(void); 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Worker unsigned int JITAPI iJIT_GetNewMethodID(void); 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker #ifdef __cplusplus 256*9880d681SAndroid Build Coastguard Worker } 257*9880d681SAndroid Build Coastguard Worker #endif 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker #endif /* __JITPROFILING_H__ */ 260