Skip to content

Commit f44731a

Browse files
committed
Add Artificial flag to generator variants
1 parent 1c34357 commit f44731a

File tree

1 file changed

+53
-14
lines changed

1 file changed

+53
-14
lines changed

src/librustc_codegen_llvm/debuginfo/metadata.rs

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ fn foreign_type_metadata(
863863
debug!("foreign_type_metadata: {:?}", t);
864864

865865
let name = compute_debuginfo_type_name(cx.tcx, t, false);
866-
create_struct_stub(cx, t, &name, unique_type_id, NO_SCOPE_METADATA)
866+
create_struct_stub(cx, t, &name, unique_type_id, NO_SCOPE_METADATA, DIFlags::FlagZero)
867867
}
868868

869869
fn pointer_type_metadata(
@@ -1161,8 +1161,14 @@ fn prepare_struct_metadata(
11611161

11621162
let containing_scope = get_namespace_for_item(cx, struct_def_id);
11631163

1164-
let struct_metadata_stub =
1165-
create_struct_stub(cx, struct_type, &struct_name, unique_type_id, Some(containing_scope));
1164+
let struct_metadata_stub = create_struct_stub(
1165+
cx,
1166+
struct_type,
1167+
&struct_name,
1168+
unique_type_id,
1169+
Some(containing_scope),
1170+
DIFlags::FlagZero,
1171+
);
11661172

11671173
create_and_register_recursive_type_forward_declaration(
11681174
cx,
@@ -1218,8 +1224,14 @@ fn prepare_tuple_metadata(
12181224
) -> RecursiveTypeDescription<'ll, 'tcx> {
12191225
let tuple_name = compute_debuginfo_type_name(cx.tcx, tuple_type, false);
12201226

1221-
let struct_stub =
1222-
create_struct_stub(cx, tuple_type, &tuple_name[..], unique_type_id, containing_scope);
1227+
let struct_stub = create_struct_stub(
1228+
cx,
1229+
tuple_type,
1230+
&tuple_name[..],
1231+
unique_type_id,
1232+
containing_scope,
1233+
DIFlags::FlagZero,
1234+
);
12231235

12241236
create_and_register_recursive_type_forward_declaration(
12251237
cx,
@@ -1390,6 +1402,10 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
13901402
} else {
13911403
type_metadata(cx, self.enum_type, self.span)
13921404
};
1405+
let flags = match self.enum_type.kind {
1406+
ty::Generator(..) => DIFlags::FlagArtificial,
1407+
_ => DIFlags::FlagZero,
1408+
};
13931409

13941410
match self.layout.variants {
13951411
Variants::Single { index } => {
@@ -1423,7 +1439,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14231439
offset: Size::ZERO,
14241440
size: self.layout.size,
14251441
align: self.layout.align.abi,
1426-
flags: DIFlags::FlagZero,
1442+
flags,
14271443
discriminant: None,
14281444
source_info: variant_info.source_info(cx),
14291445
}]
@@ -1477,7 +1493,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14771493
offset: Size::ZERO,
14781494
size: self.layout.size,
14791495
align: self.layout.align.abi,
1480-
flags: DIFlags::FlagZero,
1496+
flags,
14811497
discriminant: Some(
14821498
self.layout.ty.discriminant_for_variant(cx.tcx, i).unwrap().val
14831499
as u64,
@@ -1560,7 +1576,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15601576
offset: Size::ZERO,
15611577
size: variant.size,
15621578
align: variant.align.abi,
1563-
flags: DIFlags::FlagZero,
1579+
flags,
15641580
discriminant: None,
15651581
source_info: variant_info.source_info(cx),
15661582
}]
@@ -1610,7 +1626,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
16101626
offset: Size::ZERO,
16111627
size: self.layout.size,
16121628
align: self.layout.align.abi,
1613-
flags: DIFlags::FlagZero,
1629+
flags,
16141630
discriminant: niche_value,
16151631
source_info: variant_info.source_info(cx),
16161632
}
@@ -1740,6 +1756,14 @@ impl<'tcx> VariantInfo<'_, 'tcx> {
17401756
}
17411757
None
17421758
}
1759+
1760+
#[allow(dead_code)]
1761+
fn is_artificial(&self) -> bool {
1762+
match self {
1763+
VariantInfo::Generator { .. } => true,
1764+
VariantInfo::Adt(..) => false,
1765+
}
1766+
}
17431767
}
17441768

