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/6] [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/6] [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/6] [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/6] [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/6] [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 0d7ceb9c9d793093982649759b94eba1b684db88 Mon Sep 17 00:00:00 2001 From: MrEven132 <[email protected]> Date: Mon, 24 Aug 2026 17:23:51 +0800 Subject: [PATCH 6/6] [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. Assisted-by: Codex --- .../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()); } _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
