1//===-- 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
21#include <jitprofiling.h>
22
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;
38  FinalizeThreadPtr FinalizeThreadFunc;
39  FinalizeProcessPtr FinalizeProcessFunc;
40  GetNewMethodIDPtr GetNewMethodIDFunc;
41
42public:
43  bool isAmplifierRunning() {
44    return iJIT_IsProfilingActive() == iJIT_SAMPLING_ON;
45  }
46
47  IntelJITEventsWrapper()
48  : NotifyEventFunc(::iJIT_NotifyEvent),
49    RegisterCallbackExFunc(::iJIT_RegisterCallbackEx),
50    IsProfilingActiveFunc(::iJIT_IsProfilingActive),
51    FinalizeThreadFunc(::FinalizeThread),
52    FinalizeProcessFunc(::FinalizeProcess),
53    GetNewMethodIDFunc(::iJIT_GetNewMethodID) {
54  }
55
56  IntelJITEventsWrapper(NotifyEventPtr NotifyEventImpl,
57                   RegisterCallbackExPtr RegisterCallbackExImpl,
58                   IsProfilingActivePtr IsProfilingActiveImpl,
59                   FinalizeThreadPtr FinalizeThreadImpl,
60                   FinalizeProcessPtr FinalizeProcessImpl,
61                   GetNewMethodIDPtr GetNewMethodIDImpl)
62  : NotifyEventFunc(NotifyEventImpl),
63    RegisterCallbackExFunc(RegisterCallbackExImpl),
64    IsProfilingActiveFunc(IsProfilingActiveImpl),
65    FinalizeThreadFunc(FinalizeThreadImpl),
66    FinalizeProcessFunc(FinalizeProcessImpl),
67    GetNewMethodIDFunc(GetNewMethodIDImpl) {
68  }
69
70  // Sends an event anncouncing that a function has been emitted
71  //   return values are event-specific.  See Intel documentation for details.
72  int  iJIT_NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) {
73    if (!NotifyEventFunc)
74      return -1;
75    return NotifyEventFunc(EventType, EventSpecificData);
76  }
77
78  // Registers a callback function to receive notice of profiling state changes
79  void iJIT_RegisterCallbackEx(void *UserData,
80                               iJIT_ModeChangedEx NewModeCallBackFuncEx) {
81    if (RegisterCallbackExFunc)
82      RegisterCallbackExFunc(UserData, NewModeCallBackFuncEx);
83  }
84
85  // Returns the current profiler mode
86  iJIT_IsProfilingActiveFlags iJIT_IsProfilingActive(void) {
87    if (!IsProfilingActiveFunc)
88      return iJIT_NOTHING_RUNNING;
89    return IsProfilingActiveFunc();
90  }
91
92  // Generates a locally unique method ID for use in code registration
93  unsigned int iJIT_GetNewMethodID(void) {
94    if (!GetNewMethodIDFunc)
95      return -1;
96    return GetNewMethodIDFunc();
97  }
98};
99
100} //namespace llvm
101
102#endif //INTEL_JIT_EVENTS_WRAPPER_H
103