diff options
author | 2015-12-18 15:04:48 +0000 | |
---|---|---|
committer | 2016-01-13 15:39:12 +0000 | |
commit | 5cc349f3dd578e974f78314c50b6a0267c23e591 (patch) | |
tree | 7d8bf706fd6aba6f298bfe212f75db0f66e94b81 /runtime/jit/debugger_interface.cc | |
parent | a38e418fb2d9b817309c54b54ca85039907c2bbb (diff) |
Report DWARF debug information for JITed code.
Change-Id: Ia5b2133c54386932c76c22774cf3d2ae61e0925f
Diffstat (limited to 'runtime/jit/debugger_interface.cc')
-rw-r--r-- | runtime/jit/debugger_interface.cc | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/runtime/jit/debugger_interface.cc b/runtime/jit/debugger_interface.cc index 3c2898b8ac..f08a1a9d90 100644 --- a/runtime/jit/debugger_interface.cc +++ b/runtime/jit/debugger_interface.cc @@ -16,6 +16,13 @@ #include "debugger_interface.h" +#include "base/logging.h" +#include "base/mutex.h" +#include "thread-inl.h" +#include "thread.h" + +#include <unordered_map> + namespace art { // ------------------------------------------------------------------- @@ -57,13 +64,19 @@ extern "C" { JITDescriptor __jit_debug_descriptor = { 1, JIT_NOACTION, nullptr, nullptr }; } -JITCodeEntry* CreateJITCodeEntry(const uint8_t *symfile_addr, uintptr_t symfile_size) { +static Mutex g_jit_debug_mutex("JIT debug interface lock", kJitDebugInterfaceLock); + +static JITCodeEntry* CreateJITCodeEntryInternal( + std::unique_ptr<const uint8_t[]> symfile_addr, + uintptr_t symfile_size) + REQUIRES(g_jit_debug_mutex) { + DCHECK(symfile_addr.get() != nullptr); + JITCodeEntry* entry = new JITCodeEntry; - entry->symfile_addr_ = symfile_addr; + entry->symfile_addr_ = symfile_addr.release(); entry->symfile_size_ = symfile_size; entry->prev_ = nullptr; - // TODO: Do we need a lock here? entry->next_ = __jit_debug_descriptor.first_entry_; if (entry->next_ != nullptr) { entry->next_->prev_ = entry; @@ -76,8 +89,7 @@ JITCodeEntry* CreateJITCodeEntry(const uint8_t *symfile_addr, uintptr_t symfile_ return entry; } -void DeleteJITCodeEntry(JITCodeEntry* entry) { - // TODO: Do we need a lock here? +static void DeleteJITCodeEntryInternal(JITCodeEntry* entry) REQUIRES(g_jit_debug_mutex) { if (entry->prev_ != nullptr) { entry->prev_->next_ = entry->next_; } else { @@ -91,7 +103,48 @@ void DeleteJITCodeEntry(JITCodeEntry* entry) { __jit_debug_descriptor.relevant_entry_ = entry; __jit_debug_descriptor.action_flag_ = JIT_UNREGISTER_FN; __jit_debug_register_code(); + delete[] entry->symfile_addr_; delete entry; } +JITCodeEntry* CreateJITCodeEntry(std::unique_ptr<const uint8_t[]> symfile_addr, + uintptr_t symfile_size) { + Thread* self = Thread::Current(); + MutexLock mu(self, g_jit_debug_mutex); + return CreateJITCodeEntryInternal(std::move(symfile_addr), symfile_size); +} + +void DeleteJITCodeEntry(JITCodeEntry* entry) { + Thread* self = Thread::Current(); + MutexLock mu(self, g_jit_debug_mutex); + DeleteJITCodeEntryInternal(entry); +} + +// Mapping from address to entry. It takes ownership of the entries +// so that the user of the JIT interface does not have to store them. +static std::unordered_map<uintptr_t, JITCodeEntry*> g_jit_code_entries; + +void CreateJITCodeEntryForAddress(uintptr_t address, + std::unique_ptr<const uint8_t[]> symfile_addr, + uintptr_t symfile_size) { + Thread* self = Thread::Current(); + MutexLock mu(self, g_jit_debug_mutex); + DCHECK_NE(address, 0u); + DCHECK(g_jit_code_entries.find(address) == g_jit_code_entries.end()); + JITCodeEntry* entry = CreateJITCodeEntryInternal(std::move(symfile_addr), symfile_size); + g_jit_code_entries.emplace(address, entry); +} + +bool DeleteJITCodeEntryForAddress(uintptr_t address) { + Thread* self = Thread::Current(); + MutexLock mu(self, g_jit_debug_mutex); + const auto& it = g_jit_code_entries.find(address); + if (it == g_jit_code_entries.end()) { + return false; + } + DeleteJITCodeEntryInternal(it->second); + g_jit_code_entries.erase(it); + return true; +} + } // namespace art |