Implement debug_type for tuples

This commit is contained in:
bjorn3 2024-03-27 20:29:50 +00:00
parent 55a2446a53
commit 0634aedbb7

View File

@ -56,7 +56,7 @@ pub(crate) fn debug_type<'tcx>(
// ty::FnDef(..) | ty::FnPtr(..) // ty::FnDef(..) | ty::FnPtr(..)
// ty::Closure(..) // ty::Closure(..)
// ty::Adt(def, ..) // ty::Adt(def, ..)
// ty::Tuple(_) ty::Tuple(components) => self.tuple_type(tcx, type_dbg, ty, *components),
// ty::Param(_) // ty::Param(_)
// FIXME implement remaining types and add unreachable!() to the fallback branch // FIXME implement remaining types and add unreachable!() to the fallback branch
_ => self.placeholder_for_type(tcx, type_dbg, ty), _ => self.placeholder_for_type(tcx, type_dbg, ty),
@ -144,6 +144,51 @@ fn pointer_type<'tcx>(
} }
} }
fn tuple_type<'tcx>(
&mut self,
tcx: TyCtxt<'tcx>,
type_dbg: &mut TypeDebugContext<'tcx>,
tuple_type: Ty<'tcx>,
components: &'tcx [Ty<'tcx>],
) -> UnitEntryId {
let components = components
.into_iter()
.map(|&ty| (ty, self.debug_type(tcx, type_dbg, ty)))
.collect::<Vec<_>>();
return_if_type_created_in_meantime!(type_dbg, tuple_type);
let name = type_names::compute_debuginfo_type_name(tcx, tuple_type, false);
let layout = RevealAllLayoutCx(tcx).layout_of(tuple_type);
let tuple_type_id =
self.dwarf.unit.add(self.dwarf.unit.root(), gimli::DW_TAG_structure_type);
let tuple_entry = self.dwarf.unit.get_mut(tuple_type_id);
tuple_entry.set(gimli::DW_AT_name, AttributeValue::StringRef(self.dwarf.strings.add(name)));
tuple_entry.set(gimli::DW_AT_byte_size, AttributeValue::Udata(layout.size.bytes()));
tuple_entry.set(gimli::DW_AT_alignment, AttributeValue::Udata(layout.align.pref.bytes()));
for (i, (ty, dw_ty)) in components.into_iter().enumerate() {
let member_id = self.dwarf.unit.add(tuple_type_id, gimli::DW_TAG_member);
let member_entry = self.dwarf.unit.get_mut(member_id);
member_entry.set(
gimli::DW_AT_name,
AttributeValue::StringRef(self.dwarf.strings.add(format!("__{i}"))),
);
member_entry.set(gimli::DW_AT_type, AttributeValue::UnitRef(dw_ty));
member_entry.set(
gimli::DW_AT_alignment,
AttributeValue::Udata(RevealAllLayoutCx(tcx).layout_of(ty).align.pref.bytes()),
);
member_entry.set(
gimli::DW_AT_data_member_location,
AttributeValue::Udata(layout.fields.offset(i).bytes()),
);
}
tuple_type_id
}
fn placeholder_for_type<'tcx>( fn placeholder_for_type<'tcx>(
&mut self, &mut self,
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,