diff --git a/lldb/include/lldb/Core/DataBuffer.h b/lldb/include/lldb/Core/DataBuffer.h index da4934457233..008e3b2aada7 100644 --- a/lldb/include/lldb/Core/DataBuffer.h +++ b/lldb/include/lldb/Core/DataBuffer.h @@ -16,6 +16,8 @@ #include "lldb/lldb-types.h" +#include "llvm/ADT/ArrayRef.h" + namespace lldb_private { //---------------------------------------------------------------------- @@ -88,6 +90,16 @@ public: //------------------------------------------------------------------ virtual lldb::offset_t GetByteSize() const = 0; + + llvm::ArrayRef GetData() const + { + return llvm::ArrayRef(GetBytes(), GetByteSize()); + } + + llvm::MutableArrayRef GetData() + { + return llvm::MutableArrayRef(GetBytes(), GetByteSize()); + } }; } // namespace lldb_private diff --git a/lldb/include/lldb/Utility/StringExtractor.h b/lldb/include/lldb/Utility/StringExtractor.h index 2df42ccc8686..afdae1d91757 100644 --- a/lldb/include/lldb/Utility/StringExtractor.h +++ b/lldb/include/lldb/Utility/StringExtractor.h @@ -17,6 +17,7 @@ // Other libraries and framework includes // Project includes +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" class StringExtractor @@ -141,10 +142,10 @@ public: GetHexMaxU64 (bool little_endian, uint64_t fail_value); size_t - GetHexBytes (void *dst, size_t dst_len, uint8_t fail_fill_value); + GetHexBytes (llvm::MutableArrayRef dest, uint8_t fail_fill_value); size_t - GetHexBytesAvail (void *dst, size_t dst_len); + GetHexBytesAvail (llvm::MutableArrayRef dest); uint64_t GetHexWithFixedSize (uint32_t byte_size, bool little_endian, uint64_t fail_value); diff --git a/lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp b/lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp index 6efdb468111b..86c62f72db5d 100644 --- a/lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp +++ b/lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp @@ -306,8 +306,7 @@ DynamicRegisterInfo::SetRegisterInfo(const StructuredData::Dictionary &dict, con StringExtractor opcode_extractor; // Swap "dwarf_opcode_string" over into "opcode_extractor" opcode_extractor.GetStringRef ().swap (dwarf_opcode_string); - uint32_t ret_val = opcode_extractor.GetHexBytesAvail (dwarf_opcode_bytes.data (), - reg_info.dynamic_size_dwarf_len); + uint32_t ret_val = opcode_extractor.GetHexBytesAvail (dwarf_opcode_bytes); assert (ret_val == reg_info.dynamic_size_dwarf_len); for (j = 0; j < reg_info.dynamic_size_dwarf_len; ++j) diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp index d08b939aa950..555ae461b1c1 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -3480,7 +3480,7 @@ GDBRemoteCommunicationClient::ReadRegister(lldb::tid_t tid, uint32_t reg) return nullptr; DataBufferSP buffer_sp(new DataBufferHeap(response.GetStringRef().size() / 2, 0)); - response.GetHexBytes(buffer_sp->GetBytes(), buffer_sp->GetByteSize(), '\xcc'); + response.GetHexBytes(buffer_sp->GetData(), '\xcc'); return buffer_sp; } @@ -3495,7 +3495,7 @@ GDBRemoteCommunicationClient::ReadAllRegisters(lldb::tid_t tid) return nullptr; DataBufferSP buffer_sp(new DataBufferHeap(response.GetStringRef().size() / 2, 0)); - response.GetHexBytes(buffer_sp->GetBytes(), buffer_sp->GetByteSize(), '\xcc'); + response.GetHexBytes(buffer_sp->GetData(), '\xcc'); return buffer_sp; } diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp index 4f632c964178..81c54edd388b 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp @@ -1794,7 +1794,7 @@ GDBRemoteCommunicationServerLLGS::Handle_P (StringExtractorGDBRemote &packet) // Parse out the value. uint8_t reg_bytes[32]; // big enough to support up to 256 bit ymmN register - size_t reg_size = packet.GetHexBytesAvail (reg_bytes, sizeof(reg_bytes)); + size_t reg_size = packet.GetHexBytesAvail (reg_bytes); // Get the thread to use. NativeThreadProtocolSP thread_sp = GetThreadFromSuffix (packet); @@ -1939,10 +1939,10 @@ GDBRemoteCommunicationServerLLGS::Handle_I (StringExtractorGDBRemote &packet) } packet.SetFilePos (::strlen("I")); - char tmp[4096]; + uint8_t tmp[4096]; for (;;) { - size_t read = packet.GetHexBytesAvail(tmp, sizeof(tmp)); + size_t read = packet.GetHexBytesAvail(tmp); if (read == 0) { break; @@ -2118,7 +2118,7 @@ GDBRemoteCommunicationServerLLGS::Handle_M (StringExtractorGDBRemote &packet) // Convert the hex memory write contents to bytes. StreamGDBRemote response; - const uint64_t convert_count = packet.GetHexBytes(&buf[0], byte_count, 0); + const uint64_t convert_count = packet.GetHexBytes(buf, 0); if (convert_count != byte_count) { if (log) diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 169d69e1b518..3f7b64c82216 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -649,8 +649,7 @@ ProcessGDBRemote::BuildDynamicRegisterInfo (bool force) reg_info.dynamic_size_dwarf_len = dwarf_opcode_len; StringExtractor opcode_extractor(value); - uint32_t ret_val = - opcode_extractor.GetHexBytesAvail(dwarf_opcode_bytes.data(), dwarf_opcode_len); + uint32_t ret_val = opcode_extractor.GetHexBytesAvail(dwarf_opcode_bytes); assert(dwarf_opcode_len == ret_val); reg_info.dynamic_size_dwarf_expr_bytes = dwarf_opcode_bytes.data(); @@ -1986,9 +1985,8 @@ ProcessGDBRemote::SetThreadStopInfo (lldb::tid_t tid, StringExtractor reg_value_extractor; reg_value_extractor.GetStringRef() = pair.second; DataBufferSP buffer_sp(new DataBufferHeap(reg_value_extractor.GetStringRef().size() / 2, 0)); - reg_value_extractor.GetHexBytes(buffer_sp->GetBytes(), buffer_sp->GetByteSize(), '\xcc'); - gdb_thread->PrivateSetRegisterValue( - pair.first, llvm::ArrayRef(buffer_sp->GetBytes(), buffer_sp->GetByteSize())); + reg_value_extractor.GetHexBytes(buffer_sp->GetData(), '\xcc'); + gdb_thread->PrivateSetRegisterValue(pair.first, buffer_sp->GetData()); } thread_sp->SetName (thread_name.empty() ? NULL : thread_name.c_str()); @@ -2366,7 +2364,7 @@ ProcessGDBRemote::SetThreadStopInfo (StructuredData::Dictionary *thread_dict) const size_t byte_size = bytes.GetStringRef().size()/2; DataBufferSP data_buffer_sp(new DataBufferHeap(byte_size, 0)); - const size_t bytes_copied = bytes.GetHexBytes (data_buffer_sp->GetBytes(), byte_size, 0); + const size_t bytes_copied = bytes.GetHexBytes (data_buffer_sp->GetData(), 0); if (bytes_copied == byte_size) m_memory_cache.AddL1CacheData(mem_cache_addr, data_buffer_sp); } @@ -2585,7 +2583,7 @@ ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet) StringExtractor bytes(bytes_str); const size_t byte_size = bytes.GetBytesLeft() / 2; DataBufferSP data_buffer_sp(new DataBufferHeap(byte_size, 0)); - const size_t bytes_copied = bytes.GetHexBytes (data_buffer_sp->GetBytes(), byte_size, 0); + const size_t bytes_copied = bytes.GetHexBytes (data_buffer_sp->GetData(), 0); if (bytes_copied == byte_size) m_memory_cache.AddL1CacheData(mem_cache_addr, data_buffer_sp); } @@ -3086,7 +3084,7 @@ ProcessGDBRemote::DoReadMemory (addr_t addr, void *buf, size_t size, Error &erro } else { - return response.GetHexBytes(buf, size, '\xdd'); + return response.GetHexBytes(llvm::MutableArrayRef((uint8_t*)buf, size), '\xdd'); } } else if (response.IsErrorResponse()) @@ -4587,8 +4585,7 @@ ParseRegisters (XMLNode feature_node, GdbServerTargetInfo &target_info, GDBRemot dwarf_opcode_bytes.resize (dwarf_opcode_len); reg_info.dynamic_size_dwarf_len = dwarf_opcode_len; opcode_extractor.GetStringRef ().swap (opcode_string); - uint32_t ret_val = opcode_extractor.GetHexBytesAvail (dwarf_opcode_bytes.data (), - dwarf_opcode_len); + uint32_t ret_val = opcode_extractor.GetHexBytesAvail (dwarf_opcode_bytes); assert (dwarf_opcode_len == ret_val); reg_info.dynamic_size_dwarf_expr_bytes = dwarf_opcode_bytes.data (); diff --git a/lldb/source/Utility/StringExtractor.cpp b/lldb/source/Utility/StringExtractor.cpp index 744e7d482cb5..f62c83637003 100644 --- a/lldb/source/Utility/StringExtractor.cpp +++ b/lldb/source/Utility/StringExtractor.cpp @@ -357,21 +357,20 @@ StringExtractor::GetHexMaxU64 (bool little_endian, uint64_t fail_value) } size_t -StringExtractor::GetHexBytes (void *dst_void, size_t dst_len, uint8_t fail_fill_value) +StringExtractor::GetHexBytes (llvm::MutableArrayRef dest, uint8_t fail_fill_value) { - uint8_t *dst = (uint8_t*)dst_void; size_t bytes_extracted = 0; - while (bytes_extracted < dst_len && GetBytesLeft ()) + while (!dest.empty() && GetBytesLeft() > 0) { - dst[bytes_extracted] = GetHexU8 (fail_fill_value); - if (IsGood()) - ++bytes_extracted; - else + dest[0] = GetHexU8 (fail_fill_value); + if (!IsGood()) break; + ++bytes_extracted; + dest = dest.drop_front(); } - for (size_t i = bytes_extracted; i < dst_len; ++i) - dst[i] = fail_fill_value; + if (!dest.empty()) + ::memset(dest.data(), fail_fill_value, dest.size()); return bytes_extracted; } @@ -383,18 +382,17 @@ StringExtractor::GetHexBytes (void *dst_void, size_t dst_len, uint8_t fail_fill_ // Returns the number of bytes successfully decoded //---------------------------------------------------------------------- size_t -StringExtractor::GetHexBytesAvail (void *dst_void, size_t dst_len) +StringExtractor::GetHexBytesAvail (llvm::MutableArrayRef dest) { - uint8_t *dst = (uint8_t*)dst_void; size_t bytes_extracted = 0; - while (bytes_extracted < dst_len) + while (!dest.empty()) { int decode = DecodeHexU8(); if (decode == -1) - { break; - } - dst[bytes_extracted++] = (uint8_t)decode; + dest[0] = (uint8_t)decode; + dest = dest.drop_front(); + ++bytes_extracted; } return bytes_extracted; } diff --git a/lldb/unittests/Utility/StringExtractorTest.cpp b/lldb/unittests/Utility/StringExtractorTest.cpp index 5bcf10eb59a2..79e6e78d75b8 100644 --- a/lldb/unittests/Utility/StringExtractorTest.cpp +++ b/lldb/unittests/Utility/StringExtractorTest.cpp @@ -243,7 +243,7 @@ TEST_F (StringExtractorTest, GetHexBytes) StringExtractor ex(kHexEncodedBytes); uint8_t dst[kValidHexPairs]; - ASSERT_EQ(kValidHexPairs, ex.GetHexBytes (dst, kValidHexPairs, 0xde)); + ASSERT_EQ(kValidHexPairs, ex.GetHexBytes (dst, 0xde)); EXPECT_EQ(0xab,dst[0]); EXPECT_EQ(0xcd,dst[1]); EXPECT_EQ(0xef,dst[2]); @@ -267,7 +267,7 @@ TEST_F (StringExtractorTest, GetHexBytes_Underflow) StringExtractor ex(kHexEncodedBytes); uint8_t dst[12]; - ASSERT_EQ(kValidHexPairs, ex.GetHexBytes (dst, sizeof(dst), 0xde)); + ASSERT_EQ(kValidHexPairs, ex.GetHexBytes (dst, 0xde)); EXPECT_EQ(0xab,dst[0]); EXPECT_EQ(0xcd,dst[1]); EXPECT_EQ(0xef,dst[2]); @@ -297,7 +297,7 @@ TEST_F (StringExtractorTest, GetHexBytes_Partial) uint8_t dst[12]; memset(dst, 0xab, sizeof(dst)); - ASSERT_EQ(kReadBytes, ex.GetHexBytes (dst, kReadBytes, 0xde)); + ASSERT_EQ(kReadBytes, ex.GetHexBytes (llvm::MutableArrayRef(dst, kReadBytes), 0xde)); EXPECT_EQ(0xab,dst[0]); EXPECT_EQ(0xcd,dst[1]); EXPECT_EQ(0xef,dst[2]); @@ -326,7 +326,7 @@ TEST_F (StringExtractorTest, GetHexBytesAvail) StringExtractor ex(kHexEncodedBytes); uint8_t dst[kValidHexPairs]; - ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail (dst, kValidHexPairs)); + ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail (dst)); EXPECT_EQ(0xab,dst[0]); EXPECT_EQ(0xcd,dst[1]); EXPECT_EQ(0xef,dst[2]); @@ -351,7 +351,7 @@ TEST_F (StringExtractorTest, GetHexBytesAvail_Underflow) uint8_t dst[12]; memset(dst, 0xef, sizeof(dst)); - ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail (dst, sizeof(dst))); + ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail (dst)); EXPECT_EQ(0xab,dst[0]); EXPECT_EQ(0xcd,dst[1]); EXPECT_EQ(0xef,dst[2]); @@ -381,7 +381,7 @@ TEST_F (StringExtractorTest, GetHexBytesAvail_Partial) uint8_t dst[12]; memset(dst, 0xab, sizeof(dst)); - ASSERT_EQ(kReadBytes, ex.GetHexBytesAvail (dst, kReadBytes)); + ASSERT_EQ(kReadBytes, ex.GetHexBytesAvail (llvm::MutableArrayRef(dst, kReadBytes))); EXPECT_EQ(0xab,dst[0]); EXPECT_EQ(0xcd,dst[1]); EXPECT_EQ(0xef,dst[2]);