diff options
Diffstat (limited to 'lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h')
| -rw-r--r-- | lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h b/lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h new file mode 100644 index 00000000000..e8862d6166b --- /dev/null +++ b/lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h @@ -0,0 +1,174 @@ +//===-- SystemRuntimeMacOSX.h -----------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_SystemRuntimeMacOSX_h_ +#define liblldb_SystemRuntimeMacOSX_h_ + +// C Includes +// C++ Includes +#include <map> +#include <vector> +#include <string> + +// Other libraries and framework includes +#include "llvm/Support/MachO.h" + +#include "lldb/Target/SystemRuntime.h" +#include "lldb/Host/FileSpec.h" +#include "lldb/Core/ConstString.h" +#include "lldb/Core/ModuleList.h" +#include "lldb/Core/UUID.h" +#include "lldb/Host/Mutex.h" +#include "lldb/Target/Process.h" + +class SystemRuntimeMacOSX : public lldb_private::SystemRuntime +{ +public: + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void + Initialize(); + + static void + Terminate(); + + static lldb_private::ConstString + GetPluginNameStatic(); + + static const char * + GetPluginDescriptionStatic(); + + static lldb_private::SystemRuntime * + CreateInstance (lldb_private::Process *process); + + SystemRuntimeMacOSX (lldb_private::Process *process); + + virtual + ~SystemRuntimeMacOSX (); + + void + Clear (bool clear_process); + + void + DidAttach (); + + void + DidLaunch(); + + void + ModulesDidLoad (lldb_private::ModuleList &module_list); + + const std::vector<lldb_private::ConstString> & + GetExtendedBacktraceTypes (); + + lldb::ThreadSP + GetExtendedBacktraceThread (lldb::ThreadSP thread, lldb_private::ConstString type); + + // REMOVE THE FOLLOWING 4 + bool + SetItemEnqueuedBreakpoint (); + + bool + DidSetItemEnqueuedBreakpoint () const; + + static bool + ItemEnqueuedCallback (void *baton, lldb_private::StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id); + + bool + ItemEnqueuedBreakpointHit (lldb_private::StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id); + + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + virtual lldb_private::ConstString + GetPluginName(); + + virtual uint32_t + GetPluginVersion(); + +private: + struct ArchivedBacktrace { + uint32_t stop_id; + bool stop_id_is_valid; + lldb::queue_id_t libdispatch_queue_id; // LLDB_INVALID_QUEUE_ID if unavailable + std::vector<lldb::addr_t> pcs; + }; + + SystemRuntimeMacOSX::ArchivedBacktrace + GetLibdispatchExtendedBacktrace (lldb::ThreadSP thread); + +protected: + lldb::user_id_t m_break_id; + mutable lldb_private::Mutex m_mutex; + +private: + + void + ParseLdiHeaders (); + + bool + LdiHeadersInitialized (); + + lldb::addr_t + GetQueuesHead (); + + lldb::addr_t + GetItemsHead (); + + lldb::addr_t + GetThreadCreatorItem (lldb::ThreadSP thread); + + void + SetNewThreadQueueName (lldb::ThreadSP original_thread_sp, lldb::ThreadSP new_extended_thread_sp); + + void + SetNewThreadExtendedBacktraceToken (lldb::ThreadSP original_thread_sp, lldb::ThreadSP new_extended_thread_sp); + + struct ldi_queue_offsets { + uint16_t next; + uint16_t prev; + uint16_t queue_id; + uint16_t current_item_ptr; + }; + + struct ldi_item_offsets { + uint16_t next; + uint16_t prev; + uint16_t type; + uint16_t identifier; + uint16_t stop_id; + uint16_t backtrace_length; + uint16_t backtrace_ptr; + uint16_t thread_name_ptr; + uint16_t queue_name_ptr; + uint16_t unique_thread_id; + uint16_t pthread_id; + uint16_t enqueueing_thread_dispatch_queue_t; + uint16_t enqueueing_thread_dispatch_block_ptr; + }; + + struct ldi_header { + uint16_t version; + uint16_t ldi_header_size; + uint16_t initialized; // 0 means uninitialized + uint16_t queue_size; + uint16_t item_size; + uint64_t queues_head_ptr_address; // Address of queues head structure + uint64_t items_head_ptr_address; // Address of items_head + struct ldi_queue_offsets queue_offsets; + struct ldi_item_offsets item_offsets; + }; + + struct ldi_header m_ldi_header; + + DISALLOW_COPY_AND_ASSIGN (SystemRuntimeMacOSX); +}; + +#endif // liblldb_SystemRuntimeMacOSX_h_ |

