[Lldb-commits] [lldb] ee23250 - [lldb] Move UnixSignals creation into Platform plugins

Alex Langford via lldb-commits lldb-commits at lists.llvm.org
Mon Mar 20 15:41:29 PDT 2023


Author: Alex Langford
Date: 2023-03-20T15:41:06-07:00
New Revision: ee232506b870ce5282cc4da5ca493d41d361feb3

URL: https://github.com/llvm/llvm-project/commit/ee232506b870ce5282cc4da5ca493d41d361feb3
DIFF: https://github.com/llvm/llvm-project/commit/ee232506b870ce5282cc4da5ca493d41d361feb3.diff

LOG: [lldb] Move UnixSignals creation into Platform plugins

The high level goal of this change is to remove lldbTarget's dependency
on lldbPluginProcessUtility. The reason for this existing dependency is
so that we can create the appropriate UnixSignals object based on an
ArchSpec. Instead of using the ArchSpec, we can instead take advantage
of the Platform associated with the current Target.

This is accomplished by adding a new method to Platform,
CreateUnixSignals, which will create the correct UnixSignals object for
us. We then can use `Platform::GetUnixSignals` and rely on that to give
us the correct signals as needed.

Differential Revision: https://reviews.llvm.org/D146263

Added: 
    lldb/source/Plugins/Platform/FreeBSD/FreeBSDSignals.cpp
    lldb/source/Plugins/Platform/FreeBSD/FreeBSDSignals.h
    lldb/source/Plugins/Platform/Linux/LinuxSignals.cpp
    lldb/source/Plugins/Platform/Linux/LinuxSignals.h
    lldb/source/Plugins/Platform/NetBSD/NetBSDSignals.cpp
    lldb/source/Plugins/Platform/NetBSD/NetBSDSignals.h
    lldb/source/Plugins/Platform/gdb-server/GDBRemoteSignals.cpp
    lldb/source/Plugins/Platform/gdb-server/GDBRemoteSignals.h

Modified: 
    lldb/include/lldb/Target/Platform.h
    lldb/include/lldb/Target/UnixSignals.h
    lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/CMakeLists.txt
    lldb/source/Plugins/Platform/FreeBSD/CMakeLists.txt
    lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
    lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
    lldb/source/Plugins/Platform/Linux/CMakeLists.txt
    lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
    lldb/source/Plugins/Platform/Linux/PlatformLinux.h
    lldb/source/Plugins/Platform/NetBSD/CMakeLists.txt
    lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp
    lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h
    lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
    lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h
    lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h
    lldb/source/Plugins/Platform/Windows/PlatformWindows.h
    lldb/source/Plugins/Platform/gdb-server/CMakeLists.txt
    lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
    lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
    lldb/source/Plugins/Process/Utility/CMakeLists.txt
    lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp
    lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
    lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
    lldb/source/Target/CMakeLists.txt
    lldb/source/Target/Platform.cpp
    lldb/source/Target/UnixSignals.cpp
    lldb/unittests/Process/gdb-remote/CMakeLists.txt
    lldb/unittests/Process/gdb-remote/GDBRemoteClientBaseTest.cpp
    lldb/unittests/Target/RemoteAwarePlatformTest.cpp

Removed: 
    lldb/source/Plugins/Process/Utility/FreeBSDSignals.cpp
    lldb/source/Plugins/Process/Utility/FreeBSDSignals.h
    lldb/source/Plugins/Process/Utility/GDBRemoteSignals.cpp
    lldb/source/Plugins/Process/Utility/GDBRemoteSignals.h
    lldb/source/Plugins/Process/Utility/LinuxSignals.cpp
    lldb/source/Plugins/Process/Utility/LinuxSignals.h
    lldb/source/Plugins/Process/Utility/NetBSDSignals.cpp
    lldb/source/Plugins/Process/Utility/NetBSDSignals.h


################################################################################
diff  --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h
index 08e47cc132473..e184249a62980 100644
--- a/lldb/include/lldb/Target/Platform.h
+++ b/lldb/include/lldb/Target/Platform.h
@@ -619,10 +619,12 @@ class Platform : public PluginInterface {
     return 1;
   }
 
