https://github.com/MrEven132 updated https://github.com/llvm/llvm-project/pull/216661
>From ca2e1e118af3a04335a7b0fc46d8c0a56c7442f1 Mon Sep 17 00:00:00 2001 From: MrEven132 <[email protected]> Date: Tue, 18 Aug 2026 13:02:16 +0800 Subject: [PATCH 1/2] [lldb] Keep address operation values address-sized --- lldb/source/Expression/DWARFExpression.cpp | 2 +- lldb/unittests/Expression/DWARFExpressionTest.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 0bc272ddd89b2..791b4e042ab24 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -1440,7 +1440,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate( switch (opcode) { case DW_OP_addr: - stack.push_back(Scalar(op->getRawOperand(0))); + stack.push_back(to_generic(op->getRawOperand(0))); stack.back().SetValueType(Value::ValueType::FileAddress); break; diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp b/lldb/unittests/Expression/DWARFExpressionTest.cpp index c5df2d438471a..743fcfd9e17f0 100644 --- a/lldb/unittests/Expression/DWARFExpressionTest.cpp +++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp @@ -853,6 +853,16 @@ TEST(DWARFExpression, DW_OP_addr) { ExpectScalar(uint32_t{0x40302010})); } +TEST(DWARFExpression, DW_OP_addr_address_size) { + // Address arithmetic wraps at the target address size. In particular, + // 0xffffffff + 1 is zero on this 32-bit target. + auto result = Evaluate({DW_OP_addr, 0x2a, 0x00, 0x00, 0x00, DW_OP_const4u, + 0xff, 0xff, 0xff, 0xff, DW_OP_plus, DW_OP_lit1, + DW_OP_plus, DW_OP_stack_value}); + ASSERT_THAT_EXPECTED(result, ExpectScalar(32, 0x2a, false)); + EXPECT_EQ(result->GetScalar().GetAPSInt().getBitWidth(), 32u); +} + TEST(DWARFExpression, DW_OP_addr_big_endian) { // Same operand bytes, big-endian extractor: the address must be read in // target byte order. >From 48a662d8af299568ee95efafaa90cad54f7a2398 Mon Sep 17 00:00:00 2001 From: MrEven132 <[email protected]> Date: Tue, 18 Aug 2026 13:35:38 +0800 Subject: [PATCH 2/2] [lldb] Keep indexed address values address-sized --- lldb/source/Expression/DWARFExpression.cpp | 2 +- .../Expression/DWARFExpressionTest.cpp | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 791b4e042ab24..e927708f12d14 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -2044,7 +2044,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate( uint64_t index = op->getRawOperand(0); lldb::addr_t value = eval_ctx.dwarf_cu->ReadAddressFromDebugAddrSection(index); - stack.push_back(Scalar(value)); + stack.push_back(to_generic(value)); stack.back().SetValueType(Value::ValueType::FileAddress); } break; diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp b/lldb/unittests/Expression/DWARFExpressionTest.cpp index 743fcfd9e17f0..6985dd0dd4939 100644 --- a/lldb/unittests/Expression/DWARFExpressionTest.cpp +++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp @@ -46,12 +46,15 @@ namespace { /// with the DWARF version being configurable via the constructor. class MockDwarfDelegate : public DWARFExpression::Delegate { public: + using DebugAddrMap = std::unordered_map<uint32_t, dw_addr_t>; + static constexpr uint16_t DEFAULT_DWARF_VERSION = 5; static MockDwarfDelegate Dwarf5() { return MockDwarfDelegate(5); } static MockDwarfDelegate Dwarf2() { return MockDwarfDelegate(2); } MockDwarfDelegate() : MockDwarfDelegate(DEFAULT_DWARF_VERSION) {} - explicit MockDwarfDelegate(uint16_t version) : m_dwarf_version(version) {} + explicit MockDwarfDelegate(uint16_t version, DebugAddrMap debug_addr = {}) + : m_dwarf_version(version), m_debug_addr(std::move(debug_addr)) {} uint16_t GetVersion() const override { return m_dwarf_version; } @@ -66,7 +69,8 @@ class MockDwarfDelegate : public DWARFExpression::Delegate { } dw_addr_t ReadAddressFromDebugAddrSection(uint32_t index) const override { - return 0; + auto it = m_debug_addr.find(index); + return it == m_debug_addr.end() ? LLDB_INVALID_ADDRESS : it->second; } lldb::offset_t GetVendorDWARFOpcodeSize(const DataExtractor &data, @@ -84,6 +88,7 @@ class MockDwarfDelegate : public DWARFExpression::Delegate { private: uint16_t m_dwarf_version; + DebugAddrMap m_debug_addr; }; /// Mock memory implementation for testing. @@ -863,6 +868,21 @@ TEST(DWARFExpression, DW_OP_addr_address_size) { EXPECT_EQ(result->GetScalar().GetAPSInt().getBitWidth(), 32u); } +TEST(DWARFExpression, DW_OP_addr_index_address_size) { + MockDwarfDelegate unit(/*version=*/5, + /*debug_addr=*/{{0, 0x11}, {1, 0x2a}}); + for (uint8_t opcode : {static_cast<uint8_t>(DW_OP_addrx), + static_cast<uint8_t>(DW_OP_GNU_addr_index)}) { + SCOPED_TRACE(static_cast<unsigned>(opcode)); + auto result = + Evaluate({opcode, 0x01, DW_OP_const4u, 0xff, 0xff, 0xff, 0xff, + DW_OP_plus, DW_OP_lit1, DW_OP_plus, DW_OP_stack_value}, + {}, &unit); + ASSERT_THAT_EXPECTED(result, ExpectScalar(32, 0x2a, false)); + EXPECT_EQ(result->GetScalar().GetAPSInt().getBitWidth(), 32u); + } +} + TEST(DWARFExpression, DW_OP_addr_big_endian) { // Same operand bytes, big-endian extractor: the address must be read in // target byte order. _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
