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

Reply via email to