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