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-c/ExecutionEngine.h" 19 #include "llvm/Config/llvm-config.h" 20 #include "llvm/ExecutionEngine/RuntimeDyld.h" 21 #include "llvm/IR/DebugLoc.h" 22 #include "llvm/Support/CBindingWrapping.h" 23 #include <cstdint> 24 #include <vector> 25 26 namespace llvm { 27 28 class IntelJITEventsWrapper; 29 class MachineFunction; 30 class OProfileWrapper; 31 32 namespace object { 33 34 class ObjectFile; 35 36 } // end namespace object 37 38 /// JITEventListener - Abstract interface for use by the JIT to notify clients 39 /// about significant events during compilation. For example, to notify 40 /// profilers and debuggers that need to know where functions have been emitted. 41 /// 42 /// The default implementation of each method does nothing. 43 class JITEventListener { 44 public: 45 using ObjectKey = uint64_t; 46 47 JITEventListener() = default; 48 virtual ~JITEventListener() = default; 49 50 /// notifyObjectLoaded - Called after an object has had its sections allocated 51 /// and addresses assigned to all symbols. Note: Section memory will not have 52 /// been relocated yet. notifyFunctionLoaded will not be called for 53 /// individual functions in the object. 54 /// 55 /// ELF-specific information 56 /// The ObjectImage contains the generated object image 57 /// with section headers updated to reflect the address at which sections 58 /// were loaded and with relocations performed in-place on debug sections. notifyObjectLoaded(ObjectKey K,const object::ObjectFile & Obj,const RuntimeDyld::LoadedObjectInfo & L)59 virtual void notifyObjectLoaded(ObjectKey K, const object::ObjectFile &Obj, 60 const RuntimeDyld::LoadedObjectInfo &L) {} 61 62 /// notifyFreeingObject - Called just before the memory associated with 63 /// a previously emitted object is released. notifyFreeingObject(ObjectKey K)64 virtual void notifyFreeingObject(ObjectKey K) {} 65 66 // Get a pointe to the GDB debugger registration listener. 67 static JITEventListener *createGDBRegistrationListener(); 68 69 #if LLVM_USE_INTEL_JITEVENTS 70 // Construct an IntelJITEventListener 71 static JITEventListener *createIntelJITEventListener(); 72 73 // Construct an IntelJITEventListener with a test Intel JIT API implementation 74 static JITEventListener *createIntelJITEventListener( 75 IntelJITEventsWrapper* AlternativeImpl); 76 #else createIntelJITEventListener()77 static JITEventListener *createIntelJITEventListener() { return nullptr; } 78 createIntelJITEventListener(IntelJITEventsWrapper * AlternativeImpl)79 static JITEventListener *createIntelJITEventListener( 80 IntelJITEventsWrapper* AlternativeImpl) { 81 return nullptr; 82 } 83 #endif // USE_INTEL_JITEVENTS 84 85 #if LLVM_USE_OPROFILE 86 // Construct an OProfileJITEventListener 87 static JITEventListener *createOProfileJITEventListener(); 88 89 // Construct an OProfileJITEventListener with a test opagent implementation 90 static JITEventListener *createOProfileJITEventListener( 91 OProfileWrapper* AlternativeImpl); 92 #else createOProfileJITEventListener()93 static JITEventListener *createOProfileJITEventListener() { return nullptr; } 94 createOProfileJITEventListener(OProfileWrapper * AlternativeImpl)95 static JITEventListener *createOProfileJITEventListener( 96 OProfileWrapper* AlternativeImpl) { 97 return nullptr; 98 } 99 #endif // USE_OPROFILE 100 101 #if LLVM_USE_PERF 102 static JITEventListener *createPerfJITEventListener(); 103 #else createPerfJITEventListener()104 static JITEventListener *createPerfJITEventListener() 105 { 106 return nullptr; 107 } 108 #endif // USE_PERF 109 110 private: 111 virtual void anchor(); 112 }; 113 114 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITEventListener, LLVMJITEventListenerRef) 115 116 } // end namespace llvm 117 118 #endif // LLVM_EXECUTIONENGINE_JITEVENTLISTENER_H 119