Initial merge of some of the iOS 8 / Mac OS X Yosemite specific
lldb support.  I'll be doing more testing & cleanup but I wanted to
get the initial checkin done.

This adds a new SBExpressionOptions::SetLanguage API for selecting a
language of an expression.

I added adds a new SBThread::GetInfoItemByPathString for retriving
information about a thread from that thread's StructuredData.

I added a new StructuredData class for representing
key-value/array/dictionary information (e.g. JSON formatted data).
Helper functions to read JSON and create a StructuredData object,
and to print a StructuredData object in JSON format are included.

A few Cocoa / Cocoa Touch data formatters were updated by Enrico
to track changes in iOS 8 / Yosemite.

Before we query a thread's extended information, the system runtime may 
provide hints to the remote debug stub that it will use to retrieve values
out of runtime structures.  I added a new SystemRuntime method 
AddThreadExtendedInfoPacketHints which allows the SystemRuntime to add 
key-value type data to the initial request that we send to the remote stub.

The thread-format formatter string can now retrieve values out of a thread's
extended info structured data.  The default thread-format string picks up
two of these - thread.info.activity.name and thread.info.trace_messages.

I added a new "jThreadExtendedInfo" packet in debugserver; I will
add documentation to the lldb-gdb-remote.txt doc soon.  It accepts
JSON formatted arguments (most importantly, "thread":threadnum) and
it returns a variety of information regarding the thread to lldb
in JSON format.  This JSON return is scanned into a StructuredData
object that is associated with the thread; UI layers can query the
thread's StructuredData to see if key-values are present, and if
so, show them to the user.  These key-values are likely to be
specific to different targets with some commonality among many
targets.  For instance, many targets will be able to advertise the
pthread_t value for a thread.

I added an initial rough cut of "thread info" command which will print
the information about a thread from the jThreadExtendedInfo result.
I need to do more work to make this format reasonably.

Han Ming added calls into the pmenergy and pmsample libraries if
debugserver is run on Mac OS X Yosemite to get information about the
inferior's power use.

I added support to debugserver for gathering the Genealogy information
about threads, if it exists, and returning it in the jThreadExtendedInfo
JSON result.

llvm-svn: 210874
diff --git a/lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h b/lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h
index 30956fa..48d1f7f 100644
--- a/lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h
+++ b/lldb/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.h
@@ -19,10 +19,11 @@
 // Other libraries and framework includes
 
 #include "lldb/Target/SystemRuntime.h"
-#include "lldb/Host/FileSpec.h"
 #include "lldb/Core/ConstString.h"
 #include "lldb/Core/ModuleList.h"
+#include "lldb/Core/StructuredData.h"
 #include "lldb/Core/UUID.h"
+#include "lldb/Host/FileSpec.h"
 #include "lldb/Host/Mutex.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/QueueItem.h"
@@ -108,6 +109,9 @@
     virtual lldb::QueueKind
     GetQueueKind (lldb::addr_t dispatch_queue_addr);
 
+    virtual void
+    AddThreadExtendedInfoPacketHints (lldb_private::StructuredData::ObjectSP dict);
+
     virtual bool
     SafeToCallFunctionsOnThisThread (lldb::ThreadSP thread_sp);
 
@@ -176,6 +180,13 @@
         uint16_t dqo_running;
         uint16_t dqo_running_size;
 
+        uint16_t dqo_suspend_cnt;         // version 5 and later, starting with Mac OS X 10.10/iOS 8
+        uint16_t dqo_suspend_cnt_size;    // version 5 and later, starting with Mac OS X 10.10/iOS 8
+        uint16_t dqo_target_queue;        // version 5 and later, starting with Mac OS X 10.10/iOS 8
+        uint16_t dqo_target_queue_size;   // version 5 and later, starting with Mac OS X 10.10/iOS 8
+        uint16_t dqo_priority;            // version 5 and later, starting with Mac OS X 10.10/iOS 8
+        uint16_t dqo_priority_size;       // version 5 and later, starting with Mac OS X 10.10/iOS 8
+
         LibdispatchOffsets ()
         {
             dqo_version = UINT16_MAX;
@@ -184,6 +195,10 @@
             dqo_label = UINT16_MAX;
             dqo_width = UINT16_MAX;
             dqo_running = UINT16_MAX;
+            dqo_suspend_cnt = UINT16_MAX;
+            dqo_target_queue = UINT16_MAX;
+            dqo_target_queue = UINT16_MAX;
+            dqo_priority = UINT16_MAX;
         };
 
         bool
