xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/IntelJITProfiling/jitprofiling.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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