return error;
}
- std::string xml;
- lldb_private::Status lldberr;
- if (!ReadExtFeature(ConstString("memory-map"), ConstString(""), xml,
- lldberr)) {
- error.SetErrorString("Failed to read memory map");
- return error;
- }
+ llvm::Expected<std::string> xml = ReadExtFeature("memory-map", "");
+ if (!xml)
+ return Status(xml.takeError());
XMLDocument xml_document;
- if (!xml_document.ParseMemory(xml.c_str(), xml.size())) {
+ if (!xml_document.ParseMemory(xml->c_str(), xml->size())) {
error.SetErrorString("Failed to parse memory map xml");
return error;
}
// query the target remote for extended information using the qXfer packet
//
-// example: object='features', annex='target.xml', out=<xml output> return:
-// 'true' on success
-// 'false' on failure (err set)
-bool GDBRemoteCommunicationClient::ReadExtFeature(
- const lldb_private::ConstString object,
- const lldb_private::ConstString annex, std::string &out,
- lldb_private::Status &err) {
-
- std::stringstream output;
+// example: object='features', annex='target.xml'
+// return: <xml output> or error
+llvm::Expected<std::string>
+GDBRemoteCommunicationClient::ReadExtFeature(llvm::StringRef object,
+ llvm::StringRef annex) {
+
+ std::string output;
+ llvm::raw_string_ostream output_stream(output);
StringExtractorGDBRemote chunk;
uint64_t size = GetRemoteMaxPacketSize();
while (active) {
// send query extended feature packet
- std::stringstream packet;
- packet << "qXfer:" << object.AsCString("")
- << ":read:" << annex.AsCString("") << ":" << std::hex << offset
- << "," << std::hex << size;
+ std::string packet =
+ ("qXfer:" + object + ":read:" + annex + ":" +
+ llvm::Twine::utohexstr(offset) + "," + llvm::Twine::utohexstr(size))
+ .str();
GDBRemoteCommunication::PacketResult res =
- SendPacketAndWaitForResponse(packet.str(), chunk);
+ SendPacketAndWaitForResponse(packet, chunk);
- if (res != GDBRemoteCommunication::PacketResult::Success) {
- err.SetErrorString("Error sending $qXfer packet");
- return false;
- }
-
- const std::string &str = std::string(chunk.GetStringRef());
- if (str.length() == 0) {
- // should have some data in chunk
- err.SetErrorString("Empty response from $qXfer packet");
- return false;
+ if (res != GDBRemoteCommunication::PacketResult::Success ||
+ chunk.GetStringRef().empty()) {
+ return llvm::createStringError(llvm::inconvertibleErrorCode(),
+ "Error sending $qXfer packet");
}
// check packet code
- switch (str[0]) {
+ switch (chunk.GetStringRef()[0]) {
// last chunk
case ('l'):
active = false;
// more chunks
case ('m'):
- output << str.substr(1);
- offset += str.length() - 1;
+ output_stream << chunk.GetStringRef().drop_front();
+ offset += chunk.GetStringRef().size() - 1;
break;
// unknown chunk
default:
- err.SetErrorString("Invalid continuation code from $qXfer packet");
- return false;
+ return llvm::createStringError(
+ llvm::inconvertibleErrorCode(),
+ "Invalid continuation code from $qXfer packet");
}
}
- out = output.str();
- err.Success();
- return true;
+ return output_stream.str();
}
// Notify the target that gdb is prepared to serve symbol lookup requests.
DataExtractor ProcessGDBRemote::GetAuxvData() {
DataBufferSP buf;
if (m_gdb_comm.GetQXferAuxvReadSupported()) {
- std::string response_string;
- Status ST;
- if (m_gdb_comm.ReadExtFeature(ConstString("auxv"), ConstString(""),
- response_string, ST))
- buf = std::make_shared<DataBufferHeap>(response_string.c_str(),
- response_string.length());
+ llvm::Expected<std::string> response = m_gdb_comm.ReadExtFeature("auxv", "");
+ if (response)
+ buf = std::make_shared<DataBufferHeap>(response->c_str(),
+ response->length());
+ else
+ LLDB_LOG_ERROR(
+ ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(GDBR_LOG_PROCESS),
+ response.takeError(), "{0}");
}
return DataExtractor(buf, GetByteOrder(), GetAddressByteSize());
}
bool ProcessGDBRemote::GetGDBServerRegisterInfoXMLAndProcess(
ArchSpec &arch_to_use, std::string xml_filename, std::vector<RemoteRegisterInfo> ®isters) {
// request the target xml file
- std::string raw;
- lldb_private::Status lldberr;
- if (!m_gdb_comm.ReadExtFeature(ConstString("features"),
- ConstString(xml_filename.c_str()), raw,
- lldberr)) {
+ llvm::Expected<std::string> raw = m_gdb_comm.ReadExtFeature("features", xml_filename);
+ if (errorToBool(raw.takeError()))
return false;
- }
XMLDocument xml_document;
- if (xml_document.ParseMemory(raw.c_str(), raw.size(), xml_filename.c_str())) {
+ if (xml_document.ParseMemory(raw->c_str(), raw->size(),
+ xml_filename.c_str())) {
GdbServerTargetInfo target_info;
std::vector<XMLNode> feature_nodes;
// check that we have extended feature read support
if (can_use_svr4 && comm.GetQXferLibrariesSVR4ReadSupported()) {
// request the loaded library list
- std::string raw;
- lldb_private::Status lldberr;
-
- if (!comm.ReadExtFeature(ConstString("libraries-svr4"), ConstString(""),
- raw, lldberr))
- return llvm::createStringError(llvm::inconvertibleErrorCode(),
- "Error in libraries-svr4 packet");
+ llvm::Expected<std::string> raw = comm.ReadExtFeature("libraries-svr4", "");
+ if (!raw)
+ return raw.takeError();
// parse the xml file in memory
- LLDB_LOGF(log, "parsing: %s", raw.c_str());
+ LLDB_LOGF(log, "parsing: %s", raw->c_str());
XMLDocument doc;
- if (!doc.ParseMemory(raw.c_str(), raw.size(), "noname.xml"))
+ if (!doc.ParseMemory(raw->c_str(), raw->size(), "noname.xml"))
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"Error reading noname.xml");
return list;
} else if (comm.GetQXferLibrariesReadSupported()) {
// request the loaded library list
- std::string raw;
- lldb_private::Status lldberr;
+ llvm::Expected<std::string> raw = comm.ReadExtFeature("libraries", "");
- if (!comm.ReadExtFeature(ConstString("libraries"), ConstString(""), raw,
- lldberr))
- return llvm::createStringError(llvm::inconvertibleErrorCode(),
- "Error in libraries packet");
+ if (!raw)
+ return raw.takeError();
- LLDB_LOGF(log, "parsing: %s", raw.c_str());
+ LLDB_LOGF(log, "parsing: %s", raw->c_str());
XMLDocument doc;
- if (!doc.ParseMemory(raw.c_str(), raw.size(), "noname.xml"))
+ if (!doc.ParseMemory(raw->c_str(), raw->size(), "noname.xml"))
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"Error reading noname.xml");