OSDN Git Service

[lldb/Reproducers] Move connection logic into replay server (NFC)
authorJonas Devlieghere <jonas@devlieghere.com>
Tue, 19 May 2020 16:55:07 +0000 (09:55 -0700)
committerJonas Devlieghere <jonas@devlieghere.com>
Tue, 19 May 2020 17:55:35 +0000 (10:55 -0700)
Move the logic for connecting to the replay server into the replay
server itself, so it can be reused outside of ProcessGDBRemote.

lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.cpp
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.h
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h

index 910dcf2..920327e 100644 (file)
@@ -287,3 +287,28 @@ thread_result_t GDBRemoteCommunicationReplayServer::AsyncThread(void *arg) {
 
   return {};
 }
+
+Status GDBRemoteCommunicationReplayServer::Connect(
+    process_gdb_remote::GDBRemoteCommunicationClient &client) {
+  repro::Loader *loader = repro::Reproducer::Instance().GetLoader();
+  if (!loader)
+    return Status("No loader provided.");
+
+  static std::unique_ptr<repro::MultiLoader<repro::GDBRemoteProvider>>
+      multi_loader = repro::MultiLoader<repro::GDBRemoteProvider>::Create(
+          repro::Reproducer::Instance().GetLoader());
+  if (!multi_loader)
+    return Status("No gdb remote provider found.");
+
+  llvm::Optional<std::string> history_file = multi_loader->GetNextFile();
+  if (!history_file)
+    return Status("No gdb remote packet log found.");
+
+  if (auto error = LoadReplayHistory(FileSpec(*history_file)))
+    return Status("Unable to load replay history");
+
+  if (auto error = GDBRemoteCommunication::ConnectLocally(client, *this))
+    return Status("Unable to connect to replay server");
+
+  return {};
+}
index 1263b3c..6558729 100644 (file)
@@ -11,6 +11,7 @@
 
 // Other libraries and framework includes
 #include "GDBRemoteCommunication.h"
+#include "GDBRemoteCommunicationClient.h"
 #include "GDBRemoteCommunicationHistory.h"
 
 // Project includes
@@ -51,6 +52,8 @@ public:
   bool StartAsyncThread();
   void StopAsyncThread();
 
+  Status Connect(process_gdb_remote::GDBRemoteCommunicationClient &client);
+
 protected:
   enum {
     eBroadcastBitAsyncContinue = (1 << 0),
index dbad49d..58e9712 100644 (file)
@@ -649,8 +649,8 @@ Status ProcessGDBRemote::DoConnectRemote(Stream *strm,
   if (error.Fail())
     return error;
 
-  if (repro::Loader *loader = repro::Reproducer::Instance().GetLoader())
-    error = ConnectToReplayServer(loader);
+  if (repro::Reproducer::Instance().IsReplaying())
+    error = ConnectToReplayServer();
   else
     error = ConnectToDebugserver(remote_url);
 
@@ -3355,30 +3355,10 @@ Status ProcessGDBRemote::DoSignal(int signo) {
   return error;
 }
 
-Status ProcessGDBRemote::ConnectToReplayServer(repro::Loader *loader) {
-  if (!loader)
-    return Status("No loader provided.");
-
-  static std::unique_ptr<repro::MultiLoader<repro::GDBRemoteProvider>>
-      multi_loader = repro::MultiLoader<repro::GDBRemoteProvider>::Create(
-          repro::Reproducer::Instance().GetLoader());
-
-  if (!multi_loader)
-    return Status("No gdb remote provider found.");
-
-  llvm::Optional<std::string> history_file = multi_loader->GetNextFile();
-  if (!history_file)
-    return Status("No gdb remote packet log found.");
-
-  // Load replay history.
-  if (auto error =
-          m_gdb_replay_server.LoadReplayHistory(FileSpec(*history_file)))
-    return Status("Unable to load replay history");
-
-  // Make a local connection.
-  if (auto error = GDBRemoteCommunication::ConnectLocally(m_gdb_comm,
-                                                          m_gdb_replay_server))
-    return Status("Unable to connect to replay server");
+Status ProcessGDBRemote::ConnectToReplayServer() {
+  Status status = m_gdb_replay_server.Connect(m_gdb_comm);
+  if (status.Fail())
+    return status;
 
   // Enable replay mode.
   m_replay_mode = true;
@@ -3403,8 +3383,8 @@ ProcessGDBRemote::EstablishConnectionIfNeeded(const ProcessInfo &process_info) {
   if (platform_sp && !platform_sp->IsHost())
     return Status("Lost debug server connection");
 
-  if (repro::Loader *loader = repro::Reproducer::Instance().GetLoader())
-    return ConnectToReplayServer(loader);
+  if (repro::Reproducer::Instance().IsReplaying())
+    return ConnectToReplayServer();
 
   auto error = LaunchAndConnectToDebugserver(process_info);
   if (error.Fail()) {
index 9063fcb..6ed75dd 100644 (file)
@@ -312,7 +312,7 @@ protected:
   bool UpdateThreadList(ThreadList &old_thread_list,
                         ThreadList &new_thread_list) override;
 
-  Status ConnectToReplayServer(repro::Loader *loader);
+  Status ConnectToReplayServer();
 
   Status EstablishConnectionIfNeeded(const ProcessInfo &process_info);
 
@@ -387,7 +387,7 @@ protected:
   DynamicLoader *GetDynamicLoader() override;
 
   bool GetGDBServerRegisterInfoXMLAndProcess(ArchSpec &arch_to_use,
-                                             std::string xml_filename, 
+                                             std::string xml_filename,
                                              uint32_t &cur_reg_num,
                                              uint32_t &reg_offset);