diff options
author | Zachary Turner <zturner@google.com> | 2016-08-29 19:58:14 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-08-29 19:58:14 +0000 |
commit | 54695a339f5d4f336865a564ab539ff1b5743223 (patch) | |
tree | 8613fa198a50f1f645644ecf602ec33a2159c606 /lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp | |
parent | 8b4a30584a8e34893d3ded7923479bfc89b45f40 (diff) | |
download | bcm5719-llvm-54695a339f5d4f336865a564ab539ff1b5743223.tar.gz bcm5719-llvm-54695a339f5d4f336865a564ab539ff1b5743223.zip |
Convert GetNameColonValue to return StringRefs.
StringExtractor::GetNameColonValue() looks for a substring of the
form "<name>:<value>" and returns <name> and <value> to the caller.
This results in two unnecessary string copies, since the name and
value are not translated in any way and simply returned as-is.
By converting this to return StringRefs we can get rid of hundreds
of string copies.
llvm-svn: 280000
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp | 383 |
1 files changed, 176 insertions, 207 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp index 5f766a7fc38..ebeba059f36 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -41,6 +41,8 @@ #include "ProcessGDBRemoteLog.h" #include "lldb/Host/Config.h" +#include "llvm/ADT/StringSwitch.h" + #if defined (HAVE_LIBCOMPRESSION) #include <compression.h> #endif @@ -1144,27 +1146,21 @@ GDBRemoteCommunicationClient::GetGDBServerVersion() { if (response.IsNormalResponse()) { - std::string name; - std::string value; + llvm::StringRef name, value; bool success = false; while (response.GetNameColonValue(name, value)) { - if (name.compare("name") == 0) + if (name.equals("name")) { success = true; - m_gdb_server_name.swap(value); + m_gdb_server_name = value; } - else if (name.compare("version") == 0) + else if (name.equals("version")) { - size_t dot_pos = value.find('.'); - if (dot_pos != std::string::npos) - value[dot_pos] = '\0'; - const uint32_t version = StringConvert::ToUInt32(value.c_str(), UINT32_MAX, 0); - if (version != UINT32_MAX) - { + llvm::StringRef major, minor; + std::tie(major, minor) = value.split('.'); + if (!major.getAsInteger(0, m_gdb_server_version)) success = true; - m_gdb_server_version = version; - } } } if (success) @@ -1322,8 +1318,8 @@ GDBRemoteCommunicationClient::GetHostInfo (bool force) { if (response.IsNormalResponse()) { - std::string name; - std::string value; + llvm::StringRef name; + llvm::StringRef value; uint32_t cpu = LLDB_INVALID_CPUTYPE; uint32_t sub = 0; std::string arch_name; @@ -1332,117 +1328,103 @@ GDBRemoteCommunicationClient::GetHostInfo (bool force) std::string triple; std::string distribution_id; uint32_t pointer_byte_size = 0; - StringExtractor extractor; ByteOrder byte_order = eByteOrderInvalid; uint32_t num_keys_decoded = 0; while (response.GetNameColonValue(name, value)) { - if (name.compare("cputype") == 0) + if (name.equals("cputype")) { // exception type in big endian hex - cpu = StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 0); - if (cpu != LLDB_INVALID_CPUTYPE) + if (!value.getAsInteger(0, cpu)) ++num_keys_decoded; } - else if (name.compare("cpusubtype") == 0) + else if (name.equals("cpusubtype")) { // exception count in big endian hex - sub = StringConvert::ToUInt32 (value.c_str(), 0, 0); - if (sub != 0) + if (!value.getAsInteger(0, sub)) ++num_keys_decoded; } - else if (name.compare("arch") == 0) + else if (name.equals("arch")) { - arch_name.swap (value); + arch_name = value; ++num_keys_decoded; } - else if (name.compare("triple") == 0) + else if (name.equals("triple")) { - extractor.GetStringRef ().swap (value); - extractor.SetFilePos(0); + StringExtractor extractor(value); extractor.GetHexByteString (triple); ++num_keys_decoded; } - else if (name.compare ("distribution_id") == 0) + else if (name.equals("distribution_id")) { - extractor.GetStringRef ().swap (value); - extractor.SetFilePos (0); + StringExtractor extractor(value); extractor.GetHexByteString (distribution_id); ++num_keys_decoded; } - else if (name.compare("os_build") == 0) + else if (name.equals("os_build")) { - extractor.GetStringRef().swap(value); - extractor.SetFilePos(0); + StringExtractor extractor(value); extractor.GetHexByteString (m_os_build); ++num_keys_decoded; } - else if (name.compare("hostname") == 0) + else if (name.equals("hostname")) { - extractor.GetStringRef().swap(value); - extractor.SetFilePos(0); + StringExtractor extractor(value); extractor.GetHexByteString (m_hostname); ++num_keys_decoded; } - else if (name.compare("os_kernel") == 0) + else if (name.equals("os_kernel")) { - extractor.GetStringRef().swap(value); - extractor.SetFilePos(0); + StringExtractor extractor(value); extractor.GetHexByteString (m_os_kernel); ++num_keys_decoded; } - else if (name.compare("ostype") == 0) + else if (name.equals("ostype")) { - os_name.swap (value); + os_name = value; ++num_keys_decoded; } - else if (name.compare("vendor") == 0) + else if (name.equals("vendor")) { - vendor_name.swap(value); + vendor_name = value; ++num_keys_decoded; } - else if (name.compare("endian") == 0) + else if (name.equals("endian")) { - ++num_keys_decoded; - if (value.compare("little") == 0) - byte_order = eByteOrderLittle; - else if (value.compare("big") == 0) - byte_order = eByteOrderBig; - else if (value.compare("pdp") == 0) - byte_order = eByteOrderPDP; - else - --num_keys_decoded; + byte_order = llvm::StringSwitch<lldb::ByteOrder>(value) + .Case("little", eByteOrderLittle) + .Case("big", eByteOrderBig) + .Case("pdp", eByteOrderPDP) + .Default(eByteOrderInvalid); + if (byte_order != eByteOrderInvalid) + ++num_keys_decoded; } - else if (name.compare("ptrsize") == 0) + else if (name.equals("ptrsize")) { - pointer_byte_size = StringConvert::ToUInt32 (value.c_str(), 0, 0); - if (pointer_byte_size != 0) + if (!value.getAsInteger(0, pointer_byte_size)) ++num_keys_decoded; } - else if ((name.compare("os_version") == 0) || - (name.compare("version") == 0)) // Older debugserver binaries used the "version" key instead of "os_version"... + else if (name.equals("os_version") || name.equals("version")) // Older debugserver binaries used the + // "version" key instead of + // "os_version"... { - Args::StringToVersion (value.c_str(), - m_os_version_major, - m_os_version_minor, - m_os_version_update); + Args::StringToVersion(value.str().c_str(), m_os_version_major, m_os_version_minor, + m_os_version_update); if (m_os_version_major != UINT32_MAX) ++num_keys_decoded; } - else if (name.compare("watchpoint_exceptions_received") == 0) + else if (name.equals("watchpoint_exceptions_received")) { - ++num_keys_decoded; - if (strcmp(value.c_str(),"before") == 0) - m_watchpoints_trigger_after_instruction = eLazyBoolNo; - else if (strcmp(value.c_str(),"after") == 0) - m_watchpoints_trigger_after_instruction = eLazyBoolYes; - else - --num_keys_decoded; + m_watchpoints_trigger_after_instruction = llvm::StringSwitch<LazyBool>(value) + .Case("before", eLazyBoolNo) + .Case("after", eLazyBoolYes) + .Default(eLazyBoolCalculate); + if (m_watchpoints_trigger_after_instruction != eLazyBoolCalculate) + ++num_keys_decoded; } - else if (name.compare("default_packet_timeout") == 0) + else if (name.equals("default_packet_timeout")) { - m_default_packet_timeout = StringConvert::ToUInt32(value.c_str(), 0); - if (m_default_packet_timeout > 0) + if (!value.getAsInteger(0, m_default_packet_timeout)) { SetPacketTimeout(m_default_packet_timeout); ++num_keys_decoded; @@ -1715,41 +1697,39 @@ GDBRemoteCommunicationClient::GetMemoryRegionInfo (lldb::addr_t addr, StringExtractorGDBRemote response; if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) { - std::string name; - std::string value; - addr_t addr_value; + llvm::StringRef name; + llvm::StringRef value; + addr_t addr_value = LLDB_INVALID_ADDRESS; bool success = true; bool saw_permissions = false; while (success && response.GetNameColonValue(name, value)) { - if (name.compare ("start") == 0) + if (name.equals("start")) { - addr_value = StringConvert::ToUInt64(value.c_str(), LLDB_INVALID_ADDRESS, 16, &success); - if (success) + if (!value.getAsInteger(16, addr_value)) region_info.GetRange().SetRangeBase(addr_value); } - else if (name.compare ("size") == 0) + else if (name.equals("size")) { - addr_value = StringConvert::ToUInt64(value.c_str(), 0, 16, &success); - if (success) - region_info.GetRange().SetByteSize (addr_value); + if (!value.getAsInteger(16, addr_value)) + region_info.GetRange().SetByteSize(addr_value); } - else if (name.compare ("permissions") == 0 && region_info.GetRange().IsValid()) + else if (name.equals("permissions") && region_info.GetRange().IsValid()) { saw_permissions = true; if (region_info.GetRange().Contains (addr)) { - if (value.find('r') != std::string::npos) + if (value.find('r') != llvm::StringRef::npos) region_info.SetReadable (MemoryRegionInfo::eYes); else region_info.SetReadable (MemoryRegionInfo::eNo); - if (value.find('w') != std::string::npos) + if (value.find('w') != llvm::StringRef::npos) region_info.SetWritable (MemoryRegionInfo::eYes); else region_info.SetWritable (MemoryRegionInfo::eNo); - if (value.find('x') != std::string::npos) + if (value.find('x') != llvm::StringRef::npos) region_info.SetExecutable (MemoryRegionInfo::eYes); else region_info.SetExecutable (MemoryRegionInfo::eNo); @@ -1765,21 +1745,20 @@ GDBRemoteCommunicationClient::GetMemoryRegionInfo (lldb::addr_t addr, region_info.SetMapped(MemoryRegionInfo::eNo); } } - else if (name.compare ("name") == 0) + else if (name.equals("name")) { - StringExtractorGDBRemote name_extractor; - name_extractor.GetStringRef().swap(value); - name_extractor.GetHexByteString(value); - region_info.SetName(value.c_str()); + StringExtractorGDBRemote name_extractor(value); + std::string name; + name_extractor.GetHexByteString(name); + region_info.SetName(name.c_str()); } - else if (name.compare ("error") == 0) + else if (name.equals("error")) { - StringExtractorGDBRemote name_extractor; - // Swap "value" over into "name_extractor" - name_extractor.GetStringRef().swap(value); + StringExtractorGDBRemote error_extractor(value); + std::string error_string; // Now convert the HEX bytes into a string value - name_extractor.GetHexByteString (value); - error.SetErrorString(value.c_str()); + error_extractor.GetHexByteString(error_string); + error.SetErrorString(error_string.c_str()); } } @@ -1829,16 +1808,13 @@ GDBRemoteCommunicationClient::GetWatchpointSupportInfo (uint32_t &num) StringExtractorGDBRemote response; if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) { - m_supports_watchpoint_support_info = eLazyBoolYes; - std::string name; - std::string value; + m_supports_watchpoint_support_info = eLazyBoolYes; + llvm::StringRef name; + llvm::StringRef value; while (response.GetNameColonValue(name, value)) { - if (name.compare ("num") == 0) - { - num = StringConvert::ToUInt32(value.c_str(), 0, 0); - m_num_supported_hardware_watchpoints = num; - } + if (name.equals("num")) + value.getAsInteger(0, m_num_supported_hardware_watchpoints); } } else @@ -2050,72 +2026,82 @@ GDBRemoteCommunicationClient::DecodeProcessInfoResponse (StringExtractorGDBRemot { if (response.IsNormalResponse()) { - std::string name; - std::string value; + llvm::StringRef name; + llvm::StringRef value; StringExtractor extractor; uint32_t cpu = LLDB_INVALID_CPUTYPE; uint32_t sub = 0; std::string vendor; std::string os_type; - + while (response.GetNameColonValue(name, value)) { - if (name.compare("pid") == 0) + if (name.equals("pid")) { - process_info.SetProcessID (StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_PROCESS_ID, 0)); + lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; + value.getAsInteger(0, pid); + process_info.SetProcessID(pid); } - else if (name.compare("ppid") == 0) + else if (name.equals("ppid")) { - process_info.SetParentProcessID (StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_PROCESS_ID, 0)); + lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; + value.getAsInteger(0, pid); + process_info.SetParentProcessID(pid); } - else if (name.compare("uid") == 0) + else if (name.equals("uid")) { - process_info.SetUserID (StringConvert::ToUInt32 (value.c_str(), UINT32_MAX, 0)); + uint32_t uid = UINT32_MAX; + value.getAsInteger(0, uid); + process_info.SetUserID(uid); } - else if (name.compare("euid") == 0) + else if (name.equals("euid")) { - process_info.SetEffectiveUserID (StringConvert::ToUInt32 (value.c_str(), UINT32_MAX, 0)); + uint32_t uid = UINT32_MAX; + value.getAsInteger(0, uid); + process_info.SetEffectiveGroupID(uid); } - else if (name.compare("gid") == 0) + else if (name.equals("gid")) { - process_info.SetGroupID (StringConvert::ToUInt32 (value.c_str(), UINT32_MAX, 0)); + uint32_t gid = UINT32_MAX; + value.getAsInteger(0, gid); + process_info.SetGroupID(gid); } - else if (name.compare("egid") == 0) + else if (name.equals("egid")) { - process_info.SetEffectiveGroupID (StringConvert::ToUInt32 (value.c_str(), UINT32_MAX, 0)); + uint32_t gid = UINT32_MAX; + value.getAsInteger(0, gid); + process_info.SetEffectiveGroupID(gid); } - else if (name.compare("triple") == 0) + else if (name.equals("triple")) { - StringExtractor extractor; - extractor.GetStringRef().swap(value); - extractor.SetFilePos(0); - extractor.GetHexByteString (value); - process_info.GetArchitecture ().SetTriple (value.c_str()); + StringExtractor extractor(value); + std::string triple; + extractor.GetHexByteString(triple); + process_info.GetArchitecture().SetTriple(triple.c_str()); } - else if (name.compare("name") == 0) + else if (name.equals("name")) { - StringExtractor extractor; + StringExtractor extractor(value); // The process name from ASCII hex bytes since we can't // control the characters in a process name - extractor.GetStringRef().swap(value); - extractor.SetFilePos(0); - extractor.GetHexByteString (value); - process_info.GetExecutableFile().SetFile (value.c_str(), false); + std::string name; + extractor.GetHexByteString(name); + process_info.GetExecutableFile().SetFile(name.c_str(), false); } - else if (name.compare("cputype") == 0) + else if (name.equals("cputype")) { - cpu = StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 16); + value.getAsInteger(0, cpu); } - else if (name.compare("cpusubtype") == 0) + else if (name.equals("cpusubtype")) { - sub = StringConvert::ToUInt32 (value.c_str(), 0, 16); + value.getAsInteger(0, sub); } - else if (name.compare("vendor") == 0) + else if (name.equals("vendor")) { vendor = value; } - else if (name.compare("ostype") == 0) + else if (name.equals("ostype")) { os_type = value; } @@ -2181,8 +2167,8 @@ GDBRemoteCommunicationClient::GetCurrentProcessInfo (bool allow_lazy) { if (response.IsNormalResponse()) { - std::string name; - std::string value; + llvm::StringRef name; + llvm::StringRef value; uint32_t cpu = LLDB_INVALID_CPUTYPE; uint32_t sub = 0; std::string arch_name; @@ -2196,58 +2182,50 @@ GDBRemoteCommunicationClient::GetCurrentProcessInfo (bool allow_lazy) lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; while (response.GetNameColonValue(name, value)) { - if (name.compare("cputype") == 0) + if (name.equals("cputype")) { - cpu = StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 16); - if (cpu != LLDB_INVALID_CPUTYPE) + if (!value.getAsInteger(16, cpu)) ++num_keys_decoded; } - else if (name.compare("cpusubtype") == 0) + else if (name.equals("cpusubtype")) { - sub = StringConvert::ToUInt32 (value.c_str(), 0, 16); - if (sub != 0) + if (!value.getAsInteger(16, sub)) ++num_keys_decoded; } - else if (name.compare("triple") == 0) + else if (name.equals("triple")) { - StringExtractor extractor; - extractor.GetStringRef().swap(value); - extractor.SetFilePos(0); + StringExtractor extractor(value); extractor.GetHexByteString (triple); ++num_keys_decoded; } - else if (name.compare("ostype") == 0) + else if (name.equals("ostype")) { - os_name.swap (value); + os_name = value; ++num_keys_decoded; } - else if (name.compare("vendor") == 0) + else if (name.equals("vendor")) { - vendor_name.swap(value); + vendor_name = value; ++num_keys_decoded; } - else if (name.compare("endian") == 0) + else if (name.equals("endian")) { - ++num_keys_decoded; - if (value.compare("little") == 0) - byte_order = eByteOrderLittle; - else if (value.compare("big") == 0) - byte_order = eByteOrderBig; - else if (value.compare("pdp") == 0) - byte_order = eByteOrderPDP; - else - --num_keys_decoded; + byte_order = llvm::StringSwitch<lldb::ByteOrder>(value) + .Case("little", eByteOrderLittle) + .Case("big", eByteOrderBig) + .Case("pdp", eByteOrderPDP) + .Default(eByteOrderInvalid); + if (byte_order != eByteOrderInvalid) + ++num_keys_decoded; } - else if (name.compare("ptrsize") == 0) + else if (name.equals("ptrsize")) { - pointer_byte_size = StringConvert::ToUInt32 (value.c_str(), 0, 16); - if (pointer_byte_size != 0) + if (!value.getAsInteger(16, pointer_byte_size)) ++num_keys_decoded; } - else if (name.compare("pid") == 0) + else if (name.equals("pid")) { - pid = StringConvert::ToUInt64(value.c_str(), 0, 16); - if (pid != LLDB_INVALID_PROCESS_ID) + if (!value.getAsInteger(16, pid)) ++num_keys_decoded; } } @@ -2709,30 +2687,23 @@ GDBRemoteCommunicationClient::LaunchGDBServer (const char *remote_accept_hostnam stream.Printf("host:*;"); } } - const char *packet = stream.GetData(); - int packet_len = stream.GetSize(); - // give the process a few seconds to startup GDBRemoteCommunication::ScopedTimeout timeout (*this, 10); - if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) + if (SendPacketAndWaitForResponse(stream.GetString(), response, false) == PacketResult::Success) { - std::string name; - std::string value; - StringExtractor extractor; + llvm::StringRef name; + llvm::StringRef value; while (response.GetNameColonValue(name, value)) { - if (name.compare("port") == 0) - port = StringConvert::ToUInt32(value.c_str(), 0, 0); - else if (name.compare("pid") == 0) - pid = StringConvert::ToUInt64(value.c_str(), LLDB_INVALID_PROCESS_ID, 0); + if (name.equals("port")) + value.getAsInteger(0, port); + else if (name.equals("pid")) + value.getAsInteger(0, pid); else if (name.compare("socket_name") == 0) { - extractor.GetStringRef().swap(value); - extractor.SetFilePos(0); - extractor.GetHexByteString(value); - - socket_name = value; + StringExtractor extractor(value); + extractor.GetHexByteString(socket_name); } } return true; @@ -3667,10 +3638,8 @@ GDBRemoteCommunicationClient::GetModuleInfo(const FileSpec &module_file_spec, co return false; } - std::string name; - std::string value; - bool success; - StringExtractor extractor; + llvm::StringRef name; + llvm::StringRef value; module_spec.Clear (); module_spec.GetFileSpec () = module_file_spec; @@ -3679,36 +3648,36 @@ GDBRemoteCommunicationClient::GetModuleInfo(const FileSpec &module_file_spec, co { if (name == "uuid" || name == "md5") { - extractor.GetStringRef ().swap (value); - extractor.SetFilePos (0); - extractor.GetHexByteString (value); - module_spec.GetUUID().SetFromCString (value.c_str(), value.size() / 2); + StringExtractor extractor(value); + std::string uuid; + extractor.GetHexByteString(uuid); + module_spec.GetUUID().SetFromCString(uuid.c_str(), uuid.size() / 2); } else if (name == "triple") { - extractor.GetStringRef ().swap (value); - extractor.SetFilePos (0); - extractor.GetHexByteString (value); - module_spec.GetArchitecture().SetTriple (value.c_str ()); + StringExtractor extractor(value); + std::string triple; + extractor.GetHexByteString(triple); + module_spec.GetArchitecture().SetTriple(triple.c_str()); } else if (name == "file_offset") { - const auto ival = StringConvert::ToUInt64 (value.c_str (), 0, 16, &success); - if (success) + uint64_t ival = 0; + if (!value.getAsInteger(16, ival)) module_spec.SetObjectOffset (ival); } else if (name == "file_size") { - const auto ival = StringConvert::ToUInt64 (value.c_str (), 0, 16, &success); - if (success) + uint64_t ival = 0; + if (!value.getAsInteger(16, ival)) module_spec.SetObjectSize (ival); } else if (name == "file_path") { - extractor.GetStringRef ().swap (value); - extractor.SetFilePos (0); - extractor.GetHexByteString (value); - module_spec.GetFileSpec() = FileSpec(value.c_str(), false, arch_spec); + StringExtractor extractor(value); + std::string path; + extractor.GetHexByteString(path); + module_spec.GetFileSpec() = FileSpec(path.c_str(), false, arch_spec); } } |