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)) {}
79 RegisteredObjectBufferMap;
88 RegisteredObjectBufferMap ObjectBufferMap;
92 GDBJITRegistrationListener() : ObjectBufferMap() {}
96 ~GDBJITRegistrationListener()
override;
101 void NotifyObjectEmitted(
const ObjectFile &Object,
107 void NotifyFreeingObject(
const ObjectFile &Object)
override;
113 void deregisterObjectInternal(RegisteredObjectBufferMap::iterator
I);
136 GDBJITRegistrationListener::~GDBJITRegistrationListener() {
139 for (RegisteredObjectBufferMap::iterator
I = ObjectBufferMap.begin(),
140 E = ObjectBufferMap.end();
144 deregisterObjectInternal(
I);
146 ObjectBufferMap.clear();
149 void GDBJITRegistrationListener::NotifyObjectEmitted(
164 assert(Key &&
"Attempt to register a null object with a debugger.");
166 assert(ObjectBufferMap.find(Key) == ObjectBufferMap.end() &&
167 "Second attempt to perform debug registration.");
172 "Allocation failed when registering a JIT entry!\n");
174 JITCodeEntry->symfile_addr = Buffer;
175 JITCodeEntry->symfile_size = Size;
177 ObjectBufferMap[Key] = RegisteredObjectInfo(Size, JITCodeEntry,
178 std::move(DebugObj));
179 NotifyDebugger(JITCodeEntry);
183 void GDBJITRegistrationListener::NotifyFreeingObject(
const ObjectFile& Object) {
186 RegisteredObjectBufferMap::iterator
I = ObjectBufferMap.find(Key);
188 if (I != ObjectBufferMap.end()) {
189 deregisterObjectInternal(I);
190 ObjectBufferMap.erase(I);
194 void GDBJITRegistrationListener::deregisterObjectInternal(
195 RegisteredObjectBufferMap::iterator I) {
224 JITCodeEntry =
nullptr;
234 return &*GDBRegListener;
Information about the loaded object.
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
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
const char * symfile_addr
struct jit_descriptor __jit_debug_descriptor
MemoryBufferRef getMemoryBufferRef() const
static GCRegistry::Add< CoreCLRGC > E("coreclr","CoreCLR-compatible GC")
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
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
struct jit_code_entry * relevant_entry
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...