blob: 777d0f179cb5a96f3f47dae909d3c0d8330b18a9 [file] [log] [blame]
Eli Bendersky5262ad22012-03-13 08:33:15 +00001//===-- IntelJITEventsWrapper.h - Intel JIT Events API Wrapper --*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines a wrapper for the Intel JIT Events API. It allows for the
11// implementation of the jitprofiling library to be swapped with an alternative
12// implementation (for testing). To include this file, you must have the
13// jitprofiling.h header available; it is available in Intel(R) VTune(TM)
14// Amplifier XE 2011.
15//
16//===----------------------------------------------------------------------===//
17
18#ifndef INTEL_JIT_EVENTS_WRAPPER_H
19#define INTEL_JIT_EVENTS_WRAPPER_H
20
Andrew Kaylor5808c7d2012-09-28 17:35:20 +000021#include "jitprofiling.h"
Eli Bendersky5262ad22012-03-13 08:33:15 +000022
23namespace llvm {
24
25class IntelJITEventsWrapper {
26 // Function pointer types for testing implementation of Intel jitprofiling
27 // library
28 typedef int (*NotifyEventPtr)(iJIT_JVM_EVENT, void*);
29 typedef void (*RegisterCallbackExPtr)(void *, iJIT_ModeChangedEx );
30 typedef iJIT_IsProfilingActiveFlags (*IsProfilingActivePtr)(void);
31 typedef void (*FinalizeThreadPtr)(void);
32 typedef void (*FinalizeProcessPtr)(void);
33 typedef unsigned int (*GetNewMethodIDPtr)(void);
34
35 NotifyEventPtr NotifyEventFunc;
36 RegisterCallbackExPtr RegisterCallbackExFunc;
37 IsProfilingActivePtr IsProfilingActiveFunc;
Eli Bendersky5262ad22012-03-13 08:33:15 +000038 GetNewMethodIDPtr GetNewMethodIDFunc;
39
40public:
41 bool isAmplifierRunning() {
42 return iJIT_IsProfilingActive() == iJIT_SAMPLING_ON;
43 }
44
45 IntelJITEventsWrapper()
46 : NotifyEventFunc(::iJIT_NotifyEvent),
47 RegisterCallbackExFunc(::iJIT_RegisterCallbackEx),
48 IsProfilingActiveFunc(::iJIT_IsProfilingActive),
Eli Bendersky5262ad22012-03-13 08:33:15 +000049 GetNewMethodIDFunc(::iJIT_GetNewMethodID) {
50 }
51
52 IntelJITEventsWrapper(NotifyEventPtr NotifyEventImpl,
53 RegisterCallbackExPtr RegisterCallbackExImpl,
54 IsProfilingActivePtr IsProfilingActiveImpl,
55 FinalizeThreadPtr FinalizeThreadImpl,
56 FinalizeProcessPtr FinalizeProcessImpl,
57 GetNewMethodIDPtr GetNewMethodIDImpl)
58 : NotifyEventFunc(NotifyEventImpl),
59 RegisterCallbackExFunc(RegisterCallbackExImpl),
60 IsProfilingActiveFunc(IsProfilingActiveImpl),
Eli Bendersky5262ad22012-03-13 08:33:15 +000061 GetNewMethodIDFunc(GetNewMethodIDImpl) {
62 }
63
Yaron Kerena17df032013-11-15 11:42:49 +000064 // Sends an event announcing that a function has been emitted
Eli Bendersky5262ad22012-03-13 08:33:15 +000065 // return values are event-specific. See Intel documentation for details.
66 int iJIT_NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) {
67 if (!NotifyEventFunc)
68 return -1;
69 return NotifyEventFunc(EventType, EventSpecificData);
70 }
71
72 // Registers a callback function to receive notice of profiling state changes
73 void iJIT_RegisterCallbackEx(void *UserData,
74 iJIT_ModeChangedEx NewModeCallBackFuncEx) {
75 if (RegisterCallbackExFunc)
76 RegisterCallbackExFunc(UserData, NewModeCallBackFuncEx);
77 }
78
79 // Returns the current profiler mode
80 iJIT_IsProfilingActiveFlags iJIT_IsProfilingActive(void) {
81 if (!IsProfilingActiveFunc)
82 return iJIT_NOTHING_RUNNING;
83 return IsProfilingActiveFunc();
84 }
85
86 // Generates a locally unique method ID for use in code registration
87 unsigned int iJIT_GetNewMethodID(void) {
88 if (!GetNewMethodIDFunc)
89 return -1;
90 return GetNewMethodIDFunc();
91 }
92};
93
94} //namespace llvm
95
96#endif //INTEL_JIT_EVENTS_WRAPPER_H