mgorny created this revision.
mgorny added reviewers: krytarowski, emaste, labath, jasonmolenda, JDevlieghere.
mgorny requested review of this revision.

Add support for the original gdbserver signal mapping when communicating
with GDB.  If qSupported indicates that we are talking to LLDB (via
'native-signals+'), the previous behavior of using native host signals
is preserved.

TODO: add all gdb signals, add tests


https://reviews.llvm.org/D108078

Files:
  lldb/source/Plugins/Process/Utility/GDBRemoteSignals.cpp
  lldb/source/Plugins/Process/Utility/GDBRemoteSignals.h
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
  lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp

Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -720,11 +720,15 @@
             GetTarget().GetArchitecture().GetTriple().getTriple().c_str());
 
   if (error.Success()) {
-    PlatformSP platform_sp = GetTarget().GetPlatform();
-    if (platform_sp && platform_sp->IsConnected())
-      SetUnixSignals(platform_sp->GetUnixSignals());
-    else
-      SetUnixSignals(UnixSignals::Create(GetTarget().GetArchitecture()));
+    if (!m_gdb_comm.UsesNativeSignals()) {
+      Process::SetUnixSignals(std::make_shared<GDBRemoteSignals>());
+    } else {
+      PlatformSP platform_sp = GetTarget().GetPlatform();
+      if (platform_sp && platform_sp->IsConnected())
+        SetUnixSignals(platform_sp->GetUnixSignals());
+      else
+        SetUnixSignals(UnixSignals::Create(GetTarget().GetArchitecture()));
+    }
   }
 
   return error;
Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
@@ -1341,5 +1341,6 @@
       llvm::formatv("PacketSize={0}", max_packet_size),
       "QStartNoAckMode+",
       "qEcho+",
+      "native-signals+",
   };
 }
Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
@@ -469,6 +469,8 @@
 
   bool GetMemoryTaggingSupported();
 
+  bool UsesNativeSignals();
+
   lldb::DataBufferSP ReadMemoryTags(lldb::addr_t addr, size_t len,
                                     int32_t type);
 
@@ -589,6 +591,7 @@
   LazyBool m_supports_error_string_reply = eLazyBoolCalculate;
   LazyBool m_supports_multiprocess = eLazyBoolCalculate;
   LazyBool m_supports_memory_tagging = eLazyBoolCalculate;
+  LazyBool m_uses_native_signals = eLazyBoolCalculate;
 
   bool m_supports_qProcessInfoPID : 1, m_supports_qfProcessInfo : 1,
       m_supports_qUserName : 1, m_supports_qGroupName : 1,
Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
@@ -265,6 +265,7 @@
     m_supports_qXfer_features_read = eLazyBoolCalculate;
     m_supports_qXfer_memory_map_read = eLazyBoolCalculate;
     m_supports_augmented_libraries_svr4_read = eLazyBoolCalculate;
+    m_uses_native_signals = eLazyBoolCalculate;
     m_supports_qProcessInfoPID = true;
     m_supports_qfProcessInfo = true;
     m_supports_qUserName = true;
@@ -314,6 +315,7 @@
   m_supports_qEcho = eLazyBoolNo;
   m_supports_QPassSignals = eLazyBoolNo;
   m_supports_memory_tagging = eLazyBoolNo;
+  m_uses_native_signals = eLazyBoolNo;
 
   m_max_packet_size = UINT64_MAX; // It's supposed to always be there, but if
                                   // not, we assume no limit
@@ -360,6 +362,8 @@
         m_supports_multiprocess = eLazyBoolYes;
       else if (x == "memory-tagging+")
         m_supports_memory_tagging = eLazyBoolYes;
+      else if (x == "native-signals+")
+        m_uses_native_signals = eLazyBoolYes;
       // Look for a list of compressions in the features list e.g.
       // qXfer:features:read+;PacketSize=20000;qEcho+;SupportedCompressions=zlib-
       // deflate,lzma
@@ -4298,3 +4302,10 @@
   GDBRemoteClientBase::OnRunPacketSent(first);
   m_curr_tid = LLDB_INVALID_THREAD_ID;
 }
