https://github.com/thechenli updated 
https://github.com/llvm/llvm-project/pull/220774

>From 12a0bb2224c5c58c9f37520a693cfaff70a41dd9 Mon Sep 17 00:00:00 2001
From: Chen Li <[email protected]>
Date: Wed, 2 Sep 2026 17:36:11 -0700
Subject: [PATCH] [lldb][AMDGPU] Support terminal DW_OP_LLVM_piece_end

---
 lldb/source/Expression/DWARFExpression.cpp    | 19 +++++++++++++
 .../Expression/DWARFExpressionTest.cpp        | 28 +++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/lldb/source/Expression/DWARFExpression.cpp 
b/lldb/source/Expression/DWARFExpression.cpp
index 60577bac07167..038db3dfec587 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -2228,6 +2228,25 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
       return llvm::createStringError("unimplemented opcode %s",
                                      DW_OP_value_to_name(opcode));
 
+    case DW_OP_LLVM_user:
+      if (op->getSubCode() == DW_OP_LLVM_piece_end) {
+        if (op->getEndOffset() != expr_data.size())
+          return llvm::createStringError(
+              "DW_OP_LLVM_piece_end is only supported at the end of an "
+              "expression");
+
+        // LLDB already constructs a single composite in `pieces`, so a
+        // terminal DW_OP_LLVM_piece_end adds no information and can be 
ignored.
+        // TODO: Support multiple composites as described by the heterogeneous
+        // debugging extensions:
+        // 
https://llvm.org/docs/AMDGPUDwarfExtensionsForHeterogeneousDebugging.html
+        // TODO: Support the standard DW_OP_piece_end opcode once LLVM
+        // implements the DWARF 6 locations-on-the-stack proposal:
+        // https://dwarfstd.org/issues/230524.1-orig.html
+        break;
+      }
+      [[fallthrough]];
+
     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 4b4b911800ae8..31e629967c6a2 100644
--- a/lldb/unittests/Expression/DWARFExpressionTest.cpp
+++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp
@@ -1597,6 +1597,34 @@ TEST_F(DWARFExpressionMockProcessTest, DW_OP_regx) {
       ExpectScalar(0xBEEF, Value::ContextType::RegisterInfo));
 }
 
+TEST_F(DWARFExpressionMockProcessTest, DW_OP_LLVM_piece_end) {
+  TestContext ctx;
+  constexpr uint64_t reg_value = 0x8877665544332211;
+  ASSERT_TRUE(
+      CreateTestContext(&ctx, "i386-pc-linux", RegisterValue(reg_value)));
+
+  ExecutionContext exe_ctx(ctx.process_sp);
+  MockDwarfDelegate delegate = MockDwarfDelegate::Dwarf5();
+
+  // Match the expression emitted for a value split across two AMDGPU
+  // registers. A terminal DW_OP_LLVM_piece_end completes the composite.
+  EXPECT_THAT_EXPECTED(
+      Evaluate({DW_OP_regx, 0x20, DW_OP_piece, 4, DW_OP_regx, 0x21, 
DW_OP_piece,
+                4, DW_OP_LLVM_user, DW_OP_LLVM_piece_end},
+               {}, &delegate, &exe_ctx, ctx.reg_ctx_sp.get()),
+      ExpectHostAddress({0x11, 0x22, 0x33, 0x44, 0x11, 0x22, 0x33, 0x44}));
+}
+
+TEST(DWARFExpression, DW_OP_LLVM_piece_end_multiple) {
+  EXPECT_THAT_ERROR(
+      Evaluate({DW_OP_const1u, 0xaa, DW_OP_piece, 1, DW_OP_LLVM_user,
+                DW_OP_LLVM_piece_end, DW_OP_LLVM_user, DW_OP_LLVM_piece_end})
+          .takeError(),
+      llvm::FailedWithMessage(
+          "DW_OP_LLVM_piece_end is only supported at the end of an "
+          "expression"));
+}
+
 TEST_F(DWARFExpressionMockProcessTest, DW_OP_deref_size_zero) {
   // DW_OP_deref_size with size 0 must report an error instead of constructing
   // a DataExtractor with addr_size 0 (caught by lldb-dwarf-expression-fuzzer:

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

Reply via email to