Files
clang-p2996/lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h
Jason Molenda 5e8dce4dbf Add new Queue, QueueItem, Queuelist, SBQueue, SBQueueItem classes to represent
libdispatch aka Grand Central Dispatch (GCD) queues.  Still fleshing out the
documentation and testing of these but the overall API is settling down so it's
a good time to check it in.
<rdar://problem/15600370> 

llvm-svn: 197190
2013-12-13 00:29:16 +00:00

188 lines
5.1 KiB
C++

//===-- 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);
void
PopulateQueueList (lldb_private::QueueList &queue_list);
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);
lldb::tid_t
GetNewThreadUniqueThreadID (lldb::ThreadSP original_thread_sp);
void
SetNewThreadThreadName (lldb::ThreadSP original_thread_sp, lldb::ThreadSP new_extended_thread_sp);
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);
void
SetNewThreadQueueID (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;
uint16_t queue_id_from_thread_info;
};
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_