Skip to content

Commit 2d652d9

Browse files
committed
Add generator-debug test for MSVC
..which doesn't use variant types.
1 parent 477ecc5 commit 2d652d9

File tree

2 files changed

+98
-8
lines changed

2 files changed

+98
-8
lines changed

src/librustc_codegen_llvm/debuginfo/metadata.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -1652,23 +1652,25 @@ impl VariantMemberDescriptionFactory<'ll, 'tcx> {
16521652
.iter()
16531653
.enumerate()
16541654
.map(|(i, &(ref name, ty))| {
1655+
// Discriminant is always the first field of our variant
1656+
// when using the enum fallback.
1657+
let is_artificial_discr = use_enum_fallback(cx) && i == 0;
16551658
let (size, align) = cx.size_and_align_of(ty);
16561659
MemberDescription {
16571660
name: name.to_string(),
1658-
type_metadata: if use_enum_fallback(cx) {
1659-
match self.tag_type_metadata {
1660-
// Discriminant is always the first field of our variant
1661-
// when using the enum fallback.
1662-
Some(metadata) if i == 0 => metadata,
1663-
_ => type_metadata(cx, ty, self.span),
1664-
}
1661+
type_metadata: if is_artificial_discr {
1662+
self.tag_type_metadata.unwrap_or_else(|| type_metadata(cx, ty, self.span))
16651663
} else {
16661664
type_metadata(cx, ty, self.span)
16671665
},
16681666
offset: self.offsets[i],
16691667
size,
16701668
align,
1671-
flags: DIFlags::FlagZero,
1669+
flags: if is_artificial_discr {
1670+
DIFlags::FlagArtificial
1671+
} else {
1672+
DIFlags::FlagZero
1673+
},
16721674
discriminant: None,
16731675
source_info: None,
16741676
}
+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Verify debuginfo for generators:
2+
// - Each variant points to the file and line of its yield point
3+
// - The generator types and variants are marked artificial
4+
// - Captured vars from the source are not marked artificial
5+
//
6+
// ignore-tidy-linelength
7+
// compile-flags: -C debuginfo=2 --edition=2018
8+
// only-msvc
9+
10+
#![feature(generators, generator_trait)]
11+
use std::ops::Generator;
12+
13+
fn generator_test() -> impl Generator<Yield = i32, Return = ()> {
14+
|| {
15+
yield 0;
16+
let s = String::from("foo");
17+
yield 1;
18+
}
19+
}
20+
21+
async fn foo() {}
22+
async fn async_fn_test() {
23+
foo().await;
24+
let s = String::from("foo");
25+
foo().await;
26+
}
27+
28+
// FIXME: We need "checksum" to prevent matching with the wrong (duplicate) file
29+
// metadata, even when -C codegen-units=1.
30+
// CHECK-DAG: [[FILE:!.*]] = !DIFile(filename: "{{.*}}generator-debug-msvc.rs", {{.*}}, checksum:
31+
32+
// CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "generator_test"
33+
// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[GEN_FN]],
34+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
35+
// For brevity, we just check the struct name and members of the last variant.
36+
// CHECK-SAME: file: [[FILE]], line: 14,
37+
// CHECK-SAME: flags: DIFlagArtificial
38+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
39+
// CHECK-SAME: file: [[FILE]], line: 18,
40+
// CHECK-SAME: flags: DIFlagArtificial
41+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
42+
// CHECK-SAME: file: [[FILE]], line: 18,
43+
// CHECK-SAME: flags: DIFlagArtificial
44+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
45+
// CHECK-SAME: file: [[FILE]], line: 15,
46+
// CHECK-SAME: flags: DIFlagArtificial
47+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
48+
// CHECK-SAME: file: [[FILE]], line: 17,
49+
// CHECK-SAME: baseType: [[VARIANT:![0-9]*]]
50+
// CHECK-SAME: flags: DIFlagArtificial
51+
// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN_FN]],
52+
// CHECK-SAME: flags: DIFlagArtificial
53+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "RUST$ENUM$DISR", scope: [[S1]],
54+
// CHECK-SAME: flags: DIFlagArtificial
55+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]]
56+
// CHECK-NOT: flags: DIFlagArtificial
57+
// CHECK-SAME: )
58+
59+
// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator-0", scope: [[ASYNC_FN:![0-9]*]], {{.*}}flags: DIFlagArtificial
60+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
61+
// For brevity, we just check the struct name and members of the last variant.
62+
// CHECK-SAME: file: [[FILE]], line: 22,
63+
// CHECK-SAME: flags: DIFlagArtificial
64+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
65+
// CHECK-SAME: file: [[FILE]], line: 26,
66+
// CHECK-SAME: flags: DIFlagArtificial
67+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
68+
// CHECK-SAME: file: [[FILE]], line: 26,
69+
// CHECK-SAME: flags: DIFlagArtificial
70+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
71+
// CHECK-SAME: file: [[FILE]], line: 23,
72+
// CHECK-SAME: flags: DIFlagArtificial
73+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, scope: [[GEN]],
74+
// CHECK-SAME: file: [[FILE]], line: 25,
75+
// CHECK-SAME: baseType: [[VARIANT:![0-9]*]]
76+
// CHECK-SAME: flags: DIFlagArtificial
77+
// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[ASYNC_FN]],
78+
// CHECK-SAME: flags: DIFlagArtificial
79+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "RUST$ENUM$DISR", scope: [[S1]],
80+
// CHECK-SAME: flags: DIFlagArtificial
81+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]]
82+
// CHECK-NOT: flags: DIFlagArtificial
83+
// CHECK-SAME: )
84+
85+
fn main() {
86+
let _dummy = generator_test();
87+
let _dummy = async_fn_test();
88+
}

0 commit comments

Comments
 (0)