Home | History | Annotate | Download | only in IntelJITEvents
      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 
     23 namespace llvm {
     24 
     25 class 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   GetNewMethodIDPtr GetNewMethodIDFunc;
     39 
     40 public:
     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),
     49     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),
     61     GetNewMethodIDFunc(GetNewMethodIDImpl) {
     62   }
     63 
     64   // Sends an event announcing that a function has been emitted
     65   //   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
     97