From b2fb3922d6857815fb757db73036675194bcaced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= Date: Wed, 15 Oct 2025 23:52:48 +0200 Subject: [PATCH 1/7] [lldb] fix the "RegisterValue::SetValueFromData" method Fix the "RegisterValue::SetValueFromData" so that it works also for 128-bit registers that contain integers. --- lldb/source/Utility/RegisterValue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/source/Utility/RegisterValue.cpp b/lldb/source/Utility/RegisterValue.cpp index 0e99451c3b700..12c349a143c0f 100644 --- a/lldb/source/Utility/RegisterValue.cpp +++ b/lldb/source/Utility/RegisterValue.cpp @@ -199,7 +199,7 @@ Status RegisterValue::SetValueFromData(const RegisterInfo ®_info, else if (reg_info.byte_size <= 16) { uint64_t data1 = src.GetU64(&src_offset); uint64_t data2 = src.GetU64(&src_offset); - if (src.GetByteOrder() == eByteOrderBig) { + if (src.GetByteOrder() == eByteOrderLittle) { int128.x[0] = data1; int128.x[1] = data2; } else { From cc54084674d4a64d803194b39765bb76589028ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= Date: Fri, 17 Oct 2025 11:28:12 +0200 Subject: [PATCH 2/7] [lldb] add tests for the "RegisterValue::SetValueFromData" method --- lldb/unittests/Utility/RegisterValueTest.cpp | 53 ++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/lldb/unittests/Utility/RegisterValueTest.cpp b/lldb/unittests/Utility/RegisterValueTest.cpp index e0863a41605e6..e34a8c2b8bdf8 100644 --- a/lldb/unittests/Utility/RegisterValueTest.cpp +++ b/lldb/unittests/Utility/RegisterValueTest.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "lldb/Utility/RegisterValue.h" +#include "lldb/lldb-private-types.h" +#include "lldb/Utility/DataExtractor.h" #include "gtest/gtest.h" #include @@ -54,3 +56,54 @@ TEST(RegisterValueTest, GetScalarValue) { Scalar((APInt(128, 0xffeeddccbbaa9988ull) << 64) | APInt(128, 0x7766554433221100))); } + +static const Scalar etalon128(APInt(128, 0xffeeddccbbaa9988ull) << 64 | + APInt(128, 0x7766554433221100ull)); + +// Test that the "RegisterValue::SetValueFromData" method works correctly +// with 128-bit little-endian data that represents an integer. +TEST(RegisterValueTest, SetValueFromData_128_le) { + RegisterValue rv; + RegisterInfo ri{"uint128_register", + nullptr, + 16, + 0, + lldb::Encoding::eEncodingUint, + lldb::Format::eFormatDefault, + {0, 0, 0, LLDB_INVALID_REGNUM, 0}, + nullptr, + nullptr, + nullptr}; + + uint8_t src[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; + DataExtractor src_extractor(src, 16, lldb::ByteOrder::eByteOrderLittle, 8); + EXPECT_TRUE(rv.SetValueFromData(ri, src_extractor, 0, false).Success()); + Scalar s; + EXPECT_TRUE(rv.GetScalarValue(s)); + EXPECT_EQ(s, etalon128); +} + +// Test that the "RegisterValue::SetValueFromData" method works correctly +// with 128-bit big-endian data that represents an integer. +TEST(RegisterValueTest, SetValueFromData_128_be) { + RegisterValue rv; + RegisterInfo ri{"uint128_register", + nullptr, + 16, + 0, + lldb::Encoding::eEncodingUint, + lldb::Format::eFormatDefault, + {0, 0, 0, LLDB_INVALID_REGNUM, 0}, + nullptr, + nullptr, + nullptr}; + + uint8_t src[] = {0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, + 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00}; + DataExtractor src_extractor(src, 16, lldb::ByteOrder::eByteOrderBig, 8); + EXPECT_TRUE(rv.SetValueFromData(ri, src_extractor, 0, false).Success()); + Scalar s; + EXPECT_TRUE(rv.GetScalarValue(s)); + EXPECT_EQ(s, etalon128); +} From fdae92f0f68b1f20690ddb8461d7e621353cf029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= Date: Fri, 17 Oct 2025 14:49:45 +0200 Subject: [PATCH 3/7] [lldb] fixing formatting --- lldb/unittests/Utility/RegisterValueTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/unittests/Utility/RegisterValueTest.cpp b/lldb/unittests/Utility/RegisterValueTest.cpp index e34a8c2b8bdf8..f34a87fd47f0c 100644 --- a/lldb/unittests/Utility/RegisterValueTest.cpp +++ b/lldb/unittests/Utility/RegisterValueTest.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// #include "lldb/Utility/RegisterValue.h" -#include "lldb/lldb-private-types.h" #include "lldb/Utility/DataExtractor.h" +#include "lldb/lldb-private-types.h" #include "gtest/gtest.h" #include From 592b8f88e68b0aa79e62233469e2dacadea9bab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= Date: Fri, 17 Oct 2025 15:48:59 +0200 Subject: [PATCH 4/7] [lldb] refactoring --- lldb/unittests/Utility/RegisterValueTest.cpp | 22 +++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/lldb/unittests/Utility/RegisterValueTest.cpp b/lldb/unittests/Utility/RegisterValueTest.cpp index f34a87fd47f0c..83b08f0b7cd00 100644 --- a/lldb/unittests/Utility/RegisterValueTest.cpp +++ b/lldb/unittests/Utility/RegisterValueTest.cpp @@ -60,6 +60,16 @@ TEST(RegisterValueTest, GetScalarValue) { static const Scalar etalon128(APInt(128, 0xffeeddccbbaa9988ull) << 64 | APInt(128, 0x7766554433221100ull)); +void TestSetValueFromData128(const RegisterInfo &ri, void *src, + const lldb::ByteOrder endianness) { + DataExtractor src_extractor(src, 16, endianness, 8); + RegisterValue rv; + EXPECT_TRUE(rv.SetValueFromData(ri, src_extractor, 0, false).Success()); + Scalar s; + EXPECT_TRUE(rv.GetScalarValue(s)); + EXPECT_EQ(s, etalon128); +} + // Test that the "RegisterValue::SetValueFromData" method works correctly // with 128-bit little-endian data that represents an integer. TEST(RegisterValueTest, SetValueFromData_128_le) { @@ -77,11 +87,7 @@ TEST(RegisterValueTest, SetValueFromData_128_le) { uint8_t src[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; - DataExtractor src_extractor(src, 16, lldb::ByteOrder::eByteOrderLittle, 8); - EXPECT_TRUE(rv.SetValueFromData(ri, src_extractor, 0, false).Success()); - Scalar s; - EXPECT_TRUE(rv.GetScalarValue(s)); - EXPECT_EQ(s, etalon128); + TestSetValueFromData128(ri, src, lldb::ByteOrder::eByteOrderLittle); } // Test that the "RegisterValue::SetValueFromData" method works correctly @@ -101,9 +107,5 @@ TEST(RegisterValueTest, SetValueFromData_128_be) { uint8_t src[] = {0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00}; - DataExtractor src_extractor(src, 16, lldb::ByteOrder::eByteOrderBig, 8); - EXPECT_TRUE(rv.SetValueFromData(ri, src_extractor, 0, false).Success()); - Scalar s; - EXPECT_TRUE(rv.GetScalarValue(s)); - EXPECT_EQ(s, etalon128); + TestSetValueFromData128(ri, src, lldb::ByteOrder::eByteOrderBig); } From 08ddc99b36e52e27ce73f66ba9ac061f53354942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= Date: Fri, 17 Oct 2025 15:53:06 +0200 Subject: [PATCH 5/7] [lldb] fixing formatting --- lldb/unittests/Utility/RegisterValueTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/unittests/Utility/RegisterValueTest.cpp b/lldb/unittests/Utility/RegisterValueTest.cpp index 83b08f0b7cd00..36f75601c53ab 100644 --- a/lldb/unittests/Utility/RegisterValueTest.cpp +++ b/lldb/unittests/Utility/RegisterValueTest.cpp @@ -61,7 +61,7 @@ static const Scalar etalon128(APInt(128, 0xffeeddccbbaa9988ull) << 64 | APInt(128, 0x7766554433221100ull)); void TestSetValueFromData128(const RegisterInfo &ri, void *src, - const lldb::ByteOrder endianness) { + const lldb::ByteOrder endianness) { DataExtractor src_extractor(src, 16, endianness, 8); RegisterValue rv; EXPECT_TRUE(rv.SetValueFromData(ri, src_extractor, 0, false).Success()); From 812a1834e7af04b8b3b3e0fbb6bddf32e6543c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= Date: Fri, 17 Oct 2025 16:09:03 +0200 Subject: [PATCH 6/7] [lldb] refactoring --- lldb/unittests/Utility/RegisterValueTest.cpp | 37 +++++++------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/lldb/unittests/Utility/RegisterValueTest.cpp b/lldb/unittests/Utility/RegisterValueTest.cpp index 36f75601c53ab..d7174cda074b8 100644 --- a/lldb/unittests/Utility/RegisterValueTest.cpp +++ b/lldb/unittests/Utility/RegisterValueTest.cpp @@ -60,8 +60,17 @@ TEST(RegisterValueTest, GetScalarValue) { static const Scalar etalon128(APInt(128, 0xffeeddccbbaa9988ull) << 64 | APInt(128, 0x7766554433221100ull)); -void TestSetValueFromData128(const RegisterInfo &ri, void *src, - const lldb::ByteOrder endianness) { +void TestSetValueFromData128(void *src, const lldb::ByteOrder endianness) { + RegisterInfo ri{"uint128_register", + nullptr, + 16, + 0, + lldb::Encoding::eEncodingUint, + lldb::Format::eFormatDefault, + {0, 0, 0, LLDB_INVALID_REGNUM, 0}, + nullptr, + nullptr, + nullptr}; DataExtractor src_extractor(src, 16, endianness, 8); RegisterValue rv; EXPECT_TRUE(rv.SetValueFromData(ri, src_extractor, 0, false).Success()); @@ -74,38 +83,18 @@ void TestSetValueFromData128(const RegisterInfo &ri, void *src, // with 128-bit little-endian data that represents an integer. TEST(RegisterValueTest, SetValueFromData_128_le) { RegisterValue rv; - RegisterInfo ri{"uint128_register", - nullptr, - 16, - 0, - lldb::Encoding::eEncodingUint, - lldb::Format::eFormatDefault, - {0, 0, 0, LLDB_INVALID_REGNUM, 0}, - nullptr, - nullptr, - nullptr}; uint8_t src[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; - TestSetValueFromData128(ri, src, lldb::ByteOrder::eByteOrderLittle); + TestSetValueFromData128(src, lldb::ByteOrder::eByteOrderLittle); } // Test that the "RegisterValue::SetValueFromData" method works correctly // with 128-bit big-endian data that represents an integer. TEST(RegisterValueTest, SetValueFromData_128_be) { RegisterValue rv; - RegisterInfo ri{"uint128_register", - nullptr, - 16, - 0, - lldb::Encoding::eEncodingUint, - lldb::Format::eFormatDefault, - {0, 0, 0, LLDB_INVALID_REGNUM, 0}, - nullptr, - nullptr, - nullptr}; uint8_t src[] = {0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00}; - TestSetValueFromData128(ri, src, lldb::ByteOrder::eByteOrderBig); + TestSetValueFromData128(src, lldb::ByteOrder::eByteOrderBig); } From 86e81ee2333a4bd3904648ce7dc9835fcab74344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= Date: Fri, 17 Oct 2025 16:10:02 +0200 Subject: [PATCH 7/7] [lldb] refactoring --- lldb/unittests/Utility/RegisterValueTest.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lldb/unittests/Utility/RegisterValueTest.cpp b/lldb/unittests/Utility/RegisterValueTest.cpp index d7174cda074b8..6239dbe21634a 100644 --- a/lldb/unittests/Utility/RegisterValueTest.cpp +++ b/lldb/unittests/Utility/RegisterValueTest.cpp @@ -82,8 +82,6 @@ void TestSetValueFromData128(void *src, const lldb::ByteOrder endianness) { // Test that the "RegisterValue::SetValueFromData" method works correctly // with 128-bit little-endian data that represents an integer. TEST(RegisterValueTest, SetValueFromData_128_le) { - RegisterValue rv; - uint8_t src[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; TestSetValueFromData128(src, lldb::ByteOrder::eByteOrderLittle); @@ -92,8 +90,6 @@ TEST(RegisterValueTest, SetValueFromData_128_le) { // Test that the "RegisterValue::SetValueFromData" method works correctly // with 128-bit big-endian data that represents an integer. TEST(RegisterValueTest, SetValueFromData_128_be) { - RegisterValue rv; - uint8_t src[] = {0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00}; TestSetValueFromData128(src, lldb::ByteOrder::eByteOrderBig);