17451769
/// Returns a tuple of (1) `type_metadata_stub` of the variant, (2) a
@@ -1759,7 +1783,15 @@ fn describe_enum_variant(
17591783
.type_map
17601784
.borrow_mut()
17611785
.get_unique_type_id_of_enum_variant(cx, layout.ty, &variant_name);
1762-
create_struct_stub(cx, layout.ty, &variant_name, unique_type_id, Some(containing_scope))
1786+
create_struct_stub(
1787+
cx,
1788+
layout.ty,
1789+
&variant_name,
1790+
unique_type_id,
1791+
Some(containing_scope),
1792+
// FIXME(tmandry): This doesn't seem to have any effect.
1793+
if variant.is_artificial() { DIFlags::FlagArtificial } else { DIFlags::FlagZero },
1794+
)
17631795
});
17641796

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

18251862
let containing_scope = get_namespace_for_item(cx, enum_def_id);
18261863
// FIXME: This should emit actual file metadata for the enum, but we
@@ -1955,7 +1992,7 @@ fn prepare_enum_metadata(
19551992
UNKNOWN_LINE_NUMBER,
19561993
layout.size.bits(),
19571994
layout.align.abi.bits() as u32,
1958-
DIFlags::FlagZero,
1995+
enum_flags,
19591996
None,
19601997
0, // RuntimeLang
19611998
unique_type_id_str.as_ptr().cast(),
@@ -2081,7 +2118,7 @@ fn prepare_enum_metadata(
20812118
UNKNOWN_LINE_NUMBER,
20822119
layout.size.bits(),
20832120
layout.align.abi.bits() as u32,
2084-
DIFlags::FlagZero,
2121+
enum_flags,
20852122
discriminator_metadata,
20862123
empty_array,
20872124
variant_part_unique_type_id_str.as_ptr().cast(),
@@ -2107,7 +2144,7 @@ fn prepare_enum_metadata(
21072144
UNKNOWN_LINE_NUMBER,
21082145
layout.size.bits(),
21092146
layout.align.abi.bits() as u32,
2110-
DIFlags::FlagZero,
2147+
enum_flags,
21112148
None,
21122149
type_array,
21132150
0,
@@ -2158,6 +2195,7 @@ fn composite_type_metadata(
21582195
composite_type_name,
21592196
composite_type_unique_id,
21602197
containing_scope,
2198+
DIFlags::FlagZero,
21612199
);
21622200
// ... and immediately create and add the member descriptions.
21632201
set_members_of_composite_type(cx, composite_type, composite_type_metadata, member_descriptions);
@@ -2259,6 +2297,7 @@ fn create_struct_stub(
22592297
struct_type_name: &str,
22602298
unique_type_id: UniqueTypeId,
22612299
containing_scope: Option<&'ll DIScope>,
2300+
flags: DIFlags,
22622301
) -> &'ll DICompositeType {
22632302
let (struct_size, struct_align) = cx.size_and_align_of(struct_type);
22642303

@@ -2280,7 +2319,7 @@ fn create_struct_stub(
22802319
UNKNOWN_LINE_NUMBER,
22812320
struct_size.bits(),
22822321
struct_align.bits() as u32,
2283-
DIFlags::FlagZero,
2322+
flags,
22842323
None,
22852324
empty_array,
22862325
0,

0 commit comments

Comments
 (0)