Skip to content

Commit

Permalink
Add Artificial flag to generator variants
Browse files Browse the repository at this point in the history
  • Loading branch information
tmandry committed Jun 18, 2020
1 parent 1c34357 commit f44731a
Showing 1 changed file with 53 additions and 14 deletions.
67 changes: 53 additions & 14 deletions src/librustc_codegen_llvm/debuginfo/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -863,7 +863,7 @@ fn foreign_type_metadata(
debug!("foreign_type_metadata: {:?}", t);

let name = compute_debuginfo_type_name(cx.tcx, t, false);
create_struct_stub(cx, t, &name, unique_type_id, NO_SCOPE_METADATA)
create_struct_stub(cx, t, &name, unique_type_id, NO_SCOPE_METADATA, DIFlags::FlagZero)
}

fn pointer_type_metadata(
Expand Down Expand Up @@ -1161,8 +1161,14 @@ fn prepare_struct_metadata(

let containing_scope = get_namespace_for_item(cx, struct_def_id);

let struct_metadata_stub =
create_struct_stub(cx, struct_type, &struct_name, unique_type_id, Some(containing_scope));
let struct_metadata_stub = create_struct_stub(
cx,
struct_type,
&struct_name,
unique_type_id,
Some(containing_scope),
DIFlags::FlagZero,
);

create_and_register_recursive_type_forward_declaration(
cx,
Expand Down Expand Up @@ -1218,8 +1224,14 @@ fn prepare_tuple_metadata(
) -> RecursiveTypeDescription<'ll, 'tcx> {
let tuple_name = compute_debuginfo_type_name(cx.tcx, tuple_type, false);

let struct_stub =
create_struct_stub(cx, tuple_type, &tuple_name[..], unique_type_id, containing_scope);
let struct_stub = create_struct_stub(
cx,
tuple_type,
&tuple_name[..],
unique_type_id,
containing_scope,
DIFlags::FlagZero,
);

create_and_register_recursive_type_forward_declaration(
cx,
Expand Down Expand Up @@ -1390,6 +1402,10 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
} else {
type_metadata(cx, self.enum_type, self.span)
};
let flags = match self.enum_type.kind {
ty::Generator(..) => DIFlags::FlagArtificial,
_ => DIFlags::FlagZero,
};

match self.layout.variants {
Variants::Single { index } => {
Expand Down Expand Up @@ -1423,7 +1439,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
offset: Size::ZERO,
size: self.layout.size,
align: self.layout.align.abi,
flags: DIFlags::FlagZero,
flags,
discriminant: None,
source_info: variant_info.source_info(cx),
}]
Expand Down Expand Up @@ -1477,7 +1493,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
offset: Size::ZERO,
size: self.layout.size,
align: self.layout.align.abi,
flags: DIFlags::FlagZero,
flags,
discriminant: Some(
self.layout.ty.discriminant_for_variant(cx.tcx, i).unwrap().val
as u64,
Expand Down Expand Up @@ -1560,7 +1576,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
offset: Size::ZERO,
size: variant.size,
align: variant.align.abi,
flags: DIFlags::FlagZero,
flags,
discriminant: None,
source_info: variant_info.source_info(cx),
}]
Expand Down Expand Up @@ -1610,7 +1626,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
offset: Size::ZERO,
size: self.layout.size,
align: self.layout.align.abi,
flags: DIFlags::FlagZero,
flags,
discriminant: niche_value,
source_info: variant_info.source_info(cx),
}
Expand Down Expand Up @@ -1740,6 +1756,14 @@ impl<'tcx> VariantInfo<'_, 'tcx> {
}
None
}

#[allow(dead_code)]
fn is_artificial(&self) -> bool {
match self {
VariantInfo::Generator { .. } => true,
VariantInfo::Adt(..) => false,
}
}
}

/// Returns a tuple of (1) `type_metadata_stub` of the variant, (2) a
Expand All @@ -1759,7 +1783,15 @@ fn describe_enum_variant(
.type_map
.borrow_mut()
.get_unique_type_id_of_enum_variant(cx, layout.ty, &variant_name);
create_struct_stub(cx, layout.ty, &variant_name, unique_type_id, Some(containing_scope))
create_struct_stub(
cx,
layout.ty,
&variant_name,
unique_type_id,
Some(containing_scope),
// FIXME(tmandry): This doesn't seem to have any effect.
if variant.is_artificial() { DIFlags::FlagArtificial } else { DIFlags::FlagZero },
)
});

// Build an array of (field name, field type) pairs to be captured in the factory closure.
Expand Down Expand Up @@ -1821,6 +1853,11 @@ fn prepare_enum_metadata(
) -> RecursiveTypeDescription<'ll, 'tcx> {
let tcx = cx.tcx;
let enum_name = compute_debuginfo_type_name(tcx, enum_type, false);
// FIXME(tmandry): This doesn't seem to have any effect.
let enum_flags = match enum_type.kind {
ty::Generator(..) => DIFlags::FlagArtificial,
_ => DIFlags::FlagZero,
};

let containing_scope = get_namespace_for_item(cx, enum_def_id);
// FIXME: This should emit actual file metadata for the enum, but we
Expand Down Expand Up @@ -1955,7 +1992,7 @@ fn prepare_enum_metadata(
UNKNOWN_LINE_NUMBER,
layout.size.bits(),
layout.align.abi.bits() as u32,
DIFlags::FlagZero,
enum_flags,
None,
0, // RuntimeLang
unique_type_id_str.as_ptr().cast(),
Expand Down Expand Up @@ -2081,7 +2118,7 @@ fn prepare_enum_metadata(
UNKNOWN_LINE_NUMBER,
layout.size.bits(),
layout.align.abi.bits() as u32,
DIFlags::FlagZero,
enum_flags,
discriminator_metadata,
empty_array,
variant_part_unique_type_id_str.as_ptr().cast(),
Expand All @@ -2107,7 +2144,7 @@ fn prepare_enum_metadata(
UNKNOWN_LINE_NUMBER,
layout.size.bits(),
layout.align.abi.bits() as u32,
DIFlags::FlagZero,
enum_flags,
None,
type_array,
0,
Expand Down Expand Up @@ -2158,6 +2195,7 @@ fn composite_type_metadata(
composite_type_name,
composite_type_unique_id,
containing_scope,
DIFlags::FlagZero,
);
// ... and immediately create and add the member descriptions.
set_members_of_composite_type(cx, composite_type, composite_type_metadata, member_descriptions);
Expand Down Expand Up @@ -2259,6 +2297,7 @@ fn create_struct_stub(
struct_type_name: &str,
unique_type_id: UniqueTypeId,
containing_scope: Option<&'ll DIScope>,
flags: DIFlags,
) -> &'ll DICompositeType {
let (struct_size, struct_align) = cx.size_and_align_of(struct_type);

Expand All @@ -2280,7 +2319,7 @@ fn create_struct_stub(
UNKNOWN_LINE_NUMBER,
struct_size.bits(),
struct_align.bits() as u32,
DIFlags::FlagZero,
flags,
None,
empty_array,
0,
Expand Down

0 comments on commit f44731a

Please sign in to comment.