Author: Pavel Labath Date: 2020-07-20T15:56:56+02:00 New Revision: 7fadd7006932adfe65f445aad1e60fe8d7b81eec
URL: https://github.com/llvm/llvm-project/commit/7fadd7006932adfe65f445aad1e60fe8d7b81eec DIFF: https://github.com/llvm/llvm-project/commit/7fadd7006932adfe65f445aad1e60fe8d7b81eec.diff LOG: [lldb/Utility] Simplify Scalar::SetValueFromData The function was fairly complicated and didn't support new bigger integer sizes. Use llvm function for loading an APInt from memory to write a unified implementation for all sizes. Added: Modified: lldb/include/lldb/Utility/Scalar.h lldb/source/Utility/Scalar.cpp lldb/unittests/Utility/ScalarTest.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Utility/Scalar.h b/lldb/include/lldb/Utility/Scalar.h index f215fa71c84c..0bb5c7d1b859 100644 --- a/lldb/include/lldb/Utility/Scalar.h +++ b/lldb/include/lldb/Utility/Scalar.h @@ -217,7 +217,7 @@ class Scalar { Status SetValueFromCString(const char *s, lldb::Encoding encoding, size_t byte_size); - Status SetValueFromData(DataExtractor &data, lldb::Encoding encoding, + Status SetValueFromData(const DataExtractor &data, lldb::Encoding encoding, size_t byte_size); static bool UIntValueIsValidForSize(uint64_t uval64, size_t total_byte_size) { diff --git a/lldb/source/Utility/Scalar.cpp b/lldb/source/Utility/Scalar.cpp index 6c48bbde532f..e2c1f37fe529 100644 --- a/lldb/source/Utility/Scalar.cpp +++ b/lldb/source/Utility/Scalar.cpp @@ -1068,12 +1068,9 @@ Status Scalar::SetValueFromCString(const char *value_str, Encoding encoding, return error; } -Status Scalar::SetValueFromData(DataExtractor &data, lldb::Encoding encoding, - size_t byte_size) { +Status Scalar::SetValueFromData(const DataExtractor &data, + lldb::Encoding encoding, size_t byte_size) { Status error; - - type128 int128; - type256 int256; switch (encoding) { case lldb::eEncodingInvalid: error.SetErrorString("invalid encoding"); @@ -1081,100 +1078,26 @@ Status Scalar::SetValueFromData(DataExtractor &data, lldb::Encoding encoding, case lldb::eEncodingVector: error.SetErrorString("vector encoding unsupported"); break; - case lldb::eEncodingUint: { - lldb::offset_t offset = 0; - - switch (byte_size) { - case 1: - operator=(data.GetU8(&offset)); - break; - case 2: - operator=(data.GetU16(&offset)); - break; - case 4: - operator=(data.GetU32(&offset)); - break; - case 8: - operator=(data.GetU64(&offset)); - break; - case 16: - if (data.GetByteOrder() == eByteOrderBig) { - int128.x[1] = data.GetU64(&offset); - int128.x[0] = data.GetU64(&offset); - } else { - int128.x[0] = data.GetU64(&offset); - int128.x[1] = data.GetU64(&offset); - } - operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x)); - break; - case 32: - if (data.GetByteOrder() == eByteOrderBig) { - int256.x[3] = data.GetU64(&offset); - int256.x[2] = data.GetU64(&offset); - int256.x[1] = data.GetU64(&offset); - int256.x[0] = data.GetU64(&offset); - } else { - int256.x[0] = data.GetU64(&offset); - int256.x[1] = data.GetU64(&offset); - int256.x[2] = data.GetU64(&offset); - int256.x[3] = data.GetU64(&offset); - } - operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x)); - break; - default: - error.SetErrorStringWithFormat( - "unsupported unsigned integer byte size: %" PRIu64 "", - static_cast<uint64_t>(byte_size)); - break; - } - } break; + case lldb::eEncodingUint: case lldb::eEncodingSint: { - lldb::offset_t offset = 0; - - switch (byte_size) { - case 1: - operator=(static_cast<int8_t>(data.GetU8(&offset))); - break; - case 2: - operator=(static_cast<int16_t>(data.GetU16(&offset))); - break; - case 4: - operator=(static_cast<int32_t>(data.GetU32(&offset))); - break; - case 8: - operator=(static_cast<int64_t>(data.GetU64(&offset))); - break; - case 16: - if (data.GetByteOrder() == eByteOrderBig) { - int128.x[1] = data.GetU64(&offset); - int128.x[0] = data.GetU64(&offset); - } else { - int128.x[0] = data.GetU64(&offset); - int128.x[1] = data.GetU64(&offset); - } - operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x)); - break; - case 32: - if (data.GetByteOrder() == eByteOrderBig) { - int256.x[3] = data.GetU64(&offset); - int256.x[2] = data.GetU64(&offset); - int256.x[1] = data.GetU64(&offset); - int256.x[0] = data.GetU64(&offset); - } else { - int256.x[0] = data.GetU64(&offset); - int256.x[1] = data.GetU64(&offset); - int256.x[2] = data.GetU64(&offset); - int256.x[3] = data.GetU64(&offset); - } - operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x)); - break; - default: - error.SetErrorStringWithFormat( - "unsupported signed integer byte size: %" PRIu64 "", - static_cast<uint64_t>(byte_size)); - break; + if (data.GetByteSize() < byte_size) + return Status("insufficient data"); + Type type = GetBestTypeForBitSize(byte_size*8, encoding == lldb::eEncodingSint); + if (type == e_void) { + return Status("unsupported integer byte size: %" PRIu64 "", + static_cast<uint64_t>(byte_size)); } - } break; + m_type = type; + if (data.GetByteOrder() == endian::InlHostByteOrder()) { + m_integer = APInt::getNullValue(8 * byte_size); + llvm::LoadIntFromMemory(m_integer, data.GetDataStart(), byte_size); + } else { + std::vector<uint8_t> buffer(byte_size); + std::copy_n(data.GetDataStart(), byte_size, buffer.rbegin()); + llvm::LoadIntFromMemory(m_integer, buffer.data(), byte_size); + } + break; + } case lldb::eEncodingIEEE754: { lldb::offset_t offset = 0; diff --git a/lldb/unittests/Utility/ScalarTest.cpp b/lldb/unittests/Utility/ScalarTest.cpp index dd4683145b96..f6bc6a404c15 100644 --- a/lldb/unittests/Utility/ScalarTest.cpp +++ b/lldb/unittests/Utility/ScalarTest.cpp @@ -135,12 +135,8 @@ TEST(ScalarTest, GetBytes) { Scalar f_scalar; DataExtractor e_data(e, sizeof(e), endian::InlHostByteOrder(), sizeof(void *)); - Status e_error = - e_scalar.SetValueFromData(e_data, lldb::eEncodingUint, sizeof(e)); DataExtractor f_data(f, sizeof(f), endian::InlHostByteOrder(), sizeof(void *)); - Status f_error = - f_scalar.SetValueFromData(f_data, lldb::eEncodingUint, sizeof(f)); a_scalar.GetBytes(Storage); ASSERT_EQ(0, memcmp(&a, Storage, sizeof(a))); b_scalar.GetBytes(Storage); @@ -149,14 +145,39 @@ TEST(ScalarTest, GetBytes) { ASSERT_EQ(0, memcmp(&c, Storage, sizeof(c))); d_scalar.GetBytes(Storage); ASSERT_EQ(0, memcmp(&d, Storage, sizeof(d))); - ASSERT_EQ(0, e_error.Fail()); + ASSERT_THAT_ERROR( + e_scalar.SetValueFromData(e_data, lldb::eEncodingUint, sizeof(e)) + .ToError(), + llvm::Succeeded()); e_scalar.GetBytes(Storage); ASSERT_EQ(0, memcmp(e, Storage, sizeof(e))); - ASSERT_EQ(0, f_error.Fail()); + ASSERT_THAT_ERROR( + f_scalar.SetValueFromData(f_data, lldb::eEncodingUint, sizeof(f)) + .ToError(), + llvm::Succeeded()); f_scalar.GetBytes(Storage); ASSERT_EQ(0, memcmp(f, Storage, sizeof(f))); } +TEST(ScalarTest, SetValueFromData) { + uint8_t a[] = {1, 2, 3, 4}; + Scalar s; + ASSERT_THAT_ERROR( + s.SetValueFromData( + DataExtractor(a, sizeof(a), lldb::eByteOrderLittle, sizeof(void *)), + lldb::eEncodingSint, sizeof(a)) + .ToError(), + llvm::Succeeded()); + EXPECT_EQ(0x04030201, s); + ASSERT_THAT_ERROR( + s.SetValueFromData( + DataExtractor(a, sizeof(a), lldb::eByteOrderBig, sizeof(void *)), + lldb::eEncodingSint, sizeof(a)) + .ToError(), + llvm::Succeeded()); + EXPECT_EQ(0x01020304, s); +} + TEST(ScalarTest, CastOperations) { long long a = 0xf1f2f3f4f5f6f7f8LL; Scalar a_scalar(a); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits