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