//===-- IntelJITEventsWrapper.h - Intel JIT Events API Wrapper --*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file defines a wrapper for the Intel JIT Events API. It allows for the
// implementation of the jitprofiling library to be swapped with an alternative
// implementation (for testing). To include this file, you must have the
// jitprofiling.h header available; it is available in Intel(R) VTune(TM)
// Amplifier XE 2011.
//
//===----------------------------------------------------------------------===//

#ifndef INTEL_JIT_EVENTS_WRAPPER_H
#define INTEL_JIT_EVENTS_WRAPPER_H

#include "jitprofiling.h"

namespace llvm {

typedef enum {
  LoadBinaryModule,
  LoadBinarySection,
  UnloadBinaryModule,
  UnloadBinarySection
} IttEventType;

class IntelJITEventsWrapper {
  // Function pointer types for testing implementation of Intel jitprofiling
  // library
  typedef int (*NotifyEventPtr)(iJIT_JVM_EVENT, void*);
  typedef int (*IttnotifyInfoPtr)(IttEventType, const char *, unsigned int);
  typedef void (*RegisterCallbackExPtr)(void *, iJIT_ModeChangedEx );
  typedef iJIT_IsProfilingActiveFlags (*IsProfilingActivePtr)(void);
  typedef void (*FinalizeThreadPtr)(void);
  typedef void (*FinalizeProcessPtr)(void);
  typedef unsigned int (*GetNewMethodIDPtr)(void);

  NotifyEventPtr NotifyEventFunc;
  IttnotifyInfoPtr IttnotifyInfoFunc;
  RegisterCallbackExPtr RegisterCallbackExFunc;
  IsProfilingActivePtr IsProfilingActiveFunc;
  GetNewMethodIDPtr GetNewMethodIDFunc;

public:
  bool isAmplifierRunning() {
    return iJIT_IsProfilingActive() == iJIT_SAMPLING_ON;
  }

  IntelJITEventsWrapper()
      : NotifyEventFunc(::iJIT_NotifyEvent), IttnotifyInfoFunc(0),
        RegisterCallbackExFunc(::iJIT_RegisterCallbackEx),
        IsProfilingActiveFunc(::iJIT_IsProfilingActive),
        GetNewMethodIDFunc(::iJIT_GetNewMethodID) {}

  IntelJITEventsWrapper(NotifyEventPtr NotifyEventImpl,
                        IttnotifyInfoPtr IttnotifyInfoImpl,
                        RegisterCallbackExPtr RegisterCallbackExImpl,
                        IsProfilingActivePtr IsProfilingActiveImpl,
                        FinalizeThreadPtr FinalizeThreadImpl,
                        FinalizeProcessPtr FinalizeProcessImpl,
                        GetNewMethodIDPtr GetNewMethodIDImpl)
      : NotifyEventFunc(NotifyEventImpl), IttnotifyInfoFunc(IttnotifyInfoImpl),
        RegisterCallbackExFunc(RegisterCallbackExImpl),
        IsProfilingActiveFunc(IsProfilingActiveImpl),
        GetNewMethodIDFunc(GetNewMethodIDImpl) {}

  // Sends an event announcing that a function has been emitted
  //   return values are event-specific.  See Intel documentation for details.
  int  iJIT_NotifyEvent(iJIT_JVM_EVENT EventType, void *EventSpecificData) {
    if (!NotifyEventFunc)
      return -1;
    return NotifyEventFunc(EventType, EventSpecificData);
  }

  int iJitIttNotifyInfo(IttEventType EventType, const char *Name,
                        unsigned int Size) {
    if (!IttnotifyInfoFunc)
      return -1;
    return IttnotifyInfoFunc(EventType, Name, Size);
  }

  // Registers a callback function to receive notice of profiling state changes
  void iJIT_RegisterCallbackEx(void *UserData,
                               iJIT_ModeChangedEx NewModeCallBackFuncEx) {
    if (RegisterCallbackExFunc)
      RegisterCallbackExFunc(UserData, NewModeCallBackFuncEx);
  }

  // Returns the current profiler mode
  iJIT_IsProfilingActiveFlags iJIT_IsProfilingActive(void) {
    if (!IsProfilingActiveFunc)
      return iJIT_NOTHING_RUNNING;
    return IsProfilingActiveFunc();
  }

  // Generates a locally unique method ID for use in code registration
  unsigned int iJIT_GetNewMethodID(void) {
    if (!GetNewMethodIDFunc)
      return -1;
    return GetNewMethodIDFunc();
  }
};

} //namespace llvm

#endif //INTEL_JIT_EVENTS_WRAPPER_H
