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

>From 7a4b4c3605c64512125de7f40cf942dc702bb248 Mon Sep 17 00:00:00 2001
From: MrEven132 <[email protected]>
Date: Tue, 25 Aug 2026 15:05:51 +0800
Subject: [PATCH] [lldb] Evaluate generic DW_OP_mod with unsigned arithmetic

---
 lldb/source/Expression/DWARFExpression.cpp        |  6 ++++++
 lldb/unittests/Expression/DWARFExpressionTest.cpp | 15 ++++++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/lldb/source/Expression/DWARFExpression.cpp 
b/lldb/source/Expression/DWARFExpression.cpp
index 453c361c1d6f9..e62b6945dc3ed 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -1601,6 +1601,12 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
         return err;
       tmp = stack.back();
       stack.pop_back();
+      if (IsPotentiallyGenericIntegerOperand(tmp.GetScalar(), address_size) &&
+          IsPotentiallyGenericIntegerOperand(stack.back().GetScalar(),
+                                             address_size)) {
+        tmp.GetScalar().MakeUnsigned();
+        stack.back().GetScalar().MakeUnsigned();
+      }
       stack.back().GetScalar() = stack.back().GetScalar() % tmp.GetScalar();
       break;
 
diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp 
b/lldb/unittests/Expression/DWARFExpressionTest.cpp
index a09aadf88039c..76d2d4efcf557 100644
--- a/lldb/unittests/Expression/DWARFExpressionTest.cpp
+++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp
@@ -992,9 +992,18 @@ TEST(DWARFExpression, DW_OP_div) {
 }
 
 TEST(DWARFExpression, DW_OP_mod) {
-  EXPECT_THAT_EXPECTED(Evaluate({DW_OP_const1s, static_cast<uint8_t>(-7),
-                                 DW_OP_const1s, 3, DW_OP_mod}),
-                       ExpectScalar(static_cast<int32_t>(-1)));
+  // DW_OP_mod uses unsigned remainder, so on a 64-bit target all-one bits
+  // modulo 2 is 1, not signed -1 % 2 == -1.
+  uint8_t expr[] = {DW_OP_consts, 0x7f,      DW_OP_consts,
+                    0x02,         DW_OP_mod, DW_OP_stack_value};
+  DataExtractor extractor(expr, sizeof(expr), lldb::eByteOrderLittle,
+                          /*addr_size=*/8);
+  auto result = DWARFExpression::Evaluate(
+      /*exe_ctx=*/nullptr, /*reg_ctx=*/nullptr, /*module_sp=*/{}, extractor,
+      /*unit=*/nullptr, lldb::eRegisterKindLLDB,
+      /*initial_value_ptr=*/nullptr, /*object_address_ptr=*/nullptr);
+  ASSERT_THAT_EXPECTED(result, ExpectScalar(64, 1, /*sign=*/false));
+  EXPECT_FALSE(result->GetScalar().IsSigned());
 }
 
 TEST(DWARFExpression, DW_OP_minus) {

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

Reply via email to