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/Support/DataTypes.h" 20 #include "llvm/Support/DebugLoc.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 /// NotifyFunctionEmitted - Called after a function has been successfully 63 /// emitted to memory. The function still has its MachineFunction attached, 64 /// if you should happen to need that. 65 virtual void NotifyFunctionEmitted(const Function &, 66 void *, size_t, 67 const EmittedFunctionDetails &) {} 68 69 /// NotifyFreeingMachineCode - Called from freeMachineCodeForFunction(), after 70 /// the global mapping is removed, but before the machine code is returned to 71 /// the allocator. 72 /// 73 /// OldPtr is the address of the machine code and will be the same as the Code 74 /// parameter to a previous NotifyFunctionEmitted call. The Function passed 75 /// to NotifyFunctionEmitted may have been destroyed by the time of the 76 /// matching NotifyFreeingMachineCode call. 77 virtual void NotifyFreeingMachineCode(void *) {} 78 79 /// NotifyObjectEmitted - Called after an object has been successfully 80 /// emitted to memory. NotifyFunctionEmitted will not be called for 81 /// individual functions in the object. 82 /// 83 /// ELF-specific information 84 /// The ObjectImage contains the generated object image 85 /// with section headers updated to reflect the address at which sections 86 /// were loaded and with relocations performed in-place on debug sections. 87 virtual void NotifyObjectEmitted(const ObjectImage &Obj) {} 88 89 /// NotifyFreeingObject - Called just before the memory associated with 90 /// a previously emitted object is released. 91 virtual void NotifyFreeingObject(const ObjectImage &Obj) {} 92 93 #if LLVM_USE_INTEL_JITEVENTS 94 // Construct an IntelJITEventListener 95 static JITEventListener *createIntelJITEventListener(); 96 97 // Construct an IntelJITEventListener with a test Intel JIT API implementation 98 static JITEventListener *createIntelJITEventListener( 99 IntelJITEventsWrapper* AlternativeImpl); 100 #else 101 static JITEventListener *createIntelJITEventListener() { return 0; } 102 103 static JITEventListener *createIntelJITEventListener( 104 IntelJITEventsWrapper* AlternativeImpl) { 105 return 0; 106 } 107 #endif // USE_INTEL_JITEVENTS 108 109 #if LLVM_USE_OPROFILE 110 // Construct an OProfileJITEventListener 111 static JITEventListener *createOProfileJITEventListener(); 112 113 // Construct an OProfileJITEventListener with a test opagent implementation 114 static JITEventListener *createOProfileJITEventListener( 115 OProfileWrapper* AlternativeImpl); 116 #else 117 118 static JITEventListener *createOProfileJITEventListener() { return 0; } 119 120 static JITEventListener *createOProfileJITEventListener( 121 OProfileWrapper* AlternativeImpl) { 122 return 0; 123 } 124 #endif // USE_OPROFILE 125 126 }; 127 128 } // end namespace llvm. 129 130 #endif // defined LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H 131