@@ -309,6 +309,7 @@ impl RecursiveTypeDescription<'ll, 'tcx> {
309
309
unfinished_type,
310
310
member_holding_stub,
311
311
member_descriptions,
312
+ None ,
312
313
) ;
313
314
MetadataCreationResult :: new ( metadata_stub, true )
314
315
}
@@ -1459,6 +1460,7 @@ struct EnumMemberDescriptionFactory<'ll, 'tcx> {
1459
1460
layout : TyAndLayout < ' tcx > ,
1460
1461
tag_type_metadata : Option < & ' ll DIType > ,
1461
1462
containing_scope : & ' ll DIScope ,
1463
+ common_members : Vec < Option < & ' ll DIType > > ,
1462
1464
span : Span ,
1463
1465
}
1464
1466
@@ -1493,10 +1495,6 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1493
1495
} else {
1494
1496
type_metadata ( cx, self . enum_type , self . span )
1495
1497
} ;
1496
- let flags = match self . enum_type . kind ( ) {
1497
- ty:: Generator ( ..) => DIFlags :: FlagArtificial ,
1498
- _ => DIFlags :: FlagZero ,
1499
- } ;
1500
1498
1501
1499
match self . layout . variants {
1502
1500
Variants :: Single { index } => {
@@ -1523,14 +1521,15 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1523
1521
self . enum_type ,
1524
1522
variant_type_metadata,
1525
1523
member_descriptions,
1524
+ Some ( & self . common_members ) ,
1526
1525
) ;
1527
1526
vec ! [ MemberDescription {
1528
1527
name: if fallback { String :: new( ) } else { variant_info. variant_name( ) } ,
1529
1528
type_metadata: variant_type_metadata,
1530
1529
offset: Size :: ZERO ,
1531
1530
size: self . layout. size,
1532
1531
align: self . layout. align. abi,
1533
- flags,
1532
+ flags: DIFlags :: FlagZero ,
1534
1533
discriminant: None ,
1535
1534
source_info: variant_info. source_info( cx) ,
1536
1535
} ]
@@ -1572,6 +1571,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1572
1571
self . enum_type ,
1573
1572
variant_type_metadata,
1574
1573
member_descriptions,
1574
+ Some ( & self . common_members ) ,
1575
1575
) ;
1576
1576
1577
1577
MemberDescription {
@@ -1584,7 +1584,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1584
1584
offset : Size :: ZERO ,
1585
1585
size : self . layout . size ,
1586
1586
align : self . layout . align . abi ,
1587
- flags,
1587
+ flags : DIFlags :: FlagZero ,
1588
1588
discriminant : Some (
1589
1589
self . layout . ty . discriminant_for_variant ( cx. tcx , i) . unwrap ( ) . val
1590
1590
as u64 ,
@@ -1621,6 +1621,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1621
1621
self . enum_type ,
1622
1622
variant_type_metadata,
1623
1623
variant_member_descriptions,
1624
+ Some ( & self . common_members ) ,
1624
1625
) ;
1625
1626
1626
1627
// Encode the information about the null variant in the union
@@ -1667,7 +1668,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1667
1668
offset: Size :: ZERO ,
1668
1669
size: variant. size,
1669
1670
align: variant. align. abi,
1670
- flags,
1671
+ flags: DIFlags :: FlagZero ,
1671
1672
discriminant: None ,
1672
1673
source_info: variant_info. source_info( cx) ,
1673
1674
} ]
@@ -1695,6 +1696,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1695
1696
self . enum_type ,
1696
1697
variant_type_metadata,
1697
1698
member_descriptions,
1699
+ Some ( & self . common_members ) ,
1698
1700
) ;
1699
1701
1700
1702
let niche_value = if i == dataful_variant {
@@ -1717,7 +1719,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1717
1719
offset : Size :: ZERO ,
1718
1720
size : self . layout . size ,
1719
1721
align : self . layout . align . abi ,
1720
- flags,
1722
+ flags : DIFlags :: FlagZero ,
1721
1723
discriminant : niche_value,
1722
1724
source_info : variant_info. source_info ( cx) ,
1723
1725
}
@@ -1849,13 +1851,6 @@ impl<'tcx> VariantInfo<'_, 'tcx> {
1849
1851
}
1850
1852
None
1851
1853
}
1852
-
1853
- fn is_artificial ( & self ) -> bool {
1854
- match self {
1855
- VariantInfo :: Generator { .. } => true ,
1856
- VariantInfo :: Adt ( ..) => false ,
1857
- }
1858
- }
1859
1854
}
1860
1855
1861
1856
/// Returns a tuple of (1) `type_metadata_stub` of the variant, (2) a
@@ -1881,8 +1876,7 @@ fn describe_enum_variant(
1881
1876
& variant_name,
1882
1877
unique_type_id,
1883
1878
Some ( containing_scope) ,
1884
- // FIXME(tmandry): This doesn't seem to have any effect.
1885
- if variant. is_artificial ( ) { DIFlags :: FlagArtificial } else { DIFlags :: FlagZero } ,
1879
+ DIFlags :: FlagZero ,
1886
1880
)
1887
1881
} ) ;
1888
1882
@@ -1945,11 +1939,6 @@ fn prepare_enum_metadata(
1945
1939
) -> RecursiveTypeDescription < ' ll , ' tcx > {
1946
1940
let tcx = cx. tcx ;
1947
1941
let enum_name = compute_debuginfo_type_name ( tcx, enum_type, false ) ;
1948
- // FIXME(tmandry): This doesn't seem to have any effect.
1949
- let enum_flags = match enum_type. kind ( ) {
1950
- ty:: Generator ( ..) => DIFlags :: FlagArtificial ,
1951
- _ => DIFlags :: FlagZero ,
1952
- } ;
1953
1942
1954
1943
let containing_scope = get_namespace_for_item ( cx, enum_def_id) ;
1955
1944
// FIXME: This should emit actual file metadata for the enum, but we
@@ -2082,7 +2071,7 @@ fn prepare_enum_metadata(
2082
2071
UNKNOWN_LINE_NUMBER ,
2083
2072
layout. size . bits ( ) ,
2084
2073
layout. align . abi . bits ( ) as u32 ,
2085
- enum_flags ,
2074
+ DIFlags :: FlagZero ,
2086
2075
None ,
2087
2076
0 , // RuntimeLang
2088
2077
unique_type_id_str. as_ptr ( ) . cast ( ) ,
@@ -2102,6 +2091,7 @@ fn prepare_enum_metadata(
2102
2091
layout,
2103
2092
tag_type_metadata : discriminant_type_metadata,
2104
2093
containing_scope,
2094
+ common_members : vec ! [ ] ,
2105
2095
span,
2106
2096
} ) ,
2107
2097
) ;
@@ -2171,7 +2161,7 @@ fn prepare_enum_metadata(
2171
2161
}
2172
2162
} ;
2173
2163
2174
- let mut outer_fields = match layout. variants {
2164
+ let outer_fields = match layout. variants {
2175
2165
Variants :: Single { .. } => vec ! [ ] ,
2176
2166
Variants :: Multiple { .. } => {
2177
2167
let tuple_mdf = TupleMemberDescriptionFactory {
@@ -2203,18 +2193,21 @@ fn prepare_enum_metadata(
2203
2193
UNKNOWN_LINE_NUMBER ,
2204
2194
layout. size . bits ( ) ,
2205
2195
layout. align . abi . bits ( ) as u32 ,
2206
- enum_flags ,
2196
+ DIFlags :: FlagZero ,
2207
2197
discriminator_metadata,
2208
2198
empty_array,
2209
2199
variant_part_unique_type_id_str. as_ptr ( ) . cast ( ) ,
2210
2200
variant_part_unique_type_id_str. len ( ) ,
2211
2201
)
2212
2202
} ;
2213
- outer_fields. push ( Some ( variant_part) ) ;
2214
2203
2215
2204
let struct_wrapper = {
2216
2205
// The variant part must be wrapped in a struct according to DWARF.
2217
- let type_array = create_DIArray ( DIB ( cx) , & outer_fields) ;
2206
+ // All fields except the discriminant (including `outer_fields`)
2207
+ // should be put into structures inside the variant part, which gives
2208
+ // an equivalent layout but offers us much better integration with
2209
+ // debuggers.
2210
+ let type_array = create_DIArray ( DIB ( cx) , & [ Some ( variant_part) ] ) ;
2218
2211
2219
2212
let type_map = debug_context ( cx) . type_map . borrow ( ) ;
2220
2213
let unique_type_id_str = type_map. get_unique_type_id_as_string ( unique_type_id) ;
@@ -2229,7 +2222,7 @@ fn prepare_enum_metadata(
2229
2222
UNKNOWN_LINE_NUMBER ,
2230
2223
layout. size . bits ( ) ,
2231
2224
layout. align . abi . bits ( ) as u32 ,
2232
- enum_flags ,
2225
+ DIFlags :: FlagZero ,
2233
2226
None ,
2234
2227
type_array,
2235
2228
0 ,
@@ -2251,6 +2244,7 @@ fn prepare_enum_metadata(
2251
2244
layout,
2252
2245
tag_type_metadata : None ,
2253
2246
containing_scope,
2247
+ common_members : outer_fields,
2254
2248
span,
2255
2249
} ) ,
2256
2250
)
@@ -2283,7 +2277,13 @@ fn composite_type_metadata(
2283
2277
DIFlags :: FlagZero ,
2284
2278
) ;
2285
2279
// ... and immediately create and add the member descriptions.
2286
- set_members_of_composite_type ( cx, composite_type, composite_type_metadata, member_descriptions) ;
2280
+ set_members_of_composite_type (
2281
+ cx,
2282
+ composite_type,
2283
+ composite_type_metadata,
2284
+ member_descriptions,
2285
+ None ,
2286
+ ) ;
2287
2287
2288
2288
composite_type_metadata
2289
2289
}
@@ -2293,6 +2293,7 @@ fn set_members_of_composite_type(
2293
2293
composite_type : Ty < ' tcx > ,
2294
2294
composite_type_metadata : & ' ll DICompositeType ,
2295
2295
member_descriptions : Vec < MemberDescription < ' ll > > ,
2296
+ common_members : Option < & Vec < Option < & ' ll DIType > > > ,
2296
2297
) {
2297
2298
// In some rare cases LLVM metadata uniquing would lead to an existing type
2298
2299
// description being used instead of a new one created in
@@ -2311,10 +2312,13 @@ fn set_members_of_composite_type(
2311
2312
}
2312
2313
}
2313
2314
2314
- let member_metadata: Vec < _ > = member_descriptions
2315
+ let mut member_metadata: Vec < _ > = member_descriptions
2315
2316
. into_iter ( )
2316
2317
. map ( |desc| Some ( desc. into_metadata ( cx, composite_type_metadata) ) )
2317
2318
. collect ( ) ;
2319
+ if let Some ( other_members) = common_members {
2320
+ member_metadata. extend ( other_members. iter ( ) ) ;
2321
+ }
2318
2322
2319
2323
let type_params = compute_type_parameters ( cx, composite_type) ;
2320
2324
unsafe {
0 commit comments