-  virtual const lldb::UnixSignalsSP &GetRemoteUnixSignals();
+  virtual lldb::UnixSignalsSP GetRemoteUnixSignals();
 
   lldb::UnixSignalsSP GetUnixSignals();
 
+  virtual lldb::UnixSignalsSP CreateUnixSignals() = 0;
+
   /// Locate a queue name given a thread's qaddr
   ///
   /// On a system using libdispatch ("Grand Central Dispatch") style queues, a

diff  --git a/lldb/include/lldb/Target/UnixSignals.h b/lldb/include/lldb/Target/UnixSignals.h
index ac47a2769b927..1287e0007cc75 100644
--- a/lldb/include/lldb/Target/UnixSignals.h
+++ b/lldb/include/lldb/Target/UnixSignals.h
@@ -22,7 +22,6 @@ namespace lldb_private {
 
 class UnixSignals {
 public:
-  static lldb::UnixSignalsSP Create(const ArchSpec &arch);
   static lldb::UnixSignalsSP CreateForHost();
 
   // Constructors and Destructors

diff  --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/CMakeLists.txt b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/CMakeLists.txt
index 3789f56325980..2844ba6b2bda2 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/CMakeLists.txt
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/CMakeLists.txt
@@ -19,6 +19,7 @@ add_lldb_library(lldbPluginAppleObjCRuntime PLUGIN
     lldbUtility
     lldbPluginExpressionParserClang
     lldbPluginCPPRuntime
+    lldbPluginProcessUtility
     lldbPluginTypeSystemClang
   CLANG_LIBS
     clangAST

diff  --git a/lldb/source/Plugins/Platform/FreeBSD/CMakeLists.txt b/lldb/source/Plugins/Platform/FreeBSD/CMakeLists.txt
index f981534d92163..8095a0b584dc3 100644
--- a/lldb/source/Plugins/Platform/FreeBSD/CMakeLists.txt
+++ b/lldb/source/Plugins/Platform/FreeBSD/CMakeLists.txt
@@ -1,4 +1,5 @@
 add_lldb_library(lldbPluginPlatformFreeBSD PLUGIN
+  FreeBSDSignals.cpp
   PlatformFreeBSD.cpp
 
    LINK_LIBS

diff  --git a/lldb/source/Plugins/Process/Utility/FreeBSDSignals.cpp b/lldb/source/Plugins/Platform/FreeBSD/FreeBSDSignals.cpp
similarity index 100%
rename from lldb/source/Plugins/Process/Utility/FreeBSDSignals.cpp
rename to lldb/source/Plugins/Platform/FreeBSD/FreeBSDSignals.cpp

diff  --git a/lldb/source/Plugins/Process/Utility/FreeBSDSignals.h b/lldb/source/Plugins/Platform/FreeBSD/FreeBSDSignals.h
similarity index 100%
rename from lldb/source/Plugins/Process/Utility/FreeBSDSignals.h
rename to lldb/source/Plugins/Platform/FreeBSD/FreeBSDSignals.h

diff  --git a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
index 3d29739c19adf..5ef029b917031 100644
--- a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
+++ b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "PlatformFreeBSD.h"
+#include "FreeBSDSignals.h"
 #include "lldb/Host/Config.h"
 
 #include <cstdio>
@@ -282,3 +283,7 @@ CompilerType PlatformFreeBSD::GetSiginfoType(const llvm::Triple &triple) {
   ast->CompleteTagDeclarationDefinition(siginfo_type);
   return siginfo_type;
 }
+
+lldb::UnixSignalsSP PlatformFreeBSD::CreateUnixSignals() {
+  return std::make_shared<FreeBSDSignals>();
+}

diff  --git a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
index 1e92bb4a1e147..d65b15aec243a 100644
--- a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
+++ b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h
@@ -59,6 +59,8 @@ class PlatformFreeBSD : public PlatformPOSIX {
 
   std::vector<ArchSpec> m_supported_architectures;
 
+  lldb::UnixSignalsSP CreateUnixSignals() override;
+
 private:
   std::mutex m_mutex;
   std::shared_ptr<TypeSystemClang> m_type_system;

diff  --git a/lldb/source/Plugins/Platform/Linux/CMakeLists.txt b/lldb/source/Plugins/Platform/Linux/CMakeLists.txt
index bad039d0ad509..b8bfa3bc78863 100644
--- a/lldb/source/Plugins/Platform/Linux/CMakeLists.txt
+++ b/lldb/source/Plugins/Platform/Linux/CMakeLists.txt
@@ -1,4 +1,5 @@
 add_lldb_library(lldbPluginPlatformLinux PLUGIN
+  LinuxSignals.cpp
   PlatformLinux.cpp
 
    LINK_LIBS

diff  --git a/lldb/source/Plugins/Process/Utility/LinuxSignals.cpp b/lldb/source/Plugins/Platform/Linux/LinuxSignals.cpp
similarity index 100%
rename from lldb/source/Plugins/Process/Utility/LinuxSignals.cpp
rename to lldb/source/Plugins/Platform/Linux/LinuxSignals.cpp

diff  --git a/lldb/source/Plugins/Process/Utility/LinuxSignals.h b/lldb/source/Plugins/Platform/Linux/LinuxSignals.h
similarity index 100%
rename from lldb/source/Plugins/Process/Utility/LinuxSignals.h
rename to lldb/source/Plugins/Platform/Linux/LinuxSignals.h

diff  --git a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
index bf226fabda5c9..d4e09c971eb2d 100644
--- a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
+++ b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "PlatformLinux.h"
+#include "LinuxSignals.h"
 #include "lldb/Host/Config.h"
 
 #include <cstdio>
@@ -480,3 +481,7 @@ CompilerType PlatformLinux::GetSiginfoType(const llvm::Triple &triple) {
   ast->CompleteTagDeclarationDefinition(siginfo_type);
   return siginfo_type;
 }
+
+lldb::UnixSignalsSP PlatformLinux::CreateUnixSignals() {
+  return std::make_shared<LinuxSignals>();
+}

diff  --git a/lldb/source/Plugins/Platform/Linux/PlatformLinux.h b/lldb/source/Plugins/Platform/Linux/PlatformLinux.h
index 89f0bd709ef60..e604d735ae017 100644
--- a/lldb/source/Plugins/Platform/Linux/PlatformLinux.h
+++ b/lldb/source/Plugins/Platform/Linux/PlatformLinux.h
@@ -64,6 +64,8 @@ class PlatformLinux : public PlatformPOSIX {
 
   std::vector<ArchSpec> m_supported_architectures;
 
+  lldb::UnixSignalsSP CreateUnixSignals() override;
+
 private:
   std::mutex m_mutex;
   std::shared_ptr<TypeSystemClang> m_type_system;

diff  --git a/lldb/source/Plugins/Platform/NetBSD/CMakeLists.txt b/lldb/source/Plugins/Platform/NetBSD/CMakeLists.txt
index 5e63f10980672..9c8083cbf2f2e 100644
--- a/lldb/source/Plugins/Platform/NetBSD/CMakeLists.txt
+++ b/lldb/source/Plugins/Platform/NetBSD/CMakeLists.txt
@@ -1,4 +1,5 @@
 add_lldb_library(lldbPluginPlatformNetBSD PLUGIN
+  NetBSDSignals.cpp
   PlatformNetBSD.cpp
 
    LINK_LIBS

diff  --git a/lldb/source/Plugins/Process/Utility/NetBSDSignals.cpp b/lldb/source/Plugins/Platform/NetBSD/NetBSDSignals.cpp
similarity index 100%
rename from lldb/source/Plugins/Process/Utility/NetBSDSignals.cpp
rename to lldb/source/Plugins/Platform/NetBSD/NetBSDSignals.cpp

diff  --git a/lldb/source/Plugins/Process/Utility/NetBSDSignals.h b/lldb/source/Plugins/Platform/NetBSD/NetBSDSignals.h
similarity index 100%
rename from lldb/source/Plugins/Process/Utility/NetBSDSignals.h
rename to lldb/source/Plugins/Platform/NetBSD/NetBSDSignals.h

diff  --git a/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp b/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp
index 59bbc3f638af1..41a48249dbbe9 100644
--- a/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp
+++ b/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "PlatformNetBSD.h"
+#include "NetBSDSignals.h"
 #include "lldb/Host/Config.h"
 
 #include <cstdio>
@@ -348,3 +349,7 @@ CompilerType PlatformNetBSD::GetSiginfoType(const llvm::Triple &triple) {
   ast->CompleteTagDeclarationDefinition(siginfo_type);
   return siginfo_type;
 }
+
+lldb::UnixSignalsSP PlatformNetBSD::CreateUnixSignals() {
+  return std::make_shared<NetBSDSignals>();
+}

diff  --git a/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h b/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h
index 3437d7e5eb511..de591b8f7a255 100644
--- a/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h
+++ b/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h
@@ -61,6 +61,8 @@ class PlatformNetBSD : public PlatformPOSIX {
 
   std::vector<ArchSpec> m_supported_architectures;
 
+  lldb::UnixSignalsSP CreateUnixSignals() override;
+
 private:
   std::mutex m_mutex;
   std::shared_ptr<TypeSystemClang> m_type_system;

diff  --git a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
index 222dbfa719647..7033158c928e6 100644
--- a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
+++ b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
@@ -27,6 +27,7 @@
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Thread.h"
+#include "lldb/Target/UnixSignals.h"
 #include "lldb/Utility/DataBufferHeap.h"
 #include "lldb/Utility/FileSpec.h"
 #include "lldb/Utility/LLDBLog.h"
@@ -294,9 +295,13 @@ std::string PlatformPOSIX::GetPlatformSpecificConnectionInformation() {
     return "";
 }
 
-const lldb::UnixSignalsSP &PlatformPOSIX::GetRemoteUnixSignals() {
-  if (IsRemote() && m_remote_platform_sp)
-    return m_remote_platform_sp->GetRemoteUnixSignals();
+lldb::UnixSignalsSP PlatformPOSIX::GetRemoteUnixSignals() {
+  if (IsRemote() && m_remote_platform_sp) {
+    if (auto unix_signals_sp = m_remote_platform_sp->GetRemoteUnixSignals())
+      return unix_signals_sp;
+  }
+  if (auto unix_signals_sp = CreateUnixSignals())
+    return unix_signals_sp;
   return Platform::GetRemoteUnixSignals();
 }
 
@@ -989,3 +994,7 @@ ConstString PlatformPOSIX::GetFullNameForDylib(ConstString basename) {
   stream.Printf("lib%s.so", basename.GetCString());
   return ConstString(stream.GetString());
 }
+
+lldb::UnixSignalsSP PlatformPOSIX::CreateUnixSignals() {
+  return std::make_shared<UnixSignals>();
+}

diff  --git a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h
index 511797ce6bb7c..f48dc6ef53d04 100644
--- a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h
+++ b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h
@@ -35,7 +35,7 @@ class PlatformPOSIX : public lldb_private::RemoteAwarePlatform {
   GetFile(const lldb_private::FileSpec &source,
           const lldb_private::FileSpec &destination) override;
 
-  const lldb::UnixSignalsSP &GetRemoteUnixSignals() override;
+  lldb::UnixSignalsSP GetRemoteUnixSignals() override;
 
   lldb::ProcessSP Attach(lldb_private::ProcessAttachInfo &attach_info,
                          lldb_private::Debugger &debugger,
@@ -69,6 +69,8 @@ class PlatformPOSIX : public lldb_private::RemoteAwarePlatform {
 
   lldb_private::ConstString GetFullNameForDylib(lldb_private::ConstString basename) override;
 
+  lldb::UnixSignalsSP CreateUnixSignals() override;
+
 protected:
   std::unique_ptr<lldb_private::OptionGroupPlatformRSync>
       m_option_group_platform_rsync;

diff  --git a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h
index 596cf75b591f2..ca72062b21e88 100644
--- a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h
+++ b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h
@@ -69,6 +69,12 @@ class PlatformQemuUser : public Platform {
         arch, addr, length, prot, flags, fd, offset);
   }
 
+  lldb::UnixSignalsSP CreateUnixSignals() override {
+    // PlatformQemuUser shouldn't create its own UnixSignals. It should defer to
+    // other platforms.
+    return lldb::UnixSignalsSP();
+  }
+
 private:
   static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch);
   static void DebuggerInitialize(Debugger &debugger);

diff  --git a/lldb/source/Plugins/Platform/Windows/PlatformWindows.h b/lldb/source/Plugins/Platform/Windows/PlatformWindows.h
index 771133f341e90..8c36f8c4a13ba 100644
--- a/lldb/source/Plugins/Platform/Windows/PlatformWindows.h
+++ b/lldb/source/Plugins/Platform/Windows/PlatformWindows.h
@@ -82,6 +82,10 @@ class PlatformWindows : public RemoteAwarePlatform {
 
   std::vector<ArchSpec> m_supported_architectures;
 
+  lldb::UnixSignalsSP CreateUnixSignals() override {
+    return lldb::UnixSignalsSP();
+  }
+
 private:
   std::unique_ptr<lldb_private::UtilityFunction>
   MakeLoadImageUtilityFunction(lldb_private::ExecutionContext &context,

diff  --git a/lldb/source/Plugins/Platform/gdb-server/CMakeLists.txt b/lldb/source/Plugins/Platform/gdb-server/CMakeLists.txt
index 2fbe817acbdd2..f00aa19cfac9c 100644
--- a/lldb/source/Plugins/Platform/gdb-server/CMakeLists.txt
+++ b/lldb/source/Plugins/Platform/gdb-server/CMakeLists.txt
@@ -1,4 +1,5 @@
 add_lldb_library(lldbPluginPlatformGDB PLUGIN
+  GDBRemoteSignals.cpp
   PlatformRemoteGDBServer.cpp
 
    LINK_LIBS
@@ -6,6 +7,5 @@ add_lldb_library(lldbPluginPlatformGDB PLUGIN
     lldbCore
     lldbHost
     lldbTarget
-    lldbPluginProcessUtility
     lldbPluginProcessGDBRemote
   )

diff  --git a/lldb/source/Plugins/Process/Utility/GDBRemoteSignals.cpp b/lldb/source/Plugins/Platform/gdb-server/GDBRemoteSignals.cpp
similarity index 100%
rename from lldb/source/Plugins/Process/Utility/GDBRemoteSignals.cpp
rename to lldb/source/Plugins/Platform/gdb-server/GDBRemoteSignals.cpp

diff  --git a/lldb/source/Plugins/Process/Utility/GDBRemoteSignals.h b/lldb/source/Plugins/Platform/gdb-server/GDBRemoteSignals.h
similarity index 100%
rename from lldb/source/Plugins/Process/Utility/GDBRemoteSignals.h
rename to lldb/source/Plugins/Platform/gdb-server/GDBRemoteSignals.h

diff  --git a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
index 0858a2a8d3c8b..b25a151b0fcca 100644
--- a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
+++ b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "PlatformRemoteGDBServer.h"
+#include "GDBRemoteSignals.h"
 #include "lldb/Host/Config.h"
 
 #include "lldb/Breakpoint/BreakpointLocation.h"
@@ -31,7 +32,6 @@
 #include "lldb/Utility/UriParser.h"
 #include "llvm/Support/FormatAdapters.h"
 
-#include "Plugins/Process/Utility/GDBRemoteSignals.h"
 #include "Plugins/Process/gdb-remote/ProcessGDBRemote.h"
 #include <optional>
 
@@ -680,17 +680,13 @@ void PlatformRemoteGDBServer::CalculateTrapHandlerSymbolNames() {
   m_trap_handlers.push_back(ConstString("_sigtramp"));
 }
 
-const UnixSignalsSP &PlatformRemoteGDBServer::GetRemoteUnixSignals() {
+UnixSignalsSP PlatformRemoteGDBServer::GetRemoteUnixSignals() {
   if (!IsConnected())
-    return Platform::GetRemoteUnixSignals();
+    return UnixSignalsSP();
 
   if (m_remote_signals_sp)
     return m_remote_signals_sp;
 
-  // If packet not implemented or JSON failed to parse, we'll guess the signal
-  // set based on the remote architecture.
-  m_remote_signals_sp = UnixSignals::Create(GetRemoteSystemArchitecture());
-
   StringExtractorGDBRemote response;
   auto result =
       m_gdb_client_up->SendPacketAndWaitForResponse("jSignalsInfo", response);

diff  --git a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
index 638f7db5ef800..f83f607830f4a 100644
--- a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
+++ b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
@@ -13,7 +13,6 @@
 #include <optional>
 #include <string>
 
-#include "Plugins/Process/Utility/GDBRemoteSignals.h"
 #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h"
 #include "lldb/Target/Platform.h"
 
@@ -146,7 +145,7 @@ class PlatformRemoteGDBServer : public Platform, private UserIDResolver {
 
   void CalculateTrapHandlerSymbolNames() override;
 
-  const lldb::UnixSignalsSP &GetRemoteUnixSignals() override;
+  lldb::UnixSignalsSP GetRemoteUnixSignals() override;
 
   size_t ConnectToWaitingProcesses(lldb_private::Debugger &debugger,
                                    lldb_private::Status &error) override;
@@ -154,6 +153,11 @@ class PlatformRemoteGDBServer : public Platform, private UserIDResolver {
   virtual size_t
   GetPendingGdbServerList(std::vector<std::string> &connection_urls);
 
+  lldb::UnixSignalsSP CreateUnixSignals() override {
+    // PlatformRemoteGDBServer should defer to other platforms.
+    return lldb::UnixSignalsSP();
+  }
+
 protected:
   std::unique_ptr<process_gdb_remote::GDBRemoteCommunicationClient>
       m_gdb_client_up;

diff  --git a/lldb/source/Plugins/Process/Utility/CMakeLists.txt b/lldb/source/Plugins/Process/Utility/CMakeLists.txt
index edf4e851b653c..7feb8596d8bfe 100644
--- a/lldb/source/Plugins/Process/Utility/CMakeLists.txt
+++ b/lldb/source/Plugins/Process/Utility/CMakeLists.txt
@@ -1,18 +1,14 @@
 add_lldb_library(lldbPluginProcessUtility
   AuxVector.cpp
-  FreeBSDSignals.cpp
-  GDBRemoteSignals.cpp
   HistoryThread.cpp
   HistoryUnwind.cpp
   InferiorCallPOSIX.cpp
   LinuxProcMaps.cpp
-  LinuxSignals.cpp
   MemoryTagManagerAArch64MTE.cpp
   NativeProcessSoftwareSingleStep.cpp
   NativeRegisterContextDBReg_arm64.cpp
   NativeRegisterContextDBReg_x86.cpp
   NativeRegisterContextRegisterInfo.cpp
-  NetBSDSignals.cpp
   RegisterContext_x86.cpp
   RegisterContextDarwin_arm.cpp
   RegisterContextDarwin_arm64.cpp

diff  --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp
index 24d3c4bd0ba24..2771d1d20cf0c 100644
--- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp
+++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp
@@ -18,6 +18,7 @@
 #include "lldb/Target/ABI.h"
 #include "lldb/Target/DynamicLoader.h"
 #include "lldb/Target/MemoryRegionInfo.h"
+#include "lldb/Target/Platform.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Target/UnixSignals.h"
 #include "lldb/Utility/DataBufferHeap.h"
@@ -223,9 +224,10 @@ Status ProcessElfCore::DoLoadCore() {
   ArchSpec target_arch = GetTarget().GetArchitecture();
   ArchSpec core_arch(m_core_module_sp->GetArchitecture());
   target_arch.MergeFrom(core_arch);
-  GetTarget().SetArchitecture(target_arch);
- 
-  SetUnixSignals(UnixSignals::Create(GetArchitecture()));
+  GetTarget().SetArchitecture(target_arch, /* set_platform = */ true);
+
+  if (auto platform_sp = GetTarget().GetPlatform())
+    SetUnixSignals(platform_sp->GetUnixSignals());
 
   // Ensure we found at least one thread that was stopped on a signal.
   bool siginfo_signal_found = false;

diff  --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 7b083e1478db0..c2e60ac2b1797 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -74,7 +74,7 @@
 
 #include "GDBRemoteRegisterContext.h"
 #include "GDBRemoteRegisterFallback.h"
-#include "Plugins/Process/Utility/GDBRemoteSignals.h"
+#include "Plugins/Platform/gdb-server/GDBRemoteSignals.h"
 #include "Plugins/Process/Utility/InferiorCallPOSIX.h"
 #include "Plugins/Process/Utility/StopInfoMachException.h"
 #include "ProcessGDBRemote.h"
@@ -967,15 +967,13 @@ void ProcessGDBRemote::DidLaunchOrAttach(ArchSpec &process_arch) {
     MapSupportedStructuredDataPlugins(*supported_packets);
 
   // If connected to LLDB ("native-signals+"), use signal defs for
-  // the remote platform.  If connected to GDB, just use the standard set.
-  if (!m_gdb_comm.UsesNativeSignals()) {
+  // the remote platform (assuming it's available).  If connected to GDB, just
+  // use the standard set.
+  auto platform_sp = GetTarget().GetPlatform();
+  if (!platform_sp || !m_gdb_comm.UsesNativeSignals())
     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()));
+  else {
+    SetUnixSignals(platform_sp->GetUnixSignals());
   }
 }
 

diff  --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
index cf6166ecd77b9..f082d6f0e8afa 100644
--- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
+++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
@@ -206,12 +206,14 @@ Status ProcessMinidump::DoLoadCore() {
                                    arch.GetArchitectureName());
     return error;
   }
-  GetTarget().SetArchitecture(arch, true /*set_platform*/);
+  GetTarget().SetArchitecture(arch, /*set_platform = */ true);
 
   m_thread_list = m_minidump_parser->GetThreads();
   m_active_exception = m_minidump_parser->GetExceptionStream();
 
-  SetUnixSignals(UnixSignals::Create(GetArchitecture()));
+  auto platform_sp = GetTarget().GetPlatform();
+  if (platform_sp)
+    SetUnixSignals(platform_sp->GetUnixSignals());
 
   ReadModuleList();
   if (ModuleSP module = GetTarget().GetExecutableModule())

diff  --git a/lldb/source/Target/CMakeLists.txt b/lldb/source/Target/CMakeLists.txt
index c75a10cf61c14..0cb3573916424 100644
--- a/lldb/source/Target/CMakeLists.txt
+++ b/lldb/source/Target/CMakeLists.txt
@@ -85,7 +85,6 @@ add_lldb_library(lldbTarget
     lldbInterpreter
     lldbSymbol
     lldbUtility
-    lldbPluginProcessUtility
 
   LINK_COMPONENTS
     Support

diff  --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp
index 1ddd7596280ee..e0c0e9b689b03 100644
--- a/lldb/source/Target/Platform.cpp
+++ b/lldb/source/Target/Platform.cpp
@@ -1672,7 +1672,7 @@ FileSpec Platform::GetModuleCacheRoot() {
 
 const char *Platform::GetCacheHostname() { return GetHostname(); }
 
-const UnixSignalsSP &Platform::GetRemoteUnixSignals() {
+UnixSignalsSP Platform::GetRemoteUnixSignals() {
   static const auto s_default_unix_signals_sp = std::make_shared<UnixSignals>();
   return s_default_unix_signals_sp;
 }

diff  --git a/lldb/source/Target/UnixSignals.cpp b/lldb/source/Target/UnixSignals.cpp
index d754537cc4cf4..7c643c05b2f9b 100644
--- a/lldb/source/Target/UnixSignals.cpp
+++ b/lldb/source/Target/UnixSignals.cpp
@@ -7,10 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "lldb/Target/UnixSignals.h"
-#include "Plugins/Process/Utility/FreeBSDSignals.h"
-#include "Plugins/Process/Utility/LinuxSignals.h"
-#include "Plugins/Process/Utility/NetBSDSignals.h"
 #include "lldb/Host/HostInfo.h"
+#include "lldb/Target/Platform.h"
 #include "lldb/Utility/ArchSpec.h"
 #include <optional>
 #include <sstream>
@@ -30,24 +28,25 @@ UnixSignals::Signal::Signal(const char *name, bool default_suppress,
     m_description.assign(description);
 }
 
-lldb::UnixSignalsSP UnixSignals::Create(const ArchSpec &arch) {
-  const auto &triple = arch.GetTriple();
-  switch (triple.getOS()) {
-  case llvm::Triple::Linux:
-    return std::make_shared<LinuxSignals>();
-  case llvm::Triple::FreeBSD:
-  case llvm::Triple::OpenBSD:
-    return std::make_shared<FreeBSDSignals>();
-  case llvm::Triple::NetBSD:
-    return std::make_shared<NetBSDSignals>();
-  default:
-    return std::make_shared<UnixSignals>();
+lldb::UnixSignalsSP UnixSignals::CreateForHost() {
+  static lldb::UnixSignalsSP s_unix_signals_sp;
+  if (s_unix_signals_sp)
+    return s_unix_signals_sp;
+
+  auto host_platform_sp = Platform::GetHostPlatform();
+
+  // If we have no host platform, be resilient and use default UnixSignals.
+  if (!host_platform_sp)
+    s_unix_signals_sp = std::make_shared<UnixSignals>();
+  else {
+    s_unix_signals_sp = host_platform_sp->CreateUnixSignals();
+    // If the Host platform cannot create a UnixSignals object, fall back to the
+    // default UnixSignals. This may happen on platforms without a
+    // UnixSignals implementation (e.g. Windows).
+    if (!s_unix_signals_sp)
+      s_unix_signals_sp = std::make_shared<UnixSignals>();
   }
-}
 
-lldb::UnixSignalsSP UnixSignals::CreateForHost() {
-  static lldb::UnixSignalsSP s_unix_signals_sp =
-      Create(HostInfo::GetArchitecture());
   return s_unix_signals_sp;
 }
 

diff  --git a/lldb/unittests/Process/gdb-remote/CMakeLists.txt b/lldb/unittests/Process/gdb-remote/CMakeLists.txt
index de14dc0169c13..233065609d841 100644
--- a/lldb/unittests/Process/gdb-remote/CMakeLists.txt
+++ b/lldb/unittests/Process/gdb-remote/CMakeLists.txt
@@ -11,7 +11,7 @@ add_lldb_unittest(ProcessGdbRemoteTests
     lldbCore
     lldbHost
     lldbPluginPlatformMacOSX
-    lldbPluginProcessUtility
+    lldbPluginPlatformLinux
     lldbPluginProcessGDBRemote
 
     LLVMTestingSupport

diff  --git a/lldb/unittests/Process/gdb-remote/GDBRemoteClientBaseTest.cpp b/lldb/unittests/Process/gdb-remote/GDBRemoteClientBaseTest.cpp
index 99d1e12359e72..934f0dcb0596f 100644
--- a/lldb/unittests/Process/gdb-remote/GDBRemoteClientBaseTest.cpp
+++ b/lldb/unittests/Process/gdb-remote/GDBRemoteClientBaseTest.cpp
@@ -9,7 +9,7 @@
 
 #include "GDBRemoteTestUtils.h"
 
-#include "Plugins/Process/Utility/LinuxSignals.h"
+#include "Plugins/Platform/Linux/LinuxSignals.h"
 #include "Plugins/Process/gdb-remote/GDBRemoteClientBase.h"
 #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h"
 #include "lldb/Utility/GDBRemote.h"

diff  --git a/lldb/unittests/Target/RemoteAwarePlatformTest.cpp b/lldb/unittests/Target/RemoteAwarePlatformTest.cpp
index c36bd35c819dd..cf80de6bec056 100644
--- a/lldb/unittests/Target/RemoteAwarePlatformTest.cpp
+++ b/lldb/unittests/Target/RemoteAwarePlatformTest.cpp
@@ -35,6 +35,8 @@ class RemoteAwarePlatformTester : public RemoteAwarePlatform {
   MOCK_METHOD2(ResolveRemoteExecutable,
                std::pair<Status, ModuleSP>(const ModuleSpec &,
                                            const FileSpecList *));
+  MOCK_METHOD0(CreateUnixSignals, lldb::UnixSignalsSP());
+
   Status ResolveRemoteExecutable(
       const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp,
       const FileSpecList *module_search_paths_ptr) /*override*/
@@ -61,6 +63,7 @@ class TargetPlatformTester : public Platform {
                ProcessSP(ProcessAttachInfo &, Debugger &, Target *, Status &));
   MOCK_METHOD0(CalculateTrapHandlerSymbolNames, void());
   MOCK_METHOD0(GetUserIDResolver, UserIDResolver &());
+  MOCK_METHOD0(CreateUnixSignals, lldb::UnixSignalsSP());
 };
 
 namespace {


        


More information about the lldb-commits mailing list