JITEventListener.h revision 321369
1//===- JITEventListener.h - Exposes events from JIT compilation -*- 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 the JITEventListener interface, which lets users get
11// callbacks when significant events happen during the JIT compilation process.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H
16#define LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H
17
18#include "llvm/Config/llvm-config.h"
19#include "llvm/ExecutionEngine/RuntimeDyld.h"
20#include "llvm/IR/DebugLoc.h"
21#include <cstdint>
22#include <vector>
23
24namespace llvm {
25
26class IntelJITEventsWrapper;
27class MachineFunction;
28class OProfileWrapper;
29
30namespace object {
31
32class ObjectFile;
33
34} // end namespace object
35
36/// JITEvent_EmittedFunctionDetails - Helper struct for containing information
37/// about a generated machine code function.
38struct JITEvent_EmittedFunctionDetails {
39  struct LineStart {
40    /// The address at which the current line changes.
41    uintptr_t Address;
42
43    /// The new location information.  These can be translated to DebugLocTuples
44    /// using MF->getDebugLocTuple().
45    DebugLoc Loc;
46  };
47
48  /// The machine function the struct contains information for.
49  const MachineFunction *MF;
50
51  /// The list of line boundary information, sorted by address.
52  std::vector<LineStart> LineStarts;
53};
54
55/// JITEventListener - Abstract interface for use by the JIT to notify clients
56/// about significant events during compilation. For example, to notify
57/// profilers and debuggers that need to know where functions have been emitted.
58///
59/// The default implementation of each method does nothing.
60class JITEventListener {
61public:
62  using EmittedFunctionDetails = JITEvent_EmittedFunctionDetails;
63
64public:
65  JITEventListener() = default;
66  virtual ~JITEventListener() = default;
67
68  /// NotifyObjectEmitted - Called after an object has been successfully
69  /// emitted to memory.  NotifyFunctionEmitted will not be called for
70  /// individual functions in the object.
71  ///
72  /// ELF-specific information
73  /// The ObjectImage contains the generated object image
74  /// with section headers updated to reflect the address at which sections
75  /// were loaded and with relocations performed in-place on debug sections.
76  virtual void NotifyObjectEmitted(const object::ObjectFile &Obj,
77                                   const RuntimeDyld::LoadedObjectInfo &L) {}
78
79  /// NotifyFreeingObject - Called just before the memory associated with
80  /// a previously emitted object is released.
81  virtual void NotifyFreeingObject(const object::ObjectFile &Obj) {}
82
83  // Get a pointe to the GDB debugger registration listener.
84  static JITEventListener *createGDBRegistrationListener();
85
86#if LLVM_USE_INTEL_JITEVENTS
87  // Construct an IntelJITEventListener
88  static JITEventListener *createIntelJITEventListener();
89
90  // Construct an IntelJITEventListener with a test Intel JIT API implementation
91  static JITEventListener *createIntelJITEventListener(
92                                      IntelJITEventsWrapper* AlternativeImpl);
93#else
94  static JITEventListener *createIntelJITEventListener() { return nullptr; }
95
96  static JITEventListener *createIntelJITEventListener(
97                                      IntelJITEventsWrapper* AlternativeImpl) {
98    return nullptr;
99  }
100#endif // USE_INTEL_JITEVENTS
101
102#if LLVM_USE_OPROFILE
103  // Construct an OProfileJITEventListener
104  static JITEventListener *createOProfileJITEventListener();
105
106  // Construct an OProfileJITEventListener with a test opagent implementation
107  static JITEventListener *createOProfileJITEventListener(
108                                      OProfileWrapper* AlternativeImpl);
109#else
110  static JITEventListener *createOProfileJITEventListener() { return nullptr; }
111
112  static JITEventListener *createOProfileJITEventListener(
113                                      OProfileWrapper* AlternativeImpl) {
114    return nullptr;
115  }
116#endif // USE_OPROFILE
117
118private:
119  virtual void anchor();
120};
121
122} // end namespace llvm
123
124#endif // LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H
125