Skip to content

Commit eb726c0

Browse files
committed
Add Artificial flag to generator variants
1 parent a5a831f commit eb726c0

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
}
@@ -1743,6 +1759,14 @@ impl<'tcx> VariantInfo<'_, 'tcx> {
17431759
}
17441760
None
17451761
}
1762+
1763+
#[allow(dead_code)]
1764+
fn is_artificial(&self) -> bool {
1765+
match self {
1766+
VariantInfo::Generator { .. } => true,
1767+
VariantInfo::Adt(..) => false,
1768+
}
1769+
}
17461770
}
17471771

17481772
/// Returns a tuple of (1) `type_metadata_stub` of the variant, (2) a
@@ -1762,7 +1786,15 @@ fn describe_enum_variant(
17621786
.type_map
17631787
.borrow_mut()
17641788
.get_unique_type_id_of_enum_variant(cx, layout.ty, &variant_name);
1765-
create_struct_stub(cx, layout.ty, &variant_name, unique_type_id, Some(containing_scope))
1789+
create_struct_stub(
1790+
cx,
1791+
layout.ty,
1792+
&variant_name,
1793+
unique_type_id,
1794+
Some(containing_scope),
1795+
// FIXME(tmandry): This doesn't seem to have any effect.
1796+
if variant.is_artificial() { DIFlags::FlagArtificial } else { DIFlags::FlagZero },
1797+
)
17661798
});
17671799

17681800
// Build an array of (field name, field type) pairs to be captured in the factory closure.
@@ -1824,6 +1856,11 @@ fn prepare_enum_metadata(
18241856
) -> RecursiveTypeDescription<'ll, 'tcx> {
18251857
let tcx = cx.tcx;
18261858
let enum_name = compute_debuginfo_type_name(tcx, enum_type, false);
1859+
// FIXME(tmandry): This doesn't seem to have any effect.
1860+
let enum_flags = match enum_type.kind {
1861+
ty::Generator(..) => DIFlags::FlagArtificial,
1862+
_ => DIFlags::FlagZero,
1863+
};
18271864

18281865
let containing_scope = get_namespace_for_item(cx, enum_def_id);
18291866
// FIXME: This should emit actual file metadata for the enum, but we
@@ -1958,7 +1995,7 @@ fn prepare_enum_metadata(
19581995
UNKNOWN_LINE_NUMBER,
19591996
layout.size.bits(),
19601997
layout.align.abi.bits() as u32,
1961-
DIFlags::FlagZero,
1998+
enum_flags,
19621999
None,
19632000
0, // RuntimeLang
19642001
unique_type_id_str.as_ptr().cast(),
@@ -2079,7 +2116,7 @@ fn prepare_enum_metadata(
20792116
UNKNOWN_LINE_NUMBER,
20802117
layout.size.bits(),
20812118
layout.align.abi.bits() as u32,
2082-
DIFlags::FlagZero,
2119+
enum_flags,
20832120
discriminator_metadata,
20842121
empty_array,
20852122
variant_part_unique_type_id_str.as_ptr().cast(),
@@ -2105,7 +2142,7 @@ fn prepare_enum_metadata(
21052142
UNKNOWN_LINE_NUMBER,
21062143
layout.size.bits(),
21072144
layout.align.abi.bits() as u32,
2108-
DIFlags::FlagZero,
2145+
enum_flags,
21092146
None,
21102147
type_array,
21112148
0,
@@ -2156,6 +2193,7 @@ fn composite_type_metadata(
21562193
composite_type_name,
21572194
composite_type_unique_id,
21582195
containing_scope,
2196+
DIFlags::FlagZero,
21592197
);
21602198
// ... and immediately create and add the member descriptions.
21612199
set_members_of_composite_type(cx, composite_type, composite_type_metadata, member_descriptions);
@@ -2257,6 +2295,7 @@ fn create_struct_stub(
22572295
struct_type_name: &str,
22582296
unique_type_id: UniqueTypeId,
22592297
containing_scope: Option<&'ll DIScope>,
2298+
flags: DIFlags,
22602299
) -> &'ll DICompositeType {
22612300
let (struct_size, struct_align) = cx.size_and_align_of(struct_type);
22622301

@@ -2278,7 +2317,7 @@ fn create_struct_stub(
22782317
UNKNOWN_LINE_NUMBER,
22792318
struct_size.bits(),
22802319
struct_align.bits() as u32,
2281-
DIFlags::FlagZero,
2320+
flags,
22822321
None,
22832322
empty_array,
22842323
0,

0 commit comments

Comments
 (0)