Refactor Unix signals.

Summary:
- Consolidate Unix signals selection in UnixSignals.
- Make Unix signals available from platform.
- Add jSignalsInfo packet to retrieve Unix signals from remote platform.
- Get a copy of the platform signal for each remote process.
- Update SB API for signals.
- Update signal utility in test suite.

Reviewers: ovyalov, clayborg

Subscribers: chaoren, jingham, labath, emaste, tberghammer, lldb-commits

Differential Revision: http://reviews.llvm.org/D11094

llvm-svn: 242101
diff --git a/lldb/source/API/SBUnixSignals.cpp b/lldb/source/API/SBUnixSignals.cpp
index ca321d8..531c978 100644
--- a/lldb/source/API/SBUnixSignals.cpp
+++ b/lldb/source/API/SBUnixSignals.cpp
@@ -9,6 +9,7 @@
 
 #include "lldb/lldb-defines.h"
 #include "lldb/Target/Process.h"
+#include "lldb/Target/Platform.h"
 #include "lldb/Target/UnixSignals.h"
 #include "lldb/Core/Log.h"
 
@@ -25,8 +26,13 @@
 {
 }
 
-SBUnixSignals::SBUnixSignals (ProcessSP &process_sp) :
-    m_opaque_wp(process_sp)
+SBUnixSignals::SBUnixSignals(ProcessSP &process_sp) :
+    m_opaque_wp(process_sp ? process_sp->GetUnixSignals() : nullptr)
+{
+}
+
+SBUnixSignals::SBUnixSignals(PlatformSP &platform_sp) :
+    m_opaque_wp(platform_sp ? platform_sp->GetUnixSignals() : nullptr)
 {
 }
 
@@ -42,16 +48,16 @@
 {
 }
 
-ProcessSP
+UnixSignalsSP
 SBUnixSignals::GetSP() const
 {
     return m_opaque_wp.lock();
 }
 
 void
-SBUnixSignals::SetSP (const ProcessSP &process_sp)
+SBUnixSignals::SetSP(const UnixSignalsSP &signals_sp)
 {
-    m_opaque_wp = process_sp;
+    m_opaque_wp = signals_sp;
 }
 
 void
@@ -63,30 +69,33 @@
 bool
 SBUnixSignals::IsValid() const
 {
-    return (bool) GetSP();
+    return static_cast<bool>(GetSP());
 }
 
 const char *
 SBUnixSignals::GetSignalAsCString (int32_t signo) const
 {
-    ProcessSP process_sp(GetSP());
-    if (process_sp) return process_sp->GetUnixSignals().GetSignalAsCString(signo);
-    return NULL;
+    if (auto signals_sp = GetSP())
+        return signals_sp->GetSignalAsCString(signo);
+
+    return nullptr;
 }
 
 int32_t
 SBUnixSignals::GetSignalNumberFromName (const char *name) const
 {
-    ProcessSP process_sp(GetSP());
-    if (process_sp) return process_sp->GetUnixSignals().GetSignalNumberFromName(name);
-    return -1;
+    if (auto signals_sp = GetSP())
+        return signals_sp->GetSignalNumberFromName(name);
+
+    return LLDB_INVALID_SIGNAL_NUMBER;
 }
 
 bool
 SBUnixSignals::GetShouldSuppress (int32_t signo) const
 {
-    ProcessSP process_sp(GetSP());
-    if (process_sp) return process_sp->GetUnixSignals().GetShouldSuppress(signo);
+    if (auto signals_sp = GetSP())
+        return signals_sp->GetShouldSuppress(signo);
+
     return false;
 }
 
