diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-24 22:00:03 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-24 22:00:03 +0000 | 
| commit | 480093f4440d54b30b3025afeac24b48f2ba7a2e (patch) | |
| tree | 162e72994062888647caf0d875428db9445491a8 /contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | |
| parent | 489b1cf2ecf5b9b4a394857987014bfb09067726 (diff) | |
| parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) | |
Notes
Diffstat (limited to 'contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp')
| -rw-r--r-- | contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 106 | 
1 files changed, 45 insertions, 61 deletions
| diff --git a/contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 9971075364c2..75311ee11c0f 100644 --- a/contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -10,7 +10,7 @@  #include <errno.h>  #include <stdlib.h> -#ifndef LLDB_DISABLE_POSIX +#if LLDB_ENABLE_POSIX  #include <netinet/in.h>  #include <sys/mman.h>  #include <sys/socket.h> @@ -156,6 +156,11 @@ public:          nullptr, idx,          g_processgdbremote_properties[idx].default_uint_value != 0);    } + +  bool GetUseGPacketForReading() const { +    const uint32_t idx = ePropertyUseGPacketForReading; +    return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, true); +  }  };  typedef std::shared_ptr<PluginProperties> ProcessKDPPropertiesSP; @@ -276,12 +281,9 @@ ProcessGDBRemote::ProcessGDBRemote(lldb::TargetSP target_sp,                                     "async thread did exit");    if (repro::Generator *g = repro::Reproducer::Instance().GetGenerator()) { -    repro::ProcessGDBRemoteProvider &provider = -        g->GetOrCreate<repro::ProcessGDBRemoteProvider>(); -    // Set the history stream to the stream owned by the provider. -    m_gdb_comm.SetHistoryStream(provider.GetHistoryStream()); -    // Make sure to clear the stream again when we're finished. -    provider.SetCallback([&]() { m_gdb_comm.SetHistoryStream(nullptr); }); +    repro::GDBRemoteProvider &provider = +        g->GetOrCreate<repro::GDBRemoteProvider>(); +    m_gdb_comm.SetPacketRecorder(provider.GetNewPacketRecorder());    }    Log *log(ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_ASYNC)); @@ -311,6 +313,9 @@ ProcessGDBRemote::ProcessGDBRemote(lldb::TargetSP target_sp,        GetGlobalPluginProperties()->GetPacketTimeout();    if (timeout_seconds > 0)      m_gdb_comm.SetPacketTimeout(std::chrono::seconds(timeout_seconds)); + +  m_use_g_packet_for_reading = +      GetGlobalPluginProperties()->GetUseGPacketForReading();  }  // Destructor @@ -382,36 +387,6 @@ bool ProcessGDBRemote::ParsePythonTargetDefinition(    return false;  } -// If the remote stub didn't give us eh_frame or DWARF register numbers for a -// register, see if the ABI can provide them. -// DWARF and eh_frame register numbers are defined as a part of the ABI. -static void AugmentRegisterInfoViaABI(RegisterInfo ®_info, -                                      ConstString reg_name, ABISP abi_sp) { -  if (reg_info.kinds[eRegisterKindEHFrame] == LLDB_INVALID_REGNUM || -      reg_info.kinds[eRegisterKindDWARF] == LLDB_INVALID_REGNUM) { -    if (abi_sp) { -      RegisterInfo abi_reg_info; -      if (abi_sp->GetRegisterInfoByName(reg_name, abi_reg_info)) { -        if (reg_info.kinds[eRegisterKindEHFrame] == LLDB_INVALID_REGNUM && -            abi_reg_info.kinds[eRegisterKindEHFrame] != LLDB_INVALID_REGNUM) { -          reg_info.kinds[eRegisterKindEHFrame] = -              abi_reg_info.kinds[eRegisterKindEHFrame]; -        } -        if (reg_info.kinds[eRegisterKindDWARF] == LLDB_INVALID_REGNUM && -            abi_reg_info.kinds[eRegisterKindDWARF] != LLDB_INVALID_REGNUM) { -          reg_info.kinds[eRegisterKindDWARF] = -              abi_reg_info.kinds[eRegisterKindDWARF]; -        } -        if (reg_info.kinds[eRegisterKindGeneric] == LLDB_INVALID_REGNUM && -            abi_reg_info.kinds[eRegisterKindGeneric] != LLDB_INVALID_REGNUM) { -          reg_info.kinds[eRegisterKindGeneric] = -              abi_reg_info.kinds[eRegisterKindGeneric]; -        } -      } -    } -  } -} -  static size_t SplitCommaSeparatedRegisterNumberString(      const llvm::StringRef &comma_separated_regiter_numbers,      std::vector<uint32_t> ®nums, int base) { @@ -609,12 +584,12 @@ void ProcessGDBRemote::BuildDynamicRegisterInfo(bool force) {            reg_info.invalidate_regs = invalidate_regs.data();          } +        reg_info.name = reg_name.AsCString();          // We have to make a temporary ABI here, and not use the GetABI because          // this code gets called in DidAttach, when the target architecture          // (and consequently the ABI we'll get from the process) may be wrong. -        ABISP abi_to_use = ABI::FindPlugin(shared_from_this(), arch_to_use); - -        AugmentRegisterInfoViaABI(reg_info, reg_name, abi_to_use); +        if (ABISP abi_sp = ABI::FindPlugin(shared_from_this(), arch_to_use)) +          abi_sp->AugmentRegisterInfo(reg_info);          m_register_info.AddRegister(reg_info, reg_name, alt_name, set_name);        } else { @@ -2376,21 +2351,22 @@ void ProcessGDBRemote::RefreshStateAfterStop() {    m_thread_ids.clear();    m_thread_pcs.clear(); +    // Set the thread stop info. It might have a "threads" key whose value is a    // list of all thread IDs in the current process, so m_thread_ids might get    // set. +  // Check to see if SetThreadStopInfo() filled in m_thread_ids? +  if (m_thread_ids.empty()) { +      // No, we need to fetch the thread list manually +      UpdateThreadIDList(); +  } + +  // We might set some stop info's so make sure the thread list is up to +  // date before we do that or we might overwrite what was computed here. +  UpdateThreadListIfNeeded();    // Scope for the lock    { -    // Check to see if SetThreadStopInfo() filled in m_thread_ids? -    if (m_thread_ids.empty()) { -        // No, we need to fetch the thread list manually -        UpdateThreadIDList(); -    } -    // We might set some stop info's so make sure the thread list is up to -    // date before we do that or we might overwrite what was computed here. -    UpdateThreadListIfNeeded(); -      // Lock the thread stack while we access it      std::lock_guard<std::recursive_mutex> guard(m_last_stop_packet_mutex);      // Get the number of stop packets on the stack @@ -3388,17 +3364,20 @@ Status ProcessGDBRemote::ConnectToReplayServer(repro::Loader *loader) {    if (!loader)      return Status("No loader provided."); -  // Construct replay history path. -  FileSpec history_file = -      loader->GetFile<repro::ProcessGDBRemoteProvider::Info>(); -  if (!history_file) -    return Status("No provider for gdb-remote."); +  static std::unique_ptr<repro::MultiLoader<repro::GDBRemoteProvider>> +      multi_loader = repro::MultiLoader<repro::GDBRemoteProvider>::Create( +          repro::Reproducer::Instance().GetLoader()); -  // Enable replay mode. -  m_replay_mode = true; +  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(history_file)) +  if (auto error = +          m_gdb_replay_server.LoadReplayHistory(FileSpec(*history_file)))      return Status("Unable to load replay history");    // Make a local connection. @@ -3406,6 +3385,9 @@ Status ProcessGDBRemote::ConnectToReplayServer(repro::Loader *loader) {                                                            m_gdb_replay_server))      return Status("Unable to connect to replay server"); +  // Enable replay mode. +  m_replay_mode = true; +    // Start server thread.    m_gdb_replay_server.StartAsyncThread(); @@ -3631,9 +3613,9 @@ bool ProcessGDBRemote::StartAsyncThread() {      llvm::Expected<HostThread> async_thread = ThreadLauncher::LaunchThread(          "<lldb.process.gdb-remote.async>", ProcessGDBRemote::AsyncThread, this);      if (!async_thread) { -      LLDB_LOG(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST), -               "failed to launch host thread: {}", -               llvm::toString(async_thread.takeError())); +      LLDB_LOG_ERROR(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST), +                     async_thread.takeError(), +                     "failed to launch host thread: {}");        return false;      }      m_async_thread = *async_thread; @@ -4479,7 +4461,9 @@ bool ParseRegisters(XMLNode feature_node, GdbServerTargetInfo &target_info,          }          ++cur_reg_num; -        AugmentRegisterInfoViaABI(reg_info, reg_name, abi_sp); +        reg_info.name = reg_name.AsCString(); +        if (abi_sp) +          abi_sp->AugmentRegisterInfo(reg_info);          dyn_reg_info.AddRegister(reg_info, reg_name, alt_name, set_name);          return true; // Keep iterating through all "reg" elements | 
