Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 43 additions & 10 deletions lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -441,8 +441,16 @@ void ProcessGDBRemote::BuildDynamicRegisterInfo(bool force) {
if (!arch_to_use.IsValid())
arch_to_use = target_arch;

if (GetGDBServerRegisterInfo(arch_to_use))
llvm::Error register_info_err = GetGDBServerRegisterInfo(arch_to_use);
if (!register_info_err) {
// We got the registers from target XML.
return;
}

Log *log = GetLog(GDBRLog::Process);
LLDB_LOG_ERROR(log, std::move(register_info_err),
"Failed to read register information from target XML: {0}");
LLDB_LOG(log, "Now trying to use qRegisterInfo instead.");

char packet[128];
std::vector<DynamicRegisterInfo::Register> registers;
Expand Down Expand Up @@ -541,7 +549,23 @@ void ProcessGDBRemote::BuildDynamicRegisterInfo(bool force) {
assert(reg_info.byte_size != 0);
registers.push_back(reg_info);
} else {
break; // ensure exit before reg_num is incremented
// Only warn if we were offered Target XML and could not use it, and
// the qRegisterInfo fallback failed. This is something a user could
// take action on by getting an lldb with libxml2.
//
// It's possible we weren't offered Target XML and qRegisterInfo failed,
// but there's no much a user can do about that. It may be the intended
// way the debug stub works, so we do not warn for that case.
if (response_type == StringExtractorGDBRemote::eUnsupported &&
m_gdb_comm.GetQXferFeaturesReadSupported() &&
!XMLDocument::XMLEnabled()) {
Debugger::ReportWarning(
"the debug server supports Target Description XML but LLDB does "
"not have XML parsing enabled. Using \"qRegisterInfo\" was also "
"not possible. Register information may be incorrect or missing.",
GetTarget().GetDebugger().GetID());
}
break;
}
} else {
break;
Expand Down Expand Up @@ -5137,14 +5161,19 @@ void ProcessGDBRemote::AddRemoteRegisters(

// query the target of gdb-remote for extended target information returns
// true on success (got register definitions), false on failure (did not).
bool ProcessGDBRemote::GetGDBServerRegisterInfo(ArchSpec &arch_to_use) {
// Make sure LLDB has an XML parser it can use first
if (!XMLDocument::XMLEnabled())
return false;

// check that we have extended feature read support
llvm::Error ProcessGDBRemote::GetGDBServerRegisterInfo(ArchSpec &arch_to_use) {
// If the remote does not offer XML, does not matter if we would have been
// able to parse it.
if (!m_gdb_comm.GetQXferFeaturesReadSupported())
return false;
return llvm::createStringError(
llvm::inconvertibleErrorCode(),
"the debug server does not support \"qXfer:features:read\"");

if (!XMLDocument::XMLEnabled())
return llvm::createStringError(
llvm::inconvertibleErrorCode(),
"the debug server supports \"qXfer:features:read\", but LLDB does not "
"have XML parsing enabled (check LLLDB_ENABLE_LIBXML2)");

// These hold register type information for the whole of target.xml.
// target.xml may include further documents that
Expand All @@ -5161,7 +5190,11 @@ bool ProcessGDBRemote::GetGDBServerRegisterInfo(ArchSpec &arch_to_use) {
!registers.empty())
AddRemoteRegisters(registers, arch_to_use);

return m_register_info_sp->GetNumRegisters() > 0;
return m_register_info_sp->GetNumRegisters() > 0
? llvm::ErrorSuccess()
: llvm::createStringError(
llvm::inconvertibleErrorCode(),
"the debug server did not describe any registers");
}

llvm::Expected<LoadedModuleInfoList> ProcessGDBRemote::GetLoadedModuleList() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ class ProcessGDBRemote : public Process,
void AddRemoteRegisters(std::vector<DynamicRegisterInfo::Register> &registers,
const ArchSpec &arch_to_use);
// Query remote GDBServer for register information
bool GetGDBServerRegisterInfo(ArchSpec &arch);
llvm::Error GetGDBServerRegisterInfo(ArchSpec &arch);

lldb::ModuleSP LoadModuleAtAddress(const FileSpec &file,
lldb::addr_t link_map,
Expand Down
Loading