xref: /aosp_15_r20/external/llvm/lib/ExecutionEngine/IntelJITEvents/jitprofiling.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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