+
+bool GDBRemoteCommunicationClient::UsesNativeSignals() {
+  if (m_uses_native_signals == eLazyBoolCalculate) {
+    GetRemoteQSupported();
+  }
+  return m_uses_native_signals == eLazyBoolYes;
+}
Index: lldb/source/Plugins/Process/Utility/GDBRemoteSignals.h
===================================================================
--- lldb/source/Plugins/Process/Utility/GDBRemoteSignals.h
+++ lldb/source/Plugins/Process/Utility/GDBRemoteSignals.h
@@ -13,7 +13,8 @@
 
 namespace lldb_private {
 
-/// Empty set of Unix signals to be filled by PlatformRemoteGDBServer
+/// Initially carries signals defined by the GDB Remote Serial Protocol.
+/// Can be filled with platform's signals through PlatformRemoteGDBServer.
 class GDBRemoteSignals : public UnixSignals {
 public:
   GDBRemoteSignals();
Index: lldb/source/Plugins/Process/Utility/GDBRemoteSignals.cpp
===================================================================
--- lldb/source/Plugins/Process/Utility/GDBRemoteSignals.cpp
+++ lldb/source/Plugins/Process/Utility/GDBRemoteSignals.cpp
@@ -15,4 +15,76 @@
 GDBRemoteSignals::GDBRemoteSignals(const lldb::UnixSignalsSP &rhs)
     : UnixSignals(*rhs) {}
 
-void GDBRemoteSignals::Reset() { m_signals.clear(); }
+void GDBRemoteSignals::Reset() {
+  m_signals.clear();
+  // clang-format off
+  //        SIGNO   NAME            SUPPRESS  STOP    NOTIFY  DESCRIPTION
+  //        ======  ==============  ========  ======  ======  ===================================================
+  AddSignal(1,      "SIGHUP",       false,    true,   true,   "hangup");
+  AddSignal(2,      "SIGINT",       true,     true,   true,   "interrupt");
+  AddSignal(3,      "SIGQUIT",      false,    true,   true,   "quit");
+  AddSignal(4,      "SIGILL",       false,    true,   true,   "illegal instruction");
+  AddSignal(5,      "SIGTRAP",      true,     true,   true,   "trace trap (not reset when caught)");
+  AddSignal(6,      "SIGABRT",      false,    true,   true,   "abort()/IOT trap", "SIGIOT");
+  AddSignal(7,      "SIGEMT",       false,    true,   true,   "emulation trap");
+  AddSignal(8,      "SIGFPE",       false,    true,   true,   "floating point exception");
+  AddSignal(9,      "SIGKILL",      false,    true,   true,   "kill");
+  AddSignal(10,     "SIGBUS",       false,    true,   true,   "bus error");
+  AddSignal(11,     "SIGSEGV",      false,    true,   true,   "segmentation violation");
+  AddSignal(12,     "SIGSYS",       false,    true,   true,   "invalid system call");
+  AddSignal(13,     "SIGPIPE",      false,    true,   true,   "write to pipe with reading end closed");
+  AddSignal(14,     "SIGALRM",      false,    false,  false,  "alarm");
+  AddSignal(15,     "SIGTERM",      false,    true,   true,   "termination requested");
+  AddSignal(16,     "SIGURG",       false,    true,   true,   "urgent data on socket");
+  AddSignal(17,     "SIGSTOP",      true,     true,   true,   "process stop");
+  AddSignal(18,     "SIGTSTP",      false,    true,   true,   "tty stop");
+  AddSignal(19,     "SIGCONT",      false,    false,  true,   "process continue");
+  AddSignal(20,     "SIGCHLD",      false,    false,  true,   "child status has changed", "SIGCLD");
+  AddSignal(21,     "SIGTTIN",      false,    true,   true,   "background tty read");
+  AddSignal(22,     "SIGTTOU",      false,    true,   true,   "background tty write");
+  AddSignal(23,     "SIGIO",        false,    true,   true,   "input/output ready/Pollable event", "SIGPOLL");
+  AddSignal(24,     "SIGXCPU",      false,    true,   true,   "CPU resource exceeded");
+  AddSignal(25,     "SIGXFSZ",      false,    true,   true,   "file size limit exceeded");
+  AddSignal(26,     "SIGVTALRM",    false,    true,   true,   "virtual time alarm");
+  AddSignal(27,     "SIGPROF",      false,    false,  false,  "profiling time alarm");
+  AddSignal(28,     "SIGWINCH",     false,    true,   true,   "window size changes");
+  AddSignal(29,     "SIGLOST",      false,    true,   true,   "resource lost");
+  AddSignal(30,     "SIGUSR1",      false,    true,   true,   "user defined signal 1");
+  AddSignal(31,     "SIGUSR2",      false,    true,   true,   "user defined signal 2");
+  AddSignal(32,     "SIGPWR",       false,    true,   true,   "power failure");
+  //
+#if 0
+  AddSignal(34,     "SIGRTMIN",     false,    false,  false,  "real time signal 0");
+  AddSignal(35,     "SIGRTMIN+1",   false,    false,  false,  "real time signal 1");
+  AddSignal(36,     "SIGRTMIN+2",   false,    false,  false,  "real time signal 2");
+  AddSignal(37,     "SIGRTMIN+3",   false,    false,  false,  "real time signal 3");
+  AddSignal(38,     "SIGRTMIN+4",   false,    false,  false,  "real time signal 4");
+  AddSignal(39,     "SIGRTMIN+5",   false,    false,  false,  "real time signal 5");
+  AddSignal(40,     "SIGRTMIN+6",   false,    false,  false,  "real time signal 6");
+  AddSignal(41,     "SIGRTMIN+7",   false,    false,  false,  "real time signal 7");
+  AddSignal(42,     "SIGRTMIN+8",   false,    false,  false,  "real time signal 8");
+  AddSignal(43,     "SIGRTMIN+9",   false,    false,  false,  "real time signal 9");
+  AddSignal(44,     "SIGRTMIN+10",  false,    false,  false,  "real time signal 10");
+  AddSignal(45,     "SIGRTMIN+11",  false,    false,  false,  "real time signal 11");
+  AddSignal(46,     "SIGRTMIN+12",  false,    false,  false,  "real time signal 12");
+  AddSignal(47,     "SIGRTMIN+13",  false,    false,  false,  "real time signal 13");
+  AddSignal(48,     "SIGRTMIN+14",  false,    false,  false,  "real time signal 14");
+  AddSignal(49,     "SIGRTMIN+15",  false,    false,  false,  "real time signal 15");
+  AddSignal(50,     "SIGRTMAX-14",  false,    false,  false,  "real time signal 16"); // switching to SIGRTMAX-xxx to match "kill -l" output
+  AddSignal(51,     "SIGRTMAX-13",  false,    false,  false,  "real time signal 17");
+  AddSignal(52,     "SIGRTMAX-12",  false,    false,  false,  "real time signal 18");
+  AddSignal(53,     "SIGRTMAX-11",  false,    false,  false,  "real time signal 19");
+  AddSignal(54,     "SIGRTMAX-10",  false,    false,  false,  "real time signal 20");
+  AddSignal(55,     "SIGRTMAX-9",   false,    false,  false,  "real time signal 21");
+  AddSignal(56,     "SIGRTMAX-8",   false,    false,  false,  "real time signal 22");
+  AddSignal(57,     "SIGRTMAX-7",   false,    false,  false,  "real time signal 23");
+  AddSignal(58,     "SIGRTMAX-6",   false,    false,  false,  "real time signal 24");
+  AddSignal(59,     "SIGRTMAX-5",   false,    false,  false,  "real time signal 25");
+  AddSignal(60,     "SIGRTMAX-4",   false,    false,  false,  "real time signal 26");
+  AddSignal(61,     "SIGRTMAX-3",   false,    false,  false,  "real time signal 27");
+  AddSignal(62,     "SIGRTMAX-2",   false,    false,  false,  "real time signal 28");
+  AddSignal(63,     "SIGRTMAX-1",   false,    false,  false,  "real time signal 29");
+  AddSignal(64,     "SIGRTMAX",     false,    false,  false,  "real time signal 30");
+#endif
+  // clang-format on
+}
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits] [PATCH] D10... Michał Górny via Phabricator via lldb-commits

Reply via email to