aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Utility/Scalar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Utility/Scalar.cpp')
-rw-r--r--lldb/source/Utility/Scalar.cpp60
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());