@@ -94,25 +103,28 @@
 SBUnixSignals::SetShouldSuppress (int32_t signo, bool value)
 {
     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
-    ProcessSP process_sp(GetSP());
+    auto signals_sp = GetSP();
 
     if (log)
     {
         log->Printf ("SBUnixSignals(%p)::SetShouldSuppress (signo=%d, value=%d)",
-                     static_cast<void*>(process_sp.get()),
+                     static_cast<void*>(signals_sp.get()),
                      signo,
                      value);
     }
 
-    if (process_sp) return process_sp->GetUnixSignals().SetShouldSuppress(signo, value);
+    if (signals_sp)
+        return signals_sp->SetShouldSuppress(signo, value);
+
     return false;
 }
 
 bool
 SBUnixSignals::GetShouldStop (int32_t signo) const
 {
-    ProcessSP process_sp(GetSP());
-    if (process_sp) return process_sp->GetUnixSignals().GetShouldStop(signo);
+    if (auto signals_sp = GetSP())
+        return signals_sp->GetShouldStop(signo);
+
     return false;
 }
 
@@ -120,25 +132,28 @@
 SBUnixSignals::SetShouldStop (int32_t signo, bool value)
 {
     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
-    ProcessSP process_sp(GetSP());
+    auto signals_sp = GetSP();
 
     if (log)
     {
         log->Printf ("SBUnixSignals(%p)::SetShouldStop (signo=%d, value=%d)",
-                     static_cast<void*>(process_sp.get()),
+                     static_cast<void*>(signals_sp.get()),
                      signo,
                      value);
     }
 
-    if (process_sp) return process_sp->GetUnixSignals().SetShouldStop(signo, value);
+    if (signals_sp)
+        return signals_sp->SetShouldStop(signo, value);
+
     return false;
 }
 
 bool
 SBUnixSignals::GetShouldNotify (int32_t signo) const
 {
-    ProcessSP process_sp(GetSP());
-    if (process_sp) return process_sp->GetUnixSignals().GetShouldNotify(signo);
+    if (auto signals_sp = GetSP())
+        return signals_sp->GetShouldNotify(signo);
+
     return false;
 }
 
@@ -146,54 +161,36 @@
 SBUnixSignals::SetShouldNotify (int32_t signo, bool value)
 {
     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
-    ProcessSP process_sp(GetSP());
+    auto signals_sp = GetSP();
 
     if (log)
     {
         log->Printf ("SBUnixSignals(%p)::SetShouldNotify (signo=%d, value=%d)",
-                     static_cast<void*>(process_sp.get()),
+                     static_cast<void*>(signals_sp.get()),
                      signo,
                      value);
     }
 
-    if (process_sp) return process_sp->GetUnixSignals().SetShouldNotify(signo, value);
+    if (signals_sp)
+        return signals_sp->SetShouldNotify(signo, value);
+
     return false;
 }
 
 int32_t
 SBUnixSignals::GetNumSignals () const
 {
-    if (auto process_sp = GetSP())
-    {
-        // only valid while we hold process_sp
-        UnixSignals *unix_signals_ptr = &process_sp->GetUnixSignals();
-        int32_t num_signals = 0;
-        for (int32_t signo = unix_signals_ptr->GetFirstSignalNumber();
-             signo != LLDB_INVALID_SIGNAL_NUMBER;
-             signo = unix_signals_ptr->GetNextSignalNumber(signo))
-        {
-            num_signals++;
-        }
-        return num_signals;
-    }
-    return LLDB_INVALID_SIGNAL_NUMBER;
+    if (auto signals_sp = GetSP())
+        return signals_sp->GetNumSignals();
+
+    return -1;
 }
 
 int32_t
 SBUnixSignals::GetSignalAtIndex (int32_t index) const
 {
-    if (auto process_sp = GetSP())
-    {
-        // only valid while we hold process_sp
-        UnixSignals *unix_signals_ptr = &process_sp->GetUnixSignals();
-        int32_t idx = 0;
-        for (int32_t signo = unix_signals_ptr->GetFirstSignalNumber();
-             signo != LLDB_INVALID_SIGNAL_NUMBER;
-             signo = unix_signals_ptr->GetNextSignalNumber(signo))
-        {
-            if (index == idx) return signo;
-            idx++;
-        }
-    }
+    if (auto signals_sp = GetSP())
+        return signals_sp->GetSignalAtIndex(index);
+
     return LLDB_INVALID_SIGNAL_NUMBER;
 }