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