| use rustc_middle::ty::{self, layout::TyAndLayout}; |
| use rustc_target::abi::Size; |
| |
| // FIXME(eddyb) find a place for this (or a way to replace it). |
| pub mod type_names; |
| |
| /// Returns true if we want to generate a DW_TAG_enumeration_type description for |
| /// this instead of a DW_TAG_struct_type with DW_TAG_variant_part. |
| /// |
| /// NOTE: This is somewhat inconsistent right now: For empty enums and enums with a single |
| /// fieldless variant, we generate DW_TAG_struct_type, although a |
| /// DW_TAG_enumeration_type would be a better fit. |
| pub fn wants_c_like_enum_debuginfo(enum_type_and_layout: TyAndLayout<'_>) -> bool { |
| match enum_type_and_layout.ty.kind() { |
| ty::Adt(adt_def, _) => { |
| if !adt_def.is_enum() { |
| return false; |
| } |
| |
| match adt_def.variants().len() { |
| 0 => false, |
| 1 => { |
| // Univariant enums unless they are zero-sized |
| enum_type_and_layout.size != Size::ZERO && adt_def.all_fields().count() == 0 |
| } |
| _ => { |
| // Enums with more than one variant if they have no fields |
| adt_def.all_fields().count() == 0 |
| } |
| } |
| } |
| _ => false, |
| } |
| } |