[Lldb-commits] [lldb] Use `llvm::APInt` for `VariantMember` Discriminants (PR #188487)

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Fri Apr 10 05:02:11 PDT 2026


================
@@ -2596,8 +2597,31 @@ bool VariantMember::IsDefault() const { return !discr_value; }
 
 VariantMember::VariantMember(DWARFDIE &die, lldb::ModuleSP module_sp) {
   assert(die.Tag() == llvm::dwarf::DW_TAG_variant);
-  this->discr_value =
-      die.GetAttributeValueAsOptionalUnsigned(DW_AT_discr_value);
+
+  DWARFFormValue discr_form;
+  die.GetDIE()->GetAttributeValue(die.GetCU(), DW_AT_discr_value, discr_form);
+
+  // rust can output 128-bit discrs (e.g. NonNull<u128>) as `DW_FORM_block1`.
+  // there is a `data16`, but the DIE function treats it as a block anyway.
+  // Handling is included for it just in case rust's output changes to the
+  // `data16` version
+  dw_form_t form = discr_form.Form();
+  if ((form == DW_FORM_block1 && discr_form.Unsigned() == 16) ||
+      form == DW_FORM_data16) {
+    const uint8_t *block_data = discr_form.BlockData();
+
+    llvm::ArrayRef<uint64_t> data =
+        llvm::ArrayRef(reinterpret_cast<const uint64_t *>(block_data), 2);
+    this->discr_value = llvm::APInt(sizeof(uint64_t) * 2 * 8, data);
----------------
JDevlieghere wrote:

Nit: maybe use 16 here, to match the 16 on line 2609 and `DW_FORM_data16`.
```suggestion
    this->discr_value = llvm::APInt(sizeof(uint64_t) * 16, data);
```

https://github.com/llvm/llvm-project/pull/188487


More information about the lldb-commits mailing list