@@ -351,14 +351,15 @@ impl<'ll, 'tcx> RecursiveTypeDescription<'ll, 'tcx> {
351351
352352 // ... then create the member descriptions ...
353353 let member_descriptions = member_description_factory. create_member_descriptions ( cx) ;
354+ let type_params = compute_type_parameters ( cx, unfinished_type) ;
354355
355356 // ... and attach them to the stub to complete it.
356357 set_members_of_composite_type (
357358 cx,
358- unfinished_type,
359359 member_holding_stub,
360360 member_descriptions,
361361 None ,
362+ type_params,
362363 ) ;
363364 MetadataCreationResult :: new ( metadata_stub, true )
364365 }
@@ -983,7 +984,17 @@ fn foreign_type_metadata<'ll, 'tcx>(
983984 debug ! ( "foreign_type_metadata: {:?}" , t) ;
984985
985986 let name = compute_debuginfo_type_name ( cx. tcx , t, false ) ;
986- create_struct_stub ( cx, t, & name, unique_type_id, NO_SCOPE_METADATA , DIFlags :: FlagZero )
987+ let ( size, align) = cx. size_and_align_of ( t) ;
988+ create_struct_stub (
989+ cx,
990+ size,
991+ align,
992+ & name,
993+ unique_type_id,
994+ NO_SCOPE_METADATA ,
995+ DIFlags :: FlagZero ,
996+ None ,
997+ )
987998}
988999
9891000fn param_type_metadata < ' ll , ' tcx > ( cx : & CodegenCx < ' ll , ' tcx > , t : Ty < ' tcx > ) -> & ' ll DIType {
@@ -1299,14 +1310,17 @@ fn prepare_struct_metadata<'ll, 'tcx>(
12991310 } ;
13001311
13011312 let containing_scope = get_namespace_for_item ( cx, struct_def_id) ;
1313+ let ( size, align) = cx. size_and_align_of ( struct_type) ;
13021314
13031315 let struct_metadata_stub = create_struct_stub (
13041316 cx,
1305- struct_type,
1317+ size,
1318+ align,
13061319 & struct_name,
13071320 unique_type_id,
13081321 Some ( containing_scope) ,
13091322 DIFlags :: FlagZero ,
1323+ None ,
13101324 ) ;
13111325
13121326 create_and_register_recursive_type_forward_declaration (
@@ -1398,15 +1412,18 @@ fn prepare_tuple_metadata<'ll, 'tcx>(
13981412 unique_type_id : UniqueTypeId ,
13991413 containing_scope : Option < & ' ll DIScope > ,
14001414) -> RecursiveTypeDescription < ' ll , ' tcx > {
1415+ let ( size, align) = cx. size_and_align_of ( tuple_type) ;
14011416 let tuple_name = compute_debuginfo_type_name ( cx. tcx , tuple_type, false ) ;
14021417
14031418 let struct_stub = create_struct_stub (
14041419 cx,
1405- tuple_type,
1420+ size,
1421+ align,
14061422 & tuple_name[ ..] ,
14071423 unique_type_id,
14081424 containing_scope,
14091425 DIFlags :: FlagZero ,
1426+ None ,
14101427 ) ;
14111428
14121429 create_and_register_recursive_type_forward_declaration (
@@ -1581,13 +1598,14 @@ impl<'ll, 'tcx> EnumMemberDescriptionFactory<'ll, 'tcx> {
15811598 describe_enum_variant ( cx, self . layout , variant_info, self_metadata) ;
15821599
15831600 let member_descriptions = member_description_factory. create_member_descriptions ( cx) ;
1601+ let type_params = compute_type_parameters ( cx, self . enum_type ) ;
15841602
15851603 set_members_of_composite_type (
15861604 cx,
1587- self . enum_type ,
15881605 variant_type_metadata,
15891606 member_descriptions,
15901607 Some ( & self . common_members ) ,
1608+ type_params,
15911609 ) ;
15921610 vec ! [ MemberDescription {
15931611 name: variant_info. variant_name( ) ,
@@ -1648,13 +1666,14 @@ impl<'ll, 'tcx> EnumMemberDescriptionFactory<'ll, 'tcx> {
16481666
16491667 let member_descriptions =
16501668 member_desc_factory. create_member_descriptions ( cx) ;
1669+ let type_params = compute_type_parameters ( cx, self . enum_type ) ;
16511670
16521671 set_members_of_composite_type (
16531672 cx,
1654- self . enum_type ,
16551673 variant_type_metadata,
16561674 member_descriptions,
16571675 Some ( & self . common_members ) ,
1676+ type_params,
16581677 ) ;
16591678
16601679 MemberDescription {
@@ -1777,13 +1796,14 @@ impl<'ll, 'tcx> EnumMemberDescriptionFactory<'ll, 'tcx> {
17771796 ) ;
17781797
17791798 let member_descriptions = member_desc_factory. create_member_descriptions ( cx) ;
1799+ let type_params = compute_type_parameters ( cx, self . enum_type ) ;
17801800
17811801 set_members_of_composite_type (
17821802 cx,
1783- self . enum_type ,
17841803 variant_type_metadata,
17851804 member_descriptions,
17861805 Some ( & self . common_members ) ,
1806+ type_params,
17871807 ) ;
17881808
17891809 let ( size, align) =
@@ -1823,13 +1843,14 @@ impl<'ll, 'tcx> EnumMemberDescriptionFactory<'ll, 'tcx> {
18231843
18241844 let member_descriptions =
18251845 member_desc_factory. create_member_descriptions ( cx) ;
1846+ let type_params = compute_type_parameters ( cx, self . enum_type ) ;
18261847
18271848 set_members_of_composite_type (
18281849 cx,
1829- self . enum_type ,
18301850 variant_type_metadata,
18311851 member_descriptions,
18321852 Some ( & self . common_members ) ,
1853+ type_params,
18331854 ) ;
18341855
18351856 let niche_value = calculate_niche_value ( i) ;
@@ -1965,13 +1986,18 @@ fn describe_enum_variant<'ll, 'tcx>(
19651986 . type_map
19661987 . borrow_mut ( )
19671988 . get_unique_type_id_of_enum_variant ( cx, layout. ty , variant_name) ;
1989+
1990+ let ( size, align) = cx. size_and_align_of ( layout. ty ) ;
1991+
19681992 create_struct_stub (
19691993 cx,
1970- layout. ty ,
1994+ size,
1995+ align,
19711996 variant_name,
19721997 unique_type_id,
19731998 Some ( containing_scope) ,
19741999 DIFlags :: FlagZero ,
2000+ None ,
19752001 )
19762002 } ) ;
19772003
@@ -2308,33 +2334,38 @@ fn composite_type_metadata<'ll, 'tcx>(
23082334 member_descriptions : Vec < MemberDescription < ' ll > > ,
23092335 containing_scope : Option < & ' ll DIScope > ,
23102336) -> & ' ll DICompositeType {
2337+ let ( size, align) = cx. size_and_align_of ( composite_type) ;
2338+
23112339 // Create the (empty) struct metadata node ...
23122340 let composite_type_metadata = create_struct_stub (
23132341 cx,
2314- composite_type,
2342+ size,
2343+ align,
23152344 composite_type_name,
23162345 composite_type_unique_id,
23172346 containing_scope,
23182347 DIFlags :: FlagZero ,
2348+ None ,
23192349 ) ;
2350+
23202351 // ... and immediately create and add the member descriptions.
23212352 set_members_of_composite_type (
23222353 cx,
2323- composite_type,
23242354 composite_type_metadata,
23252355 member_descriptions,
23262356 None ,
2357+ compute_type_parameters ( cx, composite_type) ,
23272358 ) ;
23282359
23292360 composite_type_metadata
23302361}
23312362
23322363fn set_members_of_composite_type < ' ll , ' tcx > (
23332364 cx : & CodegenCx < ' ll , ' tcx > ,
2334- composite_type : Ty < ' tcx > ,
23352365 composite_type_metadata : & ' ll DICompositeType ,
23362366 member_descriptions : Vec < MemberDescription < ' ll > > ,
23372367 common_members : Option < & Vec < Option < & ' ll DIType > > > ,
2368+ type_params : & ' ll DIArray ,
23382369) {
23392370 // In some rare cases LLVM metadata uniquing would lead to an existing type
23402371 // description being used instead of a new one created in
@@ -2361,13 +2392,12 @@ fn set_members_of_composite_type<'ll, 'tcx>(
23612392 member_metadata. extend ( other_members. iter ( ) ) ;
23622393 }
23632394
2364- let type_params = compute_type_parameters ( cx, composite_type) ;
23652395 unsafe {
2366- let type_array = create_DIArray ( DIB ( cx) , & member_metadata) ;
2396+ let field_array = create_DIArray ( DIB ( cx) , & member_metadata) ;
23672397 llvm:: LLVMRustDICompositeTypeReplaceArrays (
23682398 DIB ( cx) ,
23692399 composite_type_metadata,
2370- Some ( type_array ) ,
2400+ Some ( field_array ) ,
23712401 Some ( type_params) ,
23722402 ) ;
23732403 }
@@ -2420,14 +2450,14 @@ fn compute_type_parameters<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, ty: Ty<'tcx>) -
24202450/// with `set_members_of_composite_type()`.
24212451fn create_struct_stub < ' ll , ' tcx > (
24222452 cx : & CodegenCx < ' ll , ' tcx > ,
2423- struct_type : Ty < ' tcx > ,
2424- struct_type_name : & str ,
2453+ size : Size ,
2454+ align : Align ,
2455+ type_name : & str ,
24252456 unique_type_id : UniqueTypeId ,
24262457 containing_scope : Option < & ' ll DIScope > ,
24272458 flags : DIFlags ,
2459+ vtable_holder : Option < & ' ll DIType > ,
24282460) -> & ' ll DICompositeType {
2429- let ( struct_size, struct_align) = cx. size_and_align_of ( struct_type) ;
2430-
24312461 let type_map = debug_context ( cx) . type_map . borrow ( ) ;
24322462 let unique_type_id = type_map. get_unique_type_id_as_string ( unique_type_id) ;
24332463
@@ -2440,17 +2470,17 @@ fn create_struct_stub<'ll, 'tcx>(
24402470 llvm:: LLVMRustDIBuilderCreateStructType (
24412471 DIB ( cx) ,
24422472 containing_scope,
2443- struct_type_name . as_ptr ( ) . cast ( ) ,
2444- struct_type_name . len ( ) ,
2473+ type_name . as_ptr ( ) . cast ( ) ,
2474+ type_name . len ( ) ,
24452475 unknown_file_metadata ( cx) ,
24462476 UNKNOWN_LINE_NUMBER ,
2447- struct_size . bits ( ) ,
2448- struct_align . bits ( ) as u32 ,
2477+ size . bits ( ) ,
2478+ align . bits ( ) as u32 ,
24492479 flags,
24502480 None ,
24512481 empty_array,
24522482 0 ,
2453- None ,
2483+ vtable_holder ,
24542484 unique_type_id. as_ptr ( ) . cast ( ) ,
24552485 unique_type_id. len ( ) ,
24562486 )
0 commit comments