https://github.com/firmiana402 created https://github.com/llvm/llvm-project/pull/210363
This PR addresses [#202251](https://github.com/llvm/llvm-project/issues/202251). Several opcodes recognized by LLDB's DWARF expression decoding logic currently have no explicit `case` in `DWARFExpression::Evaluate`. They therefore reach the generic default path, which makes it unclear whether their evaluator status is intentional or an omission. Explicitly list the affected opcodes and group them with the existing `DW_OP_xderef`, `DW_OP_xderef_size`, `DW_OP_call2`, and `DW_OP_call4` cases. All twelve known but unsupported opcodes now share an `unimplemented opcode` return, while `default` remains responsible for unknown and vendor-handled opcodes. No opcode evaluation semantics change. The affected opcodes are `DW_OP_call_ref`, `DW_OP_constx`, `DW_OP_const_type`, `DW_OP_regval_type`, `DW_OP_deref_type`, `DW_OP_xderef_type`, `DW_OP_reinterpret`, and `DW_OP_GNU_implicit_pointer`. ## Tests The existing per-opcode status-locking tests in `DWARFExpressionTest.cpp` cover all affected cases and are updated to check the unified diagnostic. >From 6a8970568f44578ba45c5d960eaee82ee6dc0796 Mon Sep 17 00:00:00 2001 From: firmiana402 <[email protected]> Date: Fri, 17 Jul 2026 00:45:56 +0800 Subject: [PATCH] [lldb][NFC] Explicitly list unsupported DWARF expression opcodes --- lldb/source/Expression/DWARFExpression.cpp | 26 +++++++---- .../Expression/DWARFExpressionTest.cpp | 46 ++++++++----------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 299dbe97d6176..2dbf61a14eac4 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -1457,11 +1457,6 @@ llvm::Expected<Value> DWARFExpression::Evaluate( return err; } break; - case DW_OP_xderef_size: - return llvm::createStringError("unimplemented opcode: DW_OP_xderef_size"); - case DW_OP_xderef: - return llvm::createStringError("unimplemented opcode: DW_OP_xderef"); - case DW_OP_const1u: stack.push_back(to_generic(op->getRawOperand(0))); break; @@ -2015,11 +2010,6 @@ llvm::Expected<Value> DWARFExpression::Evaluate( } break; - case DW_OP_call2: - return llvm::createStringError("unimplemented opcode DW_OP_call2"); - case DW_OP_call4: - return llvm::createStringError("unimplemented opcode DW_OP_call4"); - case DW_OP_stack_value: eval_ctx.loc_desc_kind = Implicit; stack.back().SetValueType(Value::ValueType::Scalar); @@ -2092,6 +2082,22 @@ llvm::Expected<Value> DWARFExpression::Evaluate( continue; } + // These opcodes are decoded but not evaluated here. + case DW_OP_xderef: + case DW_OP_xderef_size: + case DW_OP_call2: + case DW_OP_call4: + case DW_OP_call_ref: + case DW_OP_constx: + case DW_OP_const_type: + case DW_OP_regval_type: + case DW_OP_deref_type: + case DW_OP_xderef_type: + case DW_OP_reinterpret: + case DW_OP_GNU_implicit_pointer: + return llvm::createStringError("unimplemented opcode %s", + DW_OP_value_to_name(opcode)); + default: if (eval_ctx.dwarf_cu) { const uint64_t operands_offset = op_offset + 1; diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp b/lldb/unittests/Expression/DWARFExpressionTest.cpp index 6df4553757de4..e8bca7208c8d5 100644 --- a/lldb/unittests/Expression/DWARFExpressionTest.cpp +++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp @@ -1176,13 +1176,13 @@ TEST(DWARFExpression, DW_OP_deref_size_too_large) { TEST(DWARFExpression, DW_OP_xderef_unimplemented) { EXPECT_THAT_EXPECTED( Evaluate({DW_OP_lit0, DW_OP_lit0, DW_OP_xderef}), - llvm::FailedWithMessage("unimplemented opcode: DW_OP_xderef")); + llvm::FailedWithMessage("unimplemented opcode DW_OP_xderef")); } TEST(DWARFExpression, DW_OP_xderef_size_unimplemented) { EXPECT_THAT_EXPECTED( Evaluate({DW_OP_lit0, DW_OP_lit0, DW_OP_xderef_size, 4}), - llvm::FailedWithMessage("unimplemented opcode: DW_OP_xderef_size")); + llvm::FailedWithMessage("unimplemented opcode DW_OP_xderef_size")); } TEST(DWARFExpression, DW_OP_call2_unimplemented) { @@ -1197,12 +1197,11 @@ TEST(DWARFExpression, DW_OP_call4_unimplemented) { llvm::FailedWithMessage("unimplemented opcode DW_OP_call4")); } -TEST(DWARFExpression, DW_OP_call_ref_unhandled) { +TEST(DWARFExpression, DW_OP_call_ref_unimplemented) { // call_ref has stack arity 1 in LLVM's table, so push a value first. EXPECT_THAT_EXPECTED( Evaluate({DW_OP_lit0, DW_OP_call_ref, 0x00, 0x00, 0x00, 0x00}), - llvm::FailedWithMessage( - "unhandled opcode DW_OP_call_ref in DWARFExpression")); + llvm::FailedWithMessage("unimplemented opcode DW_OP_call_ref")); } TEST(DWARFExpression, DW_OP_implicit_pointer_unimplemented) { @@ -1211,53 +1210,48 @@ TEST(DWARFExpression, DW_OP_implicit_pointer_unimplemented) { llvm::Failed()); } -TEST(DWARFExpression, DW_OP_GNU_implicit_pointer_unhandled) { +TEST(DWARFExpression, DW_OP_GNU_implicit_pointer_unimplemented) { EXPECT_THAT_EXPECTED( Evaluate({DW_OP_GNU_implicit_pointer, 0x00, 0x00, 0x00, 0x00, 0x00}), llvm::FailedWithMessage( - "unhandled opcode DW_OP_GNU_implicit_pointer in DWARFExpression")); + "unimplemented opcode DW_OP_GNU_implicit_pointer")); } -TEST(DWARFExpression, DW_OP_const_type_unhandled) { +TEST(DWARFExpression, DW_OP_const_type_unimplemented) { // const_type: ULEB128 type DIE offset, 1-byte size, N-byte value block. EXPECT_THAT_EXPECTED( Evaluate({DW_OP_const_type, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00}), - llvm::FailedWithMessage( - "unhandled opcode DW_OP_const_type in DWARFExpression")); + llvm::FailedWithMessage("unimplemented opcode DW_OP_const_type")); } -TEST(DWARFExpression, DW_OP_regval_type_unhandled) { +TEST(DWARFExpression, DW_OP_regval_type_unimplemented) { EXPECT_THAT_EXPECTED( Evaluate({DW_OP_regval_type, 0x00, 0x00}), - llvm::FailedWithMessage( - "unhandled opcode DW_OP_regval_type in DWARFExpression")); + llvm::FailedWithMessage("unimplemented opcode DW_OP_regval_type")); } -TEST(DWARFExpression, DW_OP_deref_type_unhandled) { +TEST(DWARFExpression, DW_OP_deref_type_unimplemented) { EXPECT_THAT_EXPECTED( Evaluate({DW_OP_lit0, DW_OP_deref_type, 0x04, 0x00}), - llvm::FailedWithMessage( - "unhandled opcode DW_OP_deref_type in DWARFExpression")); + llvm::FailedWithMessage("unimplemented opcode DW_OP_deref_type")); } -TEST(DWARFExpression, DW_OP_xderef_type_unhandled) { +TEST(DWARFExpression, DW_OP_xderef_type_unimplemented) { EXPECT_THAT_EXPECTED( Evaluate({DW_OP_lit0, DW_OP_lit0, DW_OP_xderef_type, 0x04, 0x00}), - llvm::FailedWithMessage( - "unhandled opcode DW_OP_xderef_type in DWARFExpression")); + llvm::FailedWithMessage("unimplemented opcode DW_OP_xderef_type")); } -TEST(DWARFExpression, DW_OP_constx_unhandled) { - EXPECT_THAT_EXPECTED(Evaluate({DW_OP_constx, 0x00}), - llvm::FailedWithMessage( - "unhandled opcode DW_OP_constx in DWARFExpression")); +TEST(DWARFExpression, DW_OP_constx_unimplemented) { + EXPECT_THAT_EXPECTED( + Evaluate({DW_OP_constx, 0x00}), + llvm::FailedWithMessage("unimplemented opcode DW_OP_constx")); } -TEST(DWARFExpression, DW_OP_reinterpret_unhandled) { +TEST(DWARFExpression, DW_OP_reinterpret_unimplemented) { EXPECT_THAT_EXPECTED( Evaluate({DW_OP_lit0, DW_OP_reinterpret, 0x00}), - llvm::FailedWithMessage( - "unhandled opcode DW_OP_reinterpret in DWARFExpression")); + llvm::FailedWithMessage("unimplemented opcode DW_OP_reinterpret")); } // Register-based tests need a register context. MockRegisterContext returns the _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