@@ -199,6 +214,62 @@
         }
     };
 
+    struct LibdispatchVoucherOffsets
+    {
+        uint16_t vo_version;
+        uint16_t vo_activity_ids_count;
+        uint16_t vo_activity_ids_count_size;
+        uint16_t vo_activity_ids_array;
+        uint16_t vo_activity_ids_array_entry_size;
+
+        LibdispatchVoucherOffsets () :
+            vo_version (UINT16_MAX),
+            vo_activity_ids_count (UINT16_MAX),
+            vo_activity_ids_count_size (UINT16_MAX),
+            vo_activity_ids_array (UINT16_MAX),
+            vo_activity_ids_array_entry_size (UINT16_MAX)
+        { }
+
+        bool IsValid () { return vo_version != UINT16_MAX; }
+    };
+
+    struct LibdispatchTSDIndexes
+    {
+        uint16_t dti_version;
+        uint64_t dti_queue_index;
+        uint64_t dti_voucher_index;
+        uint64_t dti_qos_class_index;
+
+        LibdispatchTSDIndexes () :
+            dti_version (UINT16_MAX),
+            dti_queue_index (UINT64_MAX),
+            dti_voucher_index (UINT64_MAX),
+            dti_qos_class_index (UINT64_MAX)
+        { }
+
+        bool IsValid () { return dti_version != UINT16_MAX; }
+    };
+
+    struct LibpthreadOffsets
+    {
+        uint16_t    plo_version;
+        uint16_t    plo_pthread_tsd_base_offset;
+        uint16_t    plo_pthread_tsd_base_address_offset;
+        uint16_t    plo_pthread_tsd_entry_size;
+
+        LibpthreadOffsets () :
+            plo_version (UINT16_MAX),
+            plo_pthread_tsd_base_offset (UINT16_MAX),
+            plo_pthread_tsd_base_address_offset (UINT16_MAX),
+            plo_pthread_tsd_entry_size (UINT16_MAX)
+        {
+        }
+
+        bool IsValid ()
+        {
+            return plo_version != UINT16_MAX;
+        }
+    };
 
     // The libBacktraceRecording function __introspection_dispatch_queue_get_pending_items has
     // two forms.  It can either return a simple array of item_refs (void *) size or it can return
@@ -225,6 +296,18 @@
     void
     ReadLibdispatchOffsets ();
 
+    void
+    ReadLibpthreadOffsetsAddress();
+
+    void
+    ReadLibpthreadOffsets ();
+
+    void
+    ReadLibdispatchTSDIndexesAddress ();
+
+    void
+    ReadLibdispatchTSDIndexes ();
+
     PendingItemsForQueue
     GetPendingItemRefsForQueue (lldb::addr_t queue);
 
@@ -239,9 +322,19 @@
     lldb::addr_t                        m_page_to_free;
     uint64_t                            m_page_to_free_size;
     libBacktraceRecording_info          m_lib_backtrace_recording_info;
+
     lldb::addr_t                        m_dispatch_queue_offsets_addr;
     struct LibdispatchOffsets           m_libdispatch_offsets;
 
+    lldb::addr_t                        m_libpthread_layout_offsets_addr;
+    struct LibpthreadOffsets            m_libpthread_offsets;
+
+    lldb::addr_t                        m_dispatch_tsd_indexes_addr;
+    struct LibdispatchTSDIndexes        m_libdispatch_tsd_indexes;
+
+    lldb::addr_t                        m_dispatch_voucher_offsets_addr;
+    struct LibdispatchVoucherOffsets    m_libdispatch_voucher_offsets;
+
     DISALLOW_COPY_AND_ASSIGN (SystemRuntimeMacOSX);
 };