Author: Pavel Labath Date: 2020-11-03T16:12:32+01:00 New Revision: d2700b7873e305a09a931e98b12ebab7b42deec3
URL: https://github.com/llvm/llvm-project/commit/d2700b7873e305a09a931e98b12ebab7b42deec3 DIFF: https://github.com/llvm/llvm-project/commit/d2700b7873e305a09a931e98b12ebab7b42deec3.diff LOG: [lldb/Utility] Add unit tests for RegisterValue::GetScalarValue Buggy cases are commented out. Also sneak in a modernization of a RegisterValue constructor. Added: Modified: lldb/include/lldb/Utility/RegisterValue.h lldb/source/Expression/Materializer.cpp lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp lldb/unittests/Utility/RegisterValueTest.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Utility/RegisterValue.h b/lldb/include/lldb/Utility/RegisterValue.h index 4885d5806384..4211b0a59992 100644 --- a/lldb/include/lldb/Utility/RegisterValue.h +++ b/lldb/include/lldb/Utility/RegisterValue.h @@ -74,9 +74,9 @@ class RegisterValue { m_scalar = value; } - explicit RegisterValue(uint8_t *bytes, size_t length, + explicit RegisterValue(llvm::ArrayRef<uint8_t> bytes, lldb::ByteOrder byte_order) { - SetBytes(bytes, length, byte_order); + SetBytes(bytes.data(), bytes.size(), byte_order); } RegisterValue::Type GetType() const { return m_type; } diff --git a/lldb/source/Expression/Materializer.cpp b/lldb/source/Expression/Materializer.cpp index 327e15a26266..a93c127dd0d0 100644 --- a/lldb/source/Expression/Materializer.cpp +++ b/lldb/source/Expression/Materializer.cpp @@ -1282,9 +1282,8 @@ class EntityRegister : public Materializer::Entity { m_register_contents.reset(); - RegisterValue register_value( - const_cast<uint8_t *>(register_data.GetDataStart()), - register_data.GetByteSize(), register_data.GetByteOrder()); + RegisterValue register_value(register_data.GetData(), + register_data.GetByteOrder()); if (!reg_context_sp->WriteRegister(&m_register_info, register_value)) { err.SetErrorStringWithFormat("couldn't write the value of register %s", diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp index 3b6f740a5983..02b6ca40fc9b 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp @@ -2091,7 +2091,7 @@ GDBRemoteCommunicationServerLLGS::Handle_P(StringExtractorGDBRemote &packet) { StreamGDBRemote response; RegisterValue reg_value( - reg_bytes, reg_size, + makeArrayRef(reg_bytes, reg_size), m_debugged_process_up->GetArchitecture().GetByteOrder()); Status error = reg_context.WriteRegister(reg_info, reg_value); if (error.Fail()) { diff --git a/lldb/unittests/Utility/RegisterValueTest.cpp b/lldb/unittests/Utility/RegisterValueTest.cpp index 70d79ea0024a..bbefb96519b1 100644 --- a/lldb/unittests/Utility/RegisterValueTest.cpp +++ b/lldb/unittests/Utility/RegisterValueTest.cpp @@ -10,6 +10,8 @@ #include "gtest/gtest.h" using namespace lldb_private; +using llvm::APInt; +using llvm::ArrayRef; TEST(RegisterValueTest, GetSet8) { RegisterValue R8(uint8_t(47)); @@ -20,3 +22,37 @@ TEST(RegisterValueTest, GetSet8) { EXPECT_EQ(42u, R8.GetAsUInt32()); EXPECT_EQ(42u, R8.GetAsUInt64()); } + +TEST(RegisterValueTest, GetScalarValue) { + using RV = RegisterValue; + const auto &Get = [](const RV &V) -> llvm::Optional<Scalar> { + Scalar S; + if (V.GetScalarValue(S)) + return S; + return llvm::None; + }; + EXPECT_EQ(Get(RV(uint8_t(47))), Scalar(47)); + EXPECT_EQ(Get(RV(uint16_t(4747))), Scalar(4747)); + EXPECT_EQ(Get(RV(uint32_t(47474242))), Scalar(47474242)); + EXPECT_EQ(Get(RV(uint64_t(4747424247474242))), Scalar(4747424247474242)); + EXPECT_EQ(Get(RV(APInt::getMaxValue(128))), Scalar(APInt::getMaxValue(128))); + EXPECT_EQ(Get(RV(47.5f)), Scalar(47.5f)); + EXPECT_EQ(Get(RV(47.5)), Scalar(47.5)); + EXPECT_EQ(Get(RV(47.5L)), Scalar(47.5L)); + EXPECT_EQ(Get(RV({0xff, 0xee, 0xdd, 0xcc}, lldb::eByteOrderLittle)), + Scalar(0xccddeeff)); + // EXPECT_EQ(Get(RV({0xff, 0xee, 0xdd, 0xcc}, lldb::eByteOrderBig)), + // Scalar(0xffeeddcc)); + EXPECT_EQ(Get(RV({0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, + 0x55, 0x44, 0x33, 0x22, 0x11, 0x00}, + lldb::eByteOrderLittle)), + Scalar((APInt(128, 0x0011223344556677ull) << 64) | + APInt(128, 0x8899aabbccddeeff))); +#if 0 + EXPECT_EQ(Get(RV({0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, + 0x55, 0x44, 0x33, 0x22, 0x11, 0x00}, + lldb::eByteOrderBig)), + Scalar((APInt(128, 0xffeeddccbbaa9988ull) << 64) | + APInt(128, 0x7766554433221100))); +#endif +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits