From ee232506b870ce5282cc4da5ca493d41d361feb3 Mon Sep 17 00:00:00 2001 From: Alex Langford Date: Thu, 16 Mar 2023 14:47:17 -0700 Subject: [PATCH] [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 --- lldb/include/lldb/Target/Platform.h | 4 ++- lldb/include/lldb/Target/UnixSignals.h | 1 - .../ObjC/AppleObjCRuntime/CMakeLists.txt | 1 + .../source/Plugins/Platform/FreeBSD/CMakeLists.txt | 1 + .../FreeBSD}/FreeBSDSignals.cpp | 0 .../Utility => Platform/FreeBSD}/FreeBSDSignals.h | 0 .../Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp | 5 +++ .../Plugins/Platform/FreeBSD/PlatformFreeBSD.h | 2 ++ lldb/source/Plugins/Platform/Linux/CMakeLists.txt | 1 + .../Utility => Platform/Linux}/LinuxSignals.cpp | 0 .../Utility => Platform/Linux}/LinuxSignals.h | 0 .../Plugins/Platform/Linux/PlatformLinux.cpp | 5 +++ lldb/source/Plugins/Platform/Linux/PlatformLinux.h | 2 ++ lldb/source/Plugins/Platform/NetBSD/CMakeLists.txt | 1 + .../Utility => Platform/NetBSD}/NetBSDSignals.cpp | 0 .../Utility => Platform/NetBSD}/NetBSDSignals.h | 0 .../Plugins/Platform/NetBSD/PlatformNetBSD.cpp | 5 +++ .../Plugins/Platform/NetBSD/PlatformNetBSD.h | 2 ++ .../Plugins/Platform/POSIX/PlatformPOSIX.cpp | 15 +++++++-- lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h | 4 ++- .../Plugins/Platform/QemuUser/PlatformQemuUser.h | 6 ++++ .../Plugins/Platform/Windows/PlatformWindows.h | 4 +++ .../Plugins/Platform/gdb-server/CMakeLists.txt | 2 +- .../gdb-server}/GDBRemoteSignals.cpp | 0 .../gdb-server}/GDBRemoteSignals.h | 0 .../gdb-server/PlatformRemoteGDBServer.cpp | 10 ++---- .../Platform/gdb-server/PlatformRemoteGDBServer.h | 8 +++-- lldb/source/Plugins/Process/Utility/CMakeLists.txt | 4 --- .../Plugins/Process/elf-core/ProcessElfCore.cpp | 8 +++-- .../Process/gdb-remote/ProcessGDBRemote.cpp | 16 ++++------ .../Plugins/Process/minidump/ProcessMinidump.cpp | 6 ++-- lldb/source/Target/CMakeLists.txt | 1 - lldb/source/Target/Platform.cpp | 2 +- lldb/source/Target/UnixSignals.cpp | 37 +++++++++++----------- lldb/unittests/Process/gdb-remote/CMakeLists.txt | 2 +- .../Process/gdb-remote/GDBRemoteClientBaseTest.cpp | 2 +- lldb/unittests/Target/RemoteAwarePlatformTest.cpp | 3 ++ 37 files changed, 103 insertions(+), 57 deletions(-) rename lldb/source/Plugins/{Process/Utility => Platform/FreeBSD}/FreeBSDSignals.cpp (100%) rename lldb/source/Plugins/{Process/Utility => Platform/FreeBSD}/FreeBSDSignals.h (100%) rename lldb/source/Plugins/{Process/Utility => Platform/Linux}/LinuxSignals.cpp (100%) rename lldb/source/Plugins/{Process/Utility => Platform/Linux}/LinuxSignals.h (100%) rename lldb/source/Plugins/{Process/Utility => Platform/NetBSD}/NetBSDSignals.cpp (100%) rename lldb/source/Plugins/{Process/Utility => Platform/NetBSD}/NetBSDSignals.h (100%) rename lldb/source/Plugins/{Process/Utility => Platform/gdb-server}/GDBRemoteSignals.cpp (100%) rename lldb/source/Plugins/{Process/Utility => Platform/gdb-server}/GDBRemoteSignals.h (100%) diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h index 08e47cc..e184249 100644 --- a/lldb/include/lldb/Target/Platform.h +++ b/lldb/include/lldb/Target/Platform.h @@ -619,10 +619,12 @@ public: 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 ac47a27..1287e00 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 3789f56..2844ba6 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 f981534..8095a0b5 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 3d29739..5ef029b 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 @@ -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(); +} diff --git a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h index 1e92bb4..d65b15a 100644 --- a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h +++ b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.h @@ -59,6 +59,8 @@ public: std::vector m_supported_architectures; + lldb::UnixSignalsSP CreateUnixSignals() override; + private: std::mutex m_mutex; std::shared_ptr m_type_system; diff --git a/lldb/source/Plugins/Platform/Linux/CMakeLists.txt b/lldb/source/Plugins/Platform/Linux/CMakeLists.txt index bad039d..b8bfa3b 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 bf226fa..d4e09c9 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 @@ -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(); +} diff --git a/lldb/source/Plugins/Platform/Linux/PlatformLinux.h b/lldb/source/Plugins/Platform/Linux/PlatformLinux.h index 89f0bd7..e604d73 100644 --- a/lldb/source/Plugins/Platform/Linux/PlatformLinux.h +++ b/lldb/source/Plugins/Platform/Linux/PlatformLinux.h @@ -64,6 +64,8 @@ public: std::vector m_supported_architectures; + lldb::UnixSignalsSP CreateUnixSignals() override; + private: std::mutex m_mutex; std::shared_ptr m_type_system; diff --git a/lldb/source/Plugins/Platform/NetBSD/CMakeLists.txt b/lldb/source/Plugins/Platform/NetBSD/CMakeLists.txt index 5e63f10..9c8083c 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 59bbc3f..41a4824 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 @@ -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(); +} diff --git a/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h b/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h index 3437d7e..de591b8 100644 --- a/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h +++ b/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.h @@ -61,6 +61,8 @@ public: std::vector m_supported_architectures; + lldb::UnixSignalsSP CreateUnixSignals() override; + private: std::mutex m_mutex; std::shared_ptr m_type_system; diff --git a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp index 222dbfa..7033158 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(); +} diff --git a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h index 511797c..f48dc6e 100644 --- a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h +++ b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.h @@ -35,7 +35,7 @@ public: 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 @@ public: lldb_private::ConstString GetFullNameForDylib(lldb_private::ConstString basename) override; + lldb::UnixSignalsSP CreateUnixSignals() override; + protected: std::unique_ptr m_option_group_platform_rsync; diff --git a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h index 596cf75..ca72062 100644 --- a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h +++ b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.h @@ -69,6 +69,12 @@ public: 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 771133f..8c36f8c 100644 --- a/lldb/source/Plugins/Platform/Windows/PlatformWindows.h +++ b/lldb/source/Plugins/Platform/Windows/PlatformWindows.h @@ -82,6 +82,10 @@ public: std::vector m_supported_architectures; + lldb::UnixSignalsSP CreateUnixSignals() override { + return lldb::UnixSignalsSP(); + } + private: std::unique_ptr 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 2fbe817..f00aa19 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 0858a2a..b25a151 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 @@ -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 638f7db..f83f607 100644 --- a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h +++ b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h @@ -13,7 +13,6 @@ #include #include -#include "Plugins/Process/Utility/GDBRemoteSignals.h" #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h" #include "lldb/Target/Platform.h" @@ -146,7 +145,7 @@ public: 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 @@ public: virtual size_t GetPendingGdbServerList(std::vector &connection_urls); + lldb::UnixSignalsSP CreateUnixSignals() override { + // PlatformRemoteGDBServer should defer to other platforms. + return lldb::UnixSignalsSP(); + } + protected: std::unique_ptr m_gdb_client_up; diff --git a/lldb/source/Plugins/Process/Utility/CMakeLists.txt b/lldb/source/Plugins/Process/Utility/CMakeLists.txt index edf4e85..7feb859 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 24d3c4b..2771d1d 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 7b083e1..c2e60ac 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()); - } 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 cf6166e..f082d6f 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 c75a10c..0cb3573 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 1ddd759..e0c0e9b 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(); return s_default_unix_signals_sp; } diff --git a/lldb/source/Target/UnixSignals.cpp b/lldb/source/Target/UnixSignals.cpp index d754537..7c643c0 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 #include @@ -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(); - case llvm::Triple::FreeBSD: - case llvm::Triple::OpenBSD: - return std::make_shared(); - case llvm::Triple::NetBSD: - return std::make_shared(); - default: - return std::make_shared(); +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(); + 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(); } -} -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 de14dc0..2330656 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 99d1e12..934f0dc 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 c36bd35..cf80de6 100644 --- a/lldb/unittests/Target/RemoteAwarePlatformTest.cpp +++ b/lldb/unittests/Target/RemoteAwarePlatformTest.cpp @@ -35,6 +35,8 @@ public: MOCK_METHOD2(ResolveRemoteExecutable, std::pair(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 @@ public: ProcessSP(ProcessAttachInfo &, Debugger &, Target *, Status &)); MOCK_METHOD0(CalculateTrapHandlerSymbolNames, void()); MOCK_METHOD0(GetUserIDResolver, UserIDResolver &()); + MOCK_METHOD0(CreateUnixSignals, lldb::UnixSignalsSP()); }; namespace { -- 2.7.4