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
