https://github.com/MrEven132 updated 
https://github.com/llvm/llvm-project/pull/218335

>From ef38c25666f4294fd20008653431e551ee885d05 Mon Sep 17 00:00:00 2001
From: MrEven132 <[email protected]>
Date: Mon, 24 Aug 2026 16:46:52 +0800
Subject: [PATCH 1/7] [lldb][NFC] Add generic operand comparison helpers

---
 lldb/source/Expression/DWARFExpression.cpp | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/lldb/source/Expression/DWARFExpression.cpp 
b/lldb/source/Expression/DWARFExpression.cpp
index 91c47546eeac7..72e6a5144a1e2 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1380,6 +1380,12 @@ static llvm::Error CheckScalarOperandsHaveSameType(const 
Scalar &lhs,
   return llvm::Error::success();
 }
 
+static bool IsPotentiallyGenericIntegerOperand(const Scalar &operand,
+                                               size_t address_size) {
+  return address_size != 0 && operand.GetType() == Scalar::e_int &&
+         operand.GetByteSize() == address_size;
+}
+
 llvm::Expected<Value> DWARFExpression::Evaluate(
     ExecutionContext *exe_ctx, RegisterContext *reg_ctx,
     lldb::ModuleSP module_sp, const DataExtractor &opcodes,
@@ -1419,6 +1425,14 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
         !is_signed));
   };
 
+  auto make_generic_operands_signed = [&](Scalar &lhs, Scalar &rhs) {
+    if (IsPotentiallyGenericIntegerOperand(lhs, address_size) &&
+        IsPotentiallyGenericIntegerOperand(rhs, address_size)) {
+      lhs.MakeSigned();
+      rhs.MakeSigned();
+    }
+  };
+
   llvm::DWARFExpression::iterator op = expr.begin(), op_end = expr.end();
   while (op != op_end) {
     const uint64_t op_offset = op.getOffset();

>From 84cbe4cbcbde32368bb0a59f0e7599df1bd86f52 Mon Sep 17 00:00:00 2001
From: MrEven132 <[email protected]>
Date: Mon, 24 Aug 2026 16:50:13 +0800
Subject: [PATCH 2/7] [lldb] Compare generic DW_OP_ge operands as signed

---
 lldb/source/Expression/DWARFExpression.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lldb/source/Expression/DWARFExpression.cpp 
b/lldb/source/Expression/DWARFExpression.cpp
index 72e6a5144a1e2..98e1e77dfa5b1 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1759,6 +1759,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
         return err;
       tmp = stack.back();
       stack.pop_back();
+      make_generic_operands_signed(stack.back().GetScalar(), tmp.GetScalar());
       stack.back().GetScalar() =
           to_generic(stack.back().GetScalar() >= tmp.GetScalar());
       break;

>From bac0255cf87a326e96189a9400f5620a6ddd63a1 Mon Sep 17 00:00:00 2001
From: MrEven132 <[email protected]>
Date: Mon, 24 Aug 2026 16:50:40 +0800
Subject: [PATCH 3/7] [lldb] Compare generic DW_OP_gt operands as signed

---
 lldb/source/Expression/DWARFExpression.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lldb/source/Expression/DWARFExpression.cpp 
b/lldb/source/Expression/DWARFExpression.cpp
index 98e1e77dfa5b1..1c0d3b2cb6676 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1771,6 +1771,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
         return err;
       tmp = stack.back();
       stack.pop_back();
+      make_generic_operands_signed(stack.back().GetScalar(), tmp.GetScalar());
       stack.back().GetScalar() =
           to_generic(stack.back().GetScalar() > tmp.GetScalar());
       break;

>From 5598ad4fe90ff4dc7272d7a56867e517f7ae90a8 Mon Sep 17 00:00:00 2001
From: MrEven132 <[email protected]>
Date: Mon, 24 Aug 2026 16:51:05 +0800
Subject: [PATCH 4/7] [lldb] Compare generic DW_OP_le operands as signed

---
 lldb/source/Expression/DWARFExpression.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lldb/source/Expression/DWARFExpression.cpp 
b/lldb/source/Expression/DWARFExpression.cpp
index 1c0d3b2cb6676..e121f843291e1 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1783,6 +1783,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
         return err;
       tmp = stack.back();
       stack.pop_back();
+      make_generic_operands_signed(stack.back().GetScalar(), tmp.GetScalar());
       stack.back().GetScalar() =
           to_generic(stack.back().GetScalar() <= tmp.GetScalar());
       break;

>From d6f01f0f805cd4d419c53665a6bc8611bf4a0cce Mon Sep 17 00:00:00 2001
From: MrEven132 <[email protected]>
Date: Mon, 24 Aug 2026 16:52:16 +0800
Subject: [PATCH 5/7] [lldb] Compare generic DW_OP_lt operands as signed

---
 lldb/source/Expression/DWARFExpression.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lldb/source/Expression/DWARFExpression.cpp 
b/lldb/source/Expression/DWARFExpression.cpp
index e121f843291e1..a07bf5166ef51 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1795,6 +1795,7 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
         return err;
       tmp = stack.back();
       stack.pop_back();
+      make_generic_operands_signed(stack.back().GetScalar(), tmp.GetScalar());
       stack.back().GetScalar() =
           to_generic(stack.back().GetScalar() < tmp.GetScalar());
       break;

>From 1e512b07e6b48261a6844fc442a623fefbc6642f Mon Sep 17 00:00:00 2001
From: MrEven132 <[email protected]>
Date: Mon, 24 Aug 2026 17:23:51 +0800
Subject: [PATCH 6/7] [lldb] Test signed generic DWARF relational comparisons

Add regression coverage for DW_OP_lt, DW_OP_le, DW_OP_gt, and DW_OP_ge
using an address-sized all-one generic value compared with zero.
---
 .../Expression/DWARFExpressionTest.cpp        | 39 +++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp 
b/lldb/unittests/Expression/DWARFExpressionTest.cpp
index 094cfaf790a9a..50bdc96be7c93 100644
--- a/lldb/unittests/Expression/DWARFExpressionTest.cpp
+++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp
@@ -766,6 +766,45 @@ TEST(DWARFExpression, RelationalOpsProduceGenericResult) {
   }
 }
 
+TEST(DWARFExpression, GenericRelationalOpsUseSignedComparison) {
+  struct TestCase {
+    uint8_t opcode;
+    uint8_t expected;
+  };
+  constexpr TestCase test_cases[] = {
+      {DW_OP_lt, 1}, {DW_OP_le, 1}, {DW_OP_gt, 0}, {DW_OP_ge, 0}};
+
+  for (const TestCase &test : test_cases) {
+    // Generic relational operands are compared as signed values, so the
+    // unsigned encoding of all-one bits below represents -1 for comparison.
+    const std::vector<uint8_t> expr = {
+        DW_OP_const8u,
+        0xff,
+        0xff,
+        0xff,
+        0xff,
+        0xff,
+        0xff,
+        0xff,
+        0xff,
+        DW_OP_consts,
+        0x00,
+        test.opcode,
+        DW_OP_stack_value,
+    };
+    DataExtractor extractor(expr.data(), expr.size(), lldb::eByteOrderLittle,
+                            /*addr_size=*/8);
+
+    EXPECT_THAT_EXPECTED(
+        DWARFExpression::Evaluate(
+            /*exe_ctx=*/nullptr, /*reg_ctx=*/nullptr, /*module_sp=*/{},
+            extractor, /*unit=*/nullptr, lldb::eRegisterKindLLDB,
+            /*initial_value_ptr=*/nullptr, /*object_address_ptr=*/nullptr),
+        ExpectScalar(64, test.expected, false))
+        << "opcode 0x" << llvm::utohexstr(test.opcode);
+  }
+}
+
 TEST(DWARFExpression, DW_OP_stack_value) {
   EXPECT_THAT_EXPECTED(Evaluate({DW_OP_stack_value}), llvm::Failed());
 }

>From 7e7a2243802df93c9312e8b005fdb639256d08c9 Mon Sep 17 00:00:00 2001
From: MrEven132 <[email protected]>
Date: Tue, 25 Aug 2026 10:11:10 +0800
Subject: [PATCH 7/7] [lldb][NFC] Document generic operand comparison helpers

---
 lldb/source/Expression/DWARFExpression.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lldb/source/Expression/DWARFExpression.cpp 
b/lldb/source/Expression/DWARFExpression.cpp
index a07bf5166ef51..fecb60e68865c 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1380,6 +1380,9 @@ static llvm::Error CheckScalarOperandsHaveSameType(const 
Scalar &lhs,
   return llvm::Error::success();
 }
 
+// Scalar does not preserve DWARF's generic type identifier. Since generic
+// values are address-sized integers, use the scalar kind and width as an
+// approximation.
 static bool IsPotentiallyGenericIntegerOperand(const Scalar &operand,
                                                size_t address_size) {
   return address_size != 0 && operand.GetType() == Scalar::e_int &&
@@ -1425,6 +1428,8 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
         !is_signed));
   };
 
+  // DWARF requires relational comparisons of generic operands to be signed.
+  // Normalize both potentially generic operands before comparing them.
   auto make_generic_operands_signed = [&](Scalar &lhs, Scalar &rhs) {
     if (IsPotentiallyGenericIntegerOperand(lhs, address_size) &&
         IsPotentiallyGenericIntegerOperand(rhs, address_size)) {

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to