20 using namespace llvm::object;
56 #if !defined(_MSC_VER)
57 asm volatile(
"":::
"memory");
65 struct RegisteredObjectInfo {
66 RegisteredObjectInfo() {}
70 : Size(Size), Entry(Entry), Obj(std::move(Obj)) {}
72 RegisteredObjectInfo(RegisteredObjectInfo &&
Other)
75 RegisteredObjectInfo& operator=(RegisteredObjectInfo &&
Other) {
78 Obj = std::move(
Other.Obj);
89 RegisteredObjectBufferMap;
98 RegisteredObjectBufferMap ObjectBufferMap;
102 GDBJITRegistrationListener() : ObjectBufferMap() {}
106 ~GDBJITRegistrationListener()
override;
111 void NotifyObjectEmitted(
const ObjectFile &Object,
117 void NotifyFreeingObject(
const ObjectFile &Object)
override;
123 void deregisterObjectInternal(RegisteredObjectBufferMap::iterator
I);
146 GDBJITRegistrationListener::~GDBJITRegistrationListener() {
149 for (RegisteredObjectBufferMap::iterator
I = ObjectBufferMap.begin(),
150 E = ObjectBufferMap.end();
154 deregisterObjectInternal(
I);
156 ObjectBufferMap.clear();
159 void GDBJITRegistrationListener::NotifyObjectEmitted(
174 assert(Key &&
"Attempt to register a null object with a debugger.");
176 assert(ObjectBufferMap.find(Key) == ObjectBufferMap.end() &&
177 "Second attempt to perform debug registration.");
182 "Allocation failed when registering a JIT entry!\n");
184 JITCodeEntry->symfile_addr = Buffer;
185 JITCodeEntry->symfile_size = Size;
187 ObjectBufferMap[Key] = RegisteredObjectInfo(Size, JITCodeEntry,
188 std::move(DebugObj));
189 NotifyDebugger(JITCodeEntry);
193 void GDBJITRegistrationListener::NotifyFreeingObject(
const ObjectFile& Object) {
196 RegisteredObjectBufferMap::iterator
I = ObjectBufferMap.find(Key);
198 if (I != ObjectBufferMap.end()) {
199 deregisterObjectInternal(I);
200 ObjectBufferMap.erase(I);
204 void GDBJITRegistrationListener::deregisterObjectInternal(
205 RegisteredObjectBufferMap::iterator I) {
234 JITCodeEntry =
nullptr;
244 return &*GDBRegListener;
Information about the loaded object.
JITEventListener - Abstract interface for use by the JIT to notify clients about significant events d...
static JITEventListener * createGDBRegistrationListener()
This class is the base class for all object file types.
const char * getBufferStart() const
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
Reports a serious error, calling any installed error handler.
const char * symfile_addr
struct jit_descriptor __jit_debug_descriptor
MemoryBufferRef getMemoryBufferRef() const
struct jit_code_entry * first_entry
Instances of this class acquire a given Mutex Lock when constructed and hold that lock until destruct...
LLVM_ATTRIBUTE_NOINLINE void __jit_debug_register_code()
size_t getBufferSize() const
virtual object::OwningBinary< object::ObjectFile > getObjectForDebug(const object::ObjectFile &Obj) const =0
#define LLVM_ATTRIBUTE_NOINLINE
LLVM_ATTRIBUTE_NOINLINE - On compilers where we have a directive to do so, mark a method "not for inl...
struct jit_code_entry * prev_entry
struct jit_code_entry * next_entry
struct jit_code_entry * relevant_entry
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...