https://github.com/P41NT created https://github.com/llvm/llvm-project/pull/204896
Fixes an implicit widening bug in DW_OP_plus_uconst when handling DWARF 5 typed values. LLDB was incorrectly forwarding typed operations to uint64_t scalar arithmetic, which destroys the wrapping semantics required by the DWARF specification. Updated the DW_OP_plus_uconst logic to explicitly truncate results to the operand's original bit-width, preventing illegal integer widening and maintaining correct DWARF wrap-around behavior Fixes #204520 >From 7137ee9344c2a54ffd50888eb7866b6c9ce71cf8 Mon Sep 17 00:00:00 2001 From: Shawn Theo Moses <[email protected]> Date: Fri, 19 Jun 2026 17:31:50 +0530 Subject: [PATCH] [lldb][DWARF] Fix implicit widening bug in DW_OP_plus_uconst --- lldb/source/Expression/DWARFExpression.cpp | 3 ++ .../Expression/DWARFExpressionTest.cpp | 52 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index dd436e0c8afd9..03dab75ba75c3 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -1534,8 +1534,11 @@ llvm::Expected<Value> DWARFExpression::Evaluate( case DW_OP_plus_uconst: { const uint64_t uconst_value = op->getRawOperand(0); + const int byte_size = stack.back().GetScalar().GetByteSize(); // Implicit conversion from a UINT to a Scalar... stack.back().GetScalar() += uconst_value; + if (byte_size > 0 && byte_size < 8) + stack.back().GetScalar().TruncOrExtendTo(byte_size * 8, false); if (!stack.back().GetScalar().IsValid()) return llvm::createStringError("DW_OP_plus_uconst failed"); } break; diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp b/lldb/unittests/Expression/DWARFExpressionTest.cpp index 6d4a624505390..59fbc81c9747e 100644 --- a/lldb/unittests/Expression/DWARFExpressionTest.cpp +++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp @@ -722,6 +722,58 @@ TEST(DWARFExpression, DW_OP_plus_uconst) { EXPECT_THAT_EXPECTED(Evaluate({DW_OP_const1s, static_cast<uint8_t>(-10), DW_OP_plus_uconst, 5}), ExpectScalar(static_cast<int32_t>(-5))); + const char *yamldata = R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_386 +DWARF: + debug_abbrev: + - Table: + - Code: 0x00000001 + Tag: DW_TAG_compile_unit + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_language + Form: DW_FORM_data2 + - Code: 0x00000002 + Tag: DW_TAG_base_type + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_encoding + Form: DW_FORM_data1 + - Attribute: DW_AT_byte_size + Form: DW_FORM_data1 + debug_info: + - Version: 4 + AddrSize: 8 + AbbrevTableID: 0 + AbbrOffset: 0x0 + Entries: + - AbbrCode: 0x00000001 + Values: + - Value: 0x000000000000000C + # 0x0000000e: + - AbbrCode: 0x00000002 + Values: + - Value: 0x0000000000000008 # DW_ATE_unsigned_char + - Value: 0x0000000000000001 + - AbbrCode: 0x00000000 + )"; + + DWARFExpressionTester t(yamldata, 0); + ASSERT_TRUE(t.GetDwarfUnit()); + + uint8_t offs_uchar = 0x0000000e; + bool not_signed = false; + + EXPECT_THAT_EXPECTED( + t.Eval({DW_OP_const8u, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + DW_OP_convert, offs_uchar, DW_OP_plus_uconst, 1, DW_OP_const1u, 7, + DW_OP_convert, offs_uchar, DW_OP_shr, DW_OP_stack_value}), + ExpectScalar(8, 0, not_signed)); } TEST(DWARFExpression, DW_OP_and) { _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
