diff options
Diffstat (limited to 'lldb/source/Utility/Scalar.cpp')
-rw-r--r-- | lldb/source/Utility/Scalar.cpp | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/lldb/source/Utility/Scalar.cpp b/lldb/source/Utility/Scalar.cpp index f07a9f3..7fbe46d 100644 --- a/lldb/source/Utility/Scalar.cpp +++ b/lldb/source/Utility/Scalar.cpp @@ -82,7 +82,7 @@ Scalar::Type Scalar::PromoteToMaxType(Scalar &lhs, Scalar &rhs) { return Scalar::e_void; } -bool Scalar::GetData(DataExtractor &data, size_t limit_byte_size) const { +bool Scalar::GetData(DataExtractor &data) const { size_t byte_size = GetByteSize(); if (byte_size == 0) { data.Clear(); @@ -90,27 +90,57 @@ bool Scalar::GetData(DataExtractor &data, size_t limit_byte_size) const { } auto buffer_up = std::make_unique<DataBufferHeap>(byte_size, 0); GetBytes(buffer_up->GetData()); - lldb::offset_t offset = 0; - - if (limit_byte_size < byte_size) { - if (endian::InlHostByteOrder() == eByteOrderLittle) { - // On little endian systems if we want fewer bytes from the current - // type we just specify fewer bytes since the LSByte is first... - byte_size = limit_byte_size; - } else if (endian::InlHostByteOrder() == eByteOrderBig) { - // On big endian systems if we want fewer bytes from the current type - // have to advance our initial byte pointer and trim down the number of - // bytes since the MSByte is first - offset = byte_size - limit_byte_size; - byte_size = limit_byte_size; + data.SetData(std::move(buffer_up), 0, byte_size); + data.SetByteOrder(endian::InlHostByteOrder()); + return true; +} + +bool Scalar::GetData(DataExtractor &data, size_t result_byte_size) const { + size_t byte_size = GetByteSize(); + if (byte_size == 0 || result_byte_size == 0) { + data.Clear(); + return false; + } + + if (endian::InlHostByteOrder() == lldb::eByteOrderBig) { + // On big endian systems if we want fewer bytes from the current type + // we have to advance our initial byte pointer since the MSByte is + // first. + if (result_byte_size <= byte_size) { + auto buffer_up = std::make_unique<DataBufferHeap>(byte_size, 0); + GetBytes(buffer_up->GetData()); + auto offset = byte_size - result_byte_size; + data.SetData(std::move(buffer_up), offset, result_byte_size); + data.SetByteOrder(endian::InlHostByteOrder()); + } else { + // Extend created buffer size and insert the data bytes with an offset + auto buffer_up = std::make_unique<DataBufferHeap>(result_byte_size, 0); + auto offset = result_byte_size - byte_size; + GetBytes(buffer_up->GetBytes() + offset, byte_size); + data.SetData(std::move(buffer_up), 0, result_byte_size); + data.SetByteOrder(endian::InlHostByteOrder()); } + return true; } - data.SetData(std::move(buffer_up), offset, byte_size); + // On little endian systems MSBytes get trimmed or extended automatically by + // size. + if (byte_size < result_byte_size) + byte_size = result_byte_size; + auto buffer_up = std::make_unique<DataBufferHeap>(byte_size, 0); + GetBytes(buffer_up->GetData()); + data.SetData(std::move(buffer_up), 0, result_byte_size); data.SetByteOrder(endian::InlHostByteOrder()); + return true; } +void Scalar::GetBytes(uint8_t *storage, size_t size) const { + assert(size >= GetByteSize()); + llvm::MutableArrayRef<uint8_t> storage_ref(storage, size); + GetBytes(storage_ref); +} + void Scalar::GetBytes(llvm::MutableArrayRef<uint8_t> storage) const { assert(storage.size() >= GetByteSize()); |