Add lldb-gdbserver support for Linux x86_64.

This change brings in lldb-gdbserver (llgs) specifically for Linux x86_64.
(More architectures coming soon).

Not every debugserver option is covered yet.  Currently
the lldb-gdbserver command line can start unattached,
start attached to a pid (process-name attach not supported yet),
or accept lldb attaching and launching a process or connecting
by process id.

The history of this large change can be found here:
https://github.com/tfiala/lldb/tree/dev-tfiala-native-protocol-linux-x86_64

Until mid/late April, I was not sharing the work and continued
to rebase it off of head (developed via id tfiala@google.com).  I switched over to
user todd.fiala@gmail.com in the middle, and once I went to github, I did
merges rather than rebasing so I could share with others.

llvm-svn: 212069
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
index 4bc0857..d20cc2a 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
@@ -14,16 +14,23 @@
 // C++ Includes
 #include <vector>
 #include <set>
+#include <unordered_map>
 // Other libraries and framework includes
 // Project includes
+#include "lldb/lldb-private-forward.h"
+#include "lldb/Core/Communication.h"
 #include "lldb/Host/Mutex.h"
 #include "lldb/Target/Process.h"
 #include "GDBRemoteCommunication.h"
 
+#include "../../../Host/common/NativeProcessProtocol.h"
+
 class ProcessGDBRemote;
 class StringExtractorGDBRemote;
 
-class GDBRemoteCommunicationServer : public GDBRemoteCommunication
+class GDBRemoteCommunicationServer :
+    public GDBRemoteCommunication,
+    public lldb_private::NativeProcessProtocol::NativeDelegate
 {
 public:
     typedef std::map<uint16_t, lldb::pid_t> PortMap;
@@ -38,12 +45,13 @@
     GDBRemoteCommunicationServer(bool is_platform);
 
     GDBRemoteCommunicationServer(bool is_platform,
-                                 const lldb::PlatformSP& platform_sp); 
+                                 const lldb::PlatformSP& platform_sp,
+                                 lldb::DebuggerSP& debugger_sp);
 
     virtual
     ~GDBRemoteCommunicationServer();
 
-    bool
+    PacketResult
     GetPacketAndSendResponse (uint32_t timeout_usec,
                               lldb_private::Error &error,
                               bool &interrupt, 
@@ -188,6 +196,28 @@
     lldb_private::Error
     LaunchProcess ();
 
+    //------------------------------------------------------------------
+    /// Attach to a process.
+    ///
+    /// This method supports attaching llgs to a process accessible via the
+    /// configured Platform.
+    ///
+    /// @return
+    ///     An Error object indicating the success or failure of the
+    ///     attach operation.
+    //------------------------------------------------------------------
+    lldb_private::Error
+    AttachToProcess (lldb::pid_t pid);
+
+    //------------------------------------------------------------------
+    // NativeProcessProtocol::NativeDelegate overrides
+    //------------------------------------------------------------------
+    void
+    InitializeDelegate (lldb_private::NativeProcessProtocol *process) override;
+
+    void
+    ProcessStateChanged (lldb_private::NativeProcessProtocol *process, lldb::StateType state) override;
+
 protected:
     lldb::PlatformSP m_platform_sp;
     lldb::thread_t m_async_thread;
@@ -199,7 +229,20 @@
     uint32_t m_proc_infos_index;
     PortMap m_port_map;
     uint16_t m_port_offset;
-
+    lldb::tid_t m_current_tid;
+    lldb::tid_t m_continue_tid;
+    lldb_private::Mutex m_debugged_process_mutex;
+    lldb_private::NativeProcessProtocolSP m_debugged_process_sp;
+    lldb::DebuggerSP m_debugger_sp;
+    Communication m_stdio_communication;
+    bool m_exit_now; // use in asynchronous handling to indicate process should exit.
+    lldb::StateType m_inferior_prev_state;
+    bool m_thread_suffix_supported;
+    bool m_list_threads_in_stop_reply;
+    lldb::DataBufferSP m_active_auxv_buffer_sp;
+    lldb_private::Mutex m_saved_registers_mutex;
+    std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
+    uint32_t m_next_saved_registers_id;
 
     PacketResult
     SendUnimplementedResponse (const char *packet);
@@ -208,9 +251,24 @@
     SendErrorResponse (uint8_t error);
 
     PacketResult
+    SendIllFormedResponse (const StringExtractorGDBRemote &packet, const char *error_message);
+
+    PacketResult
     SendOKResponse ();
 
     PacketResult
+    SendONotification (const char *buffer, uint32_t len);
+
+    PacketResult
+    SendWResponse (lldb_private::NativeProcessProtocol *process);
+
+    PacketResult
+    SendStopReplyPacketForThread (lldb::tid_t tid);
+
+    PacketResult
+    SendStopReasonForState (lldb::StateType process_state, bool flush_on_exit);
+
+    PacketResult
     Handle_A (StringExtractorGDBRemote &packet);
     
     PacketResult
@@ -233,7 +291,10 @@
     
     PacketResult
     Handle_qPlatform_chmod (StringExtractorGDBRemote &packet);
-    
+
+    PacketResult
+    Handle_qProcessInfo (StringExtractorGDBRemote &packet);
+
     PacketResult
     Handle_qProcessInfoPID (StringExtractorGDBRemote &packet);
     
@@ -284,7 +345,22 @@
 
     PacketResult
     Handle_QSetSTDERR (StringExtractorGDBRemote &packet);
-    
+
+    PacketResult
+    Handle_C (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_c (StringExtractorGDBRemote &packet, bool skip_file_pos_adjustment = false);
+
+    PacketResult
+    Handle_vCont (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_vCont_actions (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_stop_reason (StringExtractorGDBRemote &packet);
+
     PacketResult
     Handle_vFile_Open (StringExtractorGDBRemote &packet);
 
@@ -321,6 +397,84 @@
     PacketResult
     Handle_qPlatform_shell (StringExtractorGDBRemote &packet);
 
+    PacketResult
+    Handle_qRegisterInfo (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_qfThreadInfo (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_qsThreadInfo (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_p (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_P (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_H (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_interrupt (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_m (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_M (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_qMemoryRegionInfoSupported (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_qMemoryRegionInfo (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_Z (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_z (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_s (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_qSupported (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_QThreadSuffixSupported (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_QListThreadsInStopReply (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_qXfer_auxv_read (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_QSaveRegisterState (StringExtractorGDBRemote &packet);
+
+    PacketResult
+    Handle_QRestoreRegisterState (StringExtractorGDBRemote &packet);
+
+    void
+    SetCurrentThreadID (lldb::tid_t tid);
+
+    lldb::tid_t
+    GetCurrentThreadID () const;
+
+    void
+    SetContinueThreadID (lldb::tid_t tid);
+
+    lldb::tid_t
+    GetContinueThreadID () const { return m_continue_tid; }
+
+    lldb_private::Error
+    SetSTDIOFileDescriptor (int fd);
+
+    static void
+    STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len);
+
 private:
     bool
     DebugserverProcessReaped (lldb::pid_t pid);
@@ -345,6 +499,38 @@
     bool
     KillSpawnedProcess (lldb::pid_t pid);
 
+    bool
+    IsGdbServer ()
+    {
+        return !m_is_platform;
+    }
+
+    /// Launch a process from lldb-gdbserver
+    lldb_private::Error
+    LaunchDebugServerProcess ();
+
+    /// Launch a process from lldb-platform
+    lldb_private::Error
+    LaunchPlatformProcess ();
+
+    void
+    HandleInferiorState_Exited (lldb_private::NativeProcessProtocol *process);
+
+    void
+    HandleInferiorState_Stopped (lldb_private::NativeProcessProtocol *process);
+
+    void
+    FlushInferiorOutput ();
+
+    lldb_private::NativeThreadProtocolSP
+    GetThreadFromSuffix (StringExtractorGDBRemote &packet);
+
+    uint32_t
+    GetNextSavedRegistersID ();
+
+    void
+    MaybeCloseInferiorTerminalConnection ();
+
     //------------------------------------------------------------------
     // For GDBRemoteCommunicationServer only
     //------------------------------------------------------------------