Reverting r222828 and r222810-r222812 as they broke the build on Windows.
[oota-llvm.git] / include / llvm / ExecutionEngine / JITEventListener.h
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/IR/DebugLoc.h"
20 #include "llvm/Support/DataTypes.h"
21 #include <vector>
22
23 namespace llvm {
24 class Function;
25 class MachineFunction;
26 class OProfileWrapper;
27 class IntelJITEventsWrapper;
28 class ObjectImage;
29
30 /// JITEvent_EmittedFunctionDetails - Helper struct for containing information
31 /// about a generated machine code function.
32 struct JITEvent_EmittedFunctionDetails {
33   struct LineStart {
34     /// The address at which the current line changes.
35     uintptr_t Address;
36
37     /// The new location information.  These can be translated to DebugLocTuples
38     /// using MF->getDebugLocTuple().
39     DebugLoc Loc;
40   };
41
42   /// The machine function the struct contains information for.
43   const MachineFunction *MF;
44
45   /// The list of line boundary information, sorted by address.
46   std::vector<LineStart> LineStarts;
47 };
48
49 /// JITEventListener - Abstract interface for use by the JIT to notify clients
50 /// about significant events during compilation. For example, to notify
51 /// profilers and debuggers that need to know where functions have been emitted.
52 ///
53 /// The default implementation of each method does nothing.
54 class JITEventListener {
55 public:
56   typedef JITEvent_EmittedFunctionDetails EmittedFunctionDetails;
57
58 public:
59   JITEventListener() {}
60   virtual ~JITEventListener();
61
62   /// NotifyObjectEmitted - Called after an object has been successfully
63   /// emitted to memory.  NotifyFunctionEmitted will not be called for
64   /// individual functions in the object.
65   ///
66   /// ELF-specific information
67   /// The ObjectImage contains the generated object image
68   /// with section headers updated to reflect the address at which sections
69   /// were loaded and with relocations performed in-place on debug sections.
70   virtual void NotifyObjectEmitted(const ObjectImage &Obj) {}
71
72   /// NotifyFreeingObject - Called just before the memory associated with
73   /// a previously emitted object is released.
74   virtual void NotifyFreeingObject(const ObjectImage &Obj) {}
75
76 #if LLVM_USE_INTEL_JITEVENTS
77   // Construct an IntelJITEventListener
78   static JITEventListener *createIntelJITEventListener();
79
80   // Construct an IntelJITEventListener with a test Intel JIT API implementation
81   static JITEventListener *createIntelJITEventListener(
82                                       IntelJITEventsWrapper* AlternativeImpl);
83 #else
84   static JITEventListener *createIntelJITEventListener() { return nullptr; }
85
86   static JITEventListener *createIntelJITEventListener(
87                                       IntelJITEventsWrapper* AlternativeImpl) {
88     return nullptr;
89   }
90 #endif // USE_INTEL_JITEVENTS
91
92 #if LLVM_USE_OPROFILE
93   // Construct an OProfileJITEventListener
94   static JITEventListener *createOProfileJITEventListener();
95
96   // Construct an OProfileJITEventListener with a test opagent implementation
97   static JITEventListener *createOProfileJITEventListener(
98                                       OProfileWrapper* AlternativeImpl);
99 #else
100
101   static JITEventListener *createOProfileJITEventListener() { return nullptr; }
102
103   static JITEventListener *createOProfileJITEventListener(
104                                       OProfileWrapper* AlternativeImpl) {
105     return nullptr;
106   }
107 #endif // USE_OPROFILE
108
109 };
110
111 } // end namespace llvm.
112
113 #endif // defined LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H