Patch from Dawn that fixes up linux debugging and a first passs at an 
implementation of the linux platform.



git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@145433 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/Process/Linux/ProcessLinux.cpp b/source/Plugins/Process/Linux/ProcessLinux.cpp
index 6a0c54c..2171a6d 100644
--- a/source/Plugins/Process/Linux/ProcessLinux.cpp
+++ b/source/Plugins/Process/Linux/ProcessLinux.cpp
@@ -87,7 +87,6 @@
       m_in_limbo(false),
       m_exit_now(false)
 {
-
 #if 0
     // FIXME: Putting this code in the ctor and saving the byte order in a
     // member variable is a hack to avoid const qual issues in GetByteOrder.
@@ -152,7 +151,6 @@
 
     SetPrivateState(eStateLaunching);
 
-    uint32_t launch_flags = launch_info.GetFlags().Get();
     const char *stdin_path = NULL;
     const char *stdout_path = NULL;
     const char *stderr_path = NULL;
@@ -270,7 +268,13 @@
 Error
 ProcessLinux::DoDetach()
 {
-    return Error(1, eErrorTypeGeneric);
+    Error error;
+
+    error = m_monitor->Detach();
+    if (error.Success())
+        SetPrivateState(eStateDetached);
+
+    return error;
 }
 
 Error
@@ -388,7 +392,7 @@
 ProcessLinux::IsAlive()
 {
     StateType state = GetPrivateState();
-    return state != eStateExited && state != eStateInvalid;
+    return state != eStateDetached && state != eStateExited && state != eStateInvalid;
 }
 
 size_t
diff --git a/source/Plugins/Process/Linux/ProcessMonitor.cpp b/source/Plugins/Process/Linux/ProcessMonitor.cpp
index 2a84462..c154c55 100644
--- a/source/Plugins/Process/Linux/ProcessMonitor.cpp
+++ b/source/Plugins/Process/Linux/ProcessMonitor.cpp
@@ -722,6 +722,30 @@
         m_result = true;
 }
 
+//------------------------------------------------------------------------------
+/// @class KillOperation
+/// @brief Implements ProcessMonitor::BringProcessIntoLimbo.
+class DetachOperation : public Operation
+{
+public:
+    DetachOperation(Error &result) : m_error(result) { }
+
+    void Execute(ProcessMonitor *monitor);
+
+private:
+    Error &m_error;
+};
+
+void
+DetachOperation::Execute(ProcessMonitor *monitor)
+{
+    lldb::pid_t pid = monitor->GetPID();
+
+    if (ptrace(PT_DETACH, pid, NULL, 0) < 0)
+        m_error.SetErrorToErrno();
+  
+}
+
 ProcessMonitor::OperationArgs::OperationArgs(ProcessMonitor *monitor)
     : m_monitor(monitor)
 {
@@ -1220,7 +1244,7 @@
 
 ProcessMessage
 ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor,
-                               const struct siginfo *info, lldb::pid_t pid)
+                               const siginfo_t *info, lldb::pid_t pid)
 {
     ProcessMessage message;
 
@@ -1261,7 +1285,7 @@
 
 ProcessMessage
 ProcessMonitor::MonitorSignal(ProcessMonitor *monitor,
-                              const struct siginfo *info, lldb::pid_t pid)
+                              const siginfo_t *info, lldb::pid_t pid)
 {
     ProcessMessage message;
     int signo = info->si_signo;
@@ -1312,7 +1336,7 @@
 }
 
 ProcessMessage::CrashReason
-ProcessMonitor::GetCrashReasonForSIGSEGV(const struct siginfo *info)
+ProcessMonitor::GetCrashReasonForSIGSEGV(const siginfo_t *info)
 {
     ProcessMessage::CrashReason reason;
     assert(info->si_signo == SIGSEGV);
@@ -1336,7 +1360,7 @@
 }
 
 ProcessMessage::CrashReason
-ProcessMonitor::GetCrashReasonForSIGILL(const struct siginfo *info)
+ProcessMonitor::GetCrashReasonForSIGILL(const siginfo_t *info)
 {
     ProcessMessage::CrashReason reason;
     assert(info->si_signo == SIGILL);
@@ -1378,7 +1402,7 @@
 }
 
 ProcessMessage::CrashReason
-ProcessMonitor::GetCrashReasonForSIGFPE(const struct siginfo *info)
+ProcessMonitor::GetCrashReasonForSIGFPE(const siginfo_t *info)
 {
     ProcessMessage::CrashReason reason;
     assert(info->si_signo == SIGFPE);
@@ -1420,7 +1444,7 @@
 }
 
 ProcessMessage::CrashReason
-ProcessMonitor::GetCrashReasonForSIGBUS(const struct siginfo *info)
+ProcessMonitor::GetCrashReasonForSIGBUS(const siginfo_t *info)
 {
     ProcessMessage::CrashReason reason;
     assert(info->si_signo == SIGBUS);
@@ -1646,7 +1670,9 @@
 ProcessMonitor::Detach()
 {
     bool result;
-    KillOperation op(result);
+    lldb_private::Error error;
+    DetachOperation op(error);
+    result = error.Success();
     DoOperation(&op);
     StopMonitor();
     return result;
diff --git a/source/Plugins/Process/Linux/ProcessMonitor.h b/source/Plugins/Process/Linux/ProcessMonitor.h
index ba6a76d..fdccb67 100644
--- a/source/Plugins/Process/Linux/ProcessMonitor.h
+++ b/source/Plugins/Process/Linux/ProcessMonitor.h
@@ -257,23 +257,23 @@
 
     static ProcessMessage
     MonitorSIGTRAP(ProcessMonitor *monitor,
-                   const struct siginfo *info, lldb::pid_t pid);
+                   const siginfo_t *info, lldb::pid_t pid);
 
     static ProcessMessage
     MonitorSignal(ProcessMonitor *monitor, 
-                  const struct siginfo *info, lldb::pid_t pid);
+                  const siginfo_t *info, lldb::pid_t pid);
 
     static ProcessMessage::CrashReason
-    GetCrashReasonForSIGSEGV(const struct siginfo *info);
+    GetCrashReasonForSIGSEGV(const siginfo_t *info);
 
     static ProcessMessage::CrashReason
-    GetCrashReasonForSIGILL(const struct siginfo *info);
+    GetCrashReasonForSIGILL(const siginfo_t *info);
 
     static ProcessMessage::CrashReason
-    GetCrashReasonForSIGFPE(const struct siginfo *info);
+    GetCrashReasonForSIGFPE(const siginfo_t *info);
 
     static ProcessMessage::CrashReason
-    GetCrashReasonForSIGBUS(const struct siginfo *info);
+    GetCrashReasonForSIGBUS(const siginfo_t *info);
 
     void
     DoOperation(Operation *op);