@@ -309,6 +309,7 @@ impl RecursiveTypeDescription<'ll, 'tcx> {
309309 unfinished_type,
310310 member_holding_stub,
311311 member_descriptions,
312+ None ,
312313 ) ;
313314 MetadataCreationResult :: new ( metadata_stub, true )
314315 }
@@ -1459,6 +1460,7 @@ struct EnumMemberDescriptionFactory<'ll, 'tcx> {
14591460 layout : TyAndLayout < ' tcx > ,
14601461 tag_type_metadata : Option < & ' ll DIType > ,
14611462 containing_scope : & ' ll DIScope ,
1463+ common_members : Vec < Option < & ' ll DIType > > ,
14621464 span : Span ,
14631465}
14641466
@@ -1523,6 +1525,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15231525 self . enum_type ,
15241526 variant_type_metadata,
15251527 member_descriptions,
1528+ Some ( & self . common_members ) ,
15261529 ) ;
15271530 vec ! [ MemberDescription {
15281531 name: if fallback { String :: new( ) } else { variant_info. variant_name( ) } ,
@@ -1572,6 +1575,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15721575 self . enum_type ,
15731576 variant_type_metadata,
15741577 member_descriptions,
1578+ Some ( & self . common_members ) ,
15751579 ) ;
15761580
15771581 MemberDescription {
@@ -1621,6 +1625,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
16211625 self . enum_type ,
16221626 variant_type_metadata,
16231627 variant_member_descriptions,
1628+ Some ( & self . common_members ) ,
16241629 ) ;
16251630
16261631 // Encode the information about the null variant in the union
@@ -1695,6 +1700,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
16951700 self . enum_type ,
16961701 variant_type_metadata,
16971702 member_descriptions,
1703+ Some ( & self . common_members ) ,
16981704 ) ;
16991705
17001706 let niche_value = if i == dataful_variant {
@@ -2102,6 +2108,7 @@ fn prepare_enum_metadata(
21022108 layout,
21032109 tag_type_metadata : discriminant_type_metadata,
21042110 containing_scope,
2111+ common_members : vec ! [ ] ,
21052112 span,
21062113 } ) ,
21072114 ) ;
@@ -2171,7 +2178,7 @@ fn prepare_enum_metadata(
21712178 }
21722179 } ;
21732180
2174- let mut outer_fields = match layout. variants {
2181+ let outer_fields = match layout. variants {
21752182 Variants :: Single { .. } => vec ! [ ] ,
21762183 Variants :: Multiple { .. } => {
21772184 let tuple_mdf = TupleMemberDescriptionFactory {
@@ -2210,11 +2217,14 @@ fn prepare_enum_metadata(
22102217 variant_part_unique_type_id_str. len ( ) ,
22112218 )
22122219 } ;
2213- outer_fields. push ( Some ( variant_part) ) ;
22142220
22152221 let struct_wrapper = {
22162222 // The variant part must be wrapped in a struct according to DWARF.
2217- let type_array = create_DIArray ( DIB ( cx) , & outer_fields) ;
2223+ // All fields except the discriminant (including `outer_fields`)
2224+ // should be put into structures inside the variant part, which gives
2225+ // an equivalent layout but offers us much better integration with
2226+ // debuggers.
2227+ let type_array = create_DIArray ( DIB ( cx) , & [ Some ( variant_part) ] ) ;
22182228
22192229 let type_map = debug_context ( cx) . type_map . borrow ( ) ;
22202230 let unique_type_id_str = type_map. get_unique_type_id_as_string ( unique_type_id) ;
@@ -2251,6 +2261,7 @@ fn prepare_enum_metadata(
22512261 layout,
22522262 tag_type_metadata : None ,
22532263 containing_scope,
2264+ common_members : outer_fields,
22542265 span,
22552266 } ) ,
22562267 )
@@ -2283,7 +2294,13 @@ fn composite_type_metadata(
22832294 DIFlags :: FlagZero ,
22842295 ) ;
22852296 // ... and immediately create and add the member descriptions.
2286- set_members_of_composite_type ( cx, composite_type, composite_type_metadata, member_descriptions) ;
2297+ set_members_of_composite_type (
2298+ cx,
2299+ composite_type,
2300+ composite_type_metadata,
2301+ member_descriptions,
2302+ None ,
2303+ ) ;
22872304
22882305 composite_type_metadata
22892306}
@@ -2293,6 +2310,7 @@ fn set_members_of_composite_type(
22932310 composite_type : Ty < ' tcx > ,
22942311 composite_type_metadata : & ' ll DICompositeType ,
22952312 member_descriptions : Vec < MemberDescription < ' ll > > ,
2313+ common_members : Option < & Vec < Option < & ' ll DIType > > > ,
22962314) {
22972315 // In some rare cases LLVM metadata uniquing would lead to an existing type
22982316 // description being used instead of a new one created in
@@ -2311,10 +2329,13 @@ fn set_members_of_composite_type(
23112329 }
23122330 }
23132331
2314- let member_metadata: Vec < _ > = member_descriptions
2332+ let mut member_metadata: Vec < _ > = member_descriptions
23152333 . into_iter ( )
23162334 . map ( |desc| Some ( desc. into_metadata ( cx, composite_type_metadata) ) )
23172335 . collect ( ) ;
2336+ if let Some ( other_members) = common_members {
2337+ member_metadata. extend ( other_members. iter ( ) ) ;
2338+ }
23182339
23192340 let type_params = compute_type_parameters ( cx, composite_type) ;
23202341 unsafe {
0 commit comments