@@ -188,6 +188,17 @@ impl TypeMap<'ll, 'tcx> {
188
188
let interner_key = self . unique_id_interner . intern ( & enum_variant_type_id) ;
189
189
UniqueTypeId ( interner_key)
190
190
}
191
+
192
+ // Get the unique type id string for an enum variant part.
193
+ // Variant parts are not types and shouldn't really have their own id,
194
+ // but it makes set_members_of_composite_type() simpler.
195
+ fn get_unique_type_id_str_of_enum_variant_part < ' a > ( & mut self ,
196
+ enum_type_id : UniqueTypeId ) -> & str {
197
+ let variant_part_type_id = format ! ( "{}_variant_part" ,
198
+ self . get_unique_type_id_as_string( enum_type_id) ) ;
199
+ let interner_key = self . unique_id_interner . intern ( & variant_part_type_id) ;
200
+ self . unique_id_interner . get ( interner_key)
201
+ }
191
202
}
192
203
193
204
// A description of some recursive type. It can either be already finished (as
@@ -266,7 +277,6 @@ impl RecursiveTypeDescription<'ll, 'tcx> {
266
277
// ... and attach them to the stub to complete it.
267
278
set_members_of_composite_type ( cx,
268
279
unfinished_type,
269
- metadata_stub,
270
280
member_holding_stub,
271
281
member_descriptions) ;
272
282
return MetadataCreationResult :: new ( metadata_stub, true ) ;
@@ -1216,7 +1226,6 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1216
1226
set_members_of_composite_type ( cx,
1217
1227
self . enum_type ,
1218
1228
variant_type_metadata,
1219
- variant_type_metadata,
1220
1229
member_descriptions) ;
1221
1230
vec ! [
1222
1231
MemberDescription {
@@ -1258,7 +1267,6 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1258
1267
set_members_of_composite_type ( cx,
1259
1268
self . enum_type ,
1260
1269
variant_type_metadata,
1261
- variant_type_metadata,
1262
1270
member_descriptions) ;
1263
1271
MemberDescription {
1264
1272
name : if fallback {
@@ -1301,7 +1309,6 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1301
1309
set_members_of_composite_type ( cx,
1302
1310
self . enum_type ,
1303
1311
variant_type_metadata,
1304
- variant_type_metadata,
1305
1312
variant_member_descriptions) ;
1306
1313
1307
1314
// Encode the information about the null variant in the union
@@ -1362,7 +1369,6 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1362
1369
set_members_of_composite_type ( cx,
1363
1370
self . enum_type ,
1364
1371
variant_type_metadata,
1365
- variant_type_metadata,
1366
1372
member_descriptions) ;
1367
1373
1368
1374
let niche_value = if i == dataful_variant {
@@ -1691,6 +1697,11 @@ fn prepare_enum_metadata(
1691
1697
} ,
1692
1698
} ;
1693
1699
1700
+ let variant_part_unique_type_id_str = SmallCStr :: new (
1701
+ debug_context ( cx) . type_map
1702
+ . borrow_mut ( )
1703
+ . get_unique_type_id_str_of_enum_variant_part ( unique_type_id)
1704
+ ) ;
1694
1705
let empty_array = create_DIArray ( DIB ( cx) , & [ ] ) ;
1695
1706
let variant_part = unsafe {
1696
1707
llvm:: LLVMRustDIBuilderCreateVariantPart (
@@ -1703,7 +1714,8 @@ fn prepare_enum_metadata(
1703
1714
layout. align . abi . bits ( ) as u32 ,
1704
1715
DIFlags :: FlagZero ,
1705
1716
discriminator_metadata,
1706
- empty_array)
1717
+ empty_array,
1718
+ variant_part_unique_type_id_str. as_ptr ( ) )
1707
1719
} ;
1708
1720
1709
1721
// The variant part must be wrapped in a struct according to DWARF.
@@ -1774,16 +1786,14 @@ fn composite_type_metadata(
1774
1786
set_members_of_composite_type ( cx,
1775
1787
composite_type,
1776
1788
composite_type_metadata,
1777
- composite_type_metadata,
1778
1789
member_descriptions) ;
1779
1790
1780
1791
composite_type_metadata
1781
1792
}
1782
1793
1783
1794
fn set_members_of_composite_type ( cx : & CodegenCx < ' ll , ' tcx > ,
1784
1795
composite_type : Ty < ' tcx > ,
1785
- metadata_stub : & ' ll DICompositeType ,
1786
- member_holding_stub : & ' ll DICompositeType ,
1796
+ composite_type_metadata : & ' ll DICompositeType ,
1787
1797
member_descriptions : Vec < MemberDescription < ' ll > > ) {
1788
1798
// In some rare cases LLVM metadata uniquing would lead to an existing type
1789
1799
// description being used instead of a new one created in
@@ -1794,11 +1804,11 @@ fn set_members_of_composite_type(cx: &CodegenCx<'ll, 'tcx>,
1794
1804
{
1795
1805
let mut composite_types_completed =
1796
1806
debug_context ( cx) . composite_types_completed . borrow_mut ( ) ;
1797
- if composite_types_completed. contains ( & metadata_stub ) {
1807
+ if composite_types_completed. contains ( & composite_type_metadata ) {
1798
1808
bug ! ( "debuginfo::set_members_of_composite_type() - \
1799
1809
Already completed forward declaration re-encountered.") ;
1800
1810
} else {
1801
- composite_types_completed. insert ( metadata_stub ) ;
1811
+ composite_types_completed. insert ( composite_type_metadata ) ;
1802
1812
}
1803
1813
}
1804
1814
@@ -1809,7 +1819,7 @@ fn set_members_of_composite_type(cx: &CodegenCx<'ll, 'tcx>,
1809
1819
unsafe {
1810
1820
Some ( llvm:: LLVMRustDIBuilderCreateVariantMemberType (
1811
1821
DIB ( cx) ,
1812
- member_holding_stub ,
1822
+ composite_type_metadata ,
1813
1823
member_name. as_ptr ( ) ,
1814
1824
unknown_file_metadata ( cx) ,
1815
1825
UNKNOWN_LINE_NUMBER ,
@@ -1830,7 +1840,7 @@ fn set_members_of_composite_type(cx: &CodegenCx<'ll, 'tcx>,
1830
1840
unsafe {
1831
1841
let type_array = create_DIArray ( DIB ( cx) , & member_metadata[ ..] ) ;
1832
1842
llvm:: LLVMRustDICompositeTypeReplaceArrays (
1833
- DIB ( cx) , member_holding_stub , Some ( type_array) , type_params) ;
1843
+ DIB ( cx) , composite_type_metadata , Some ( type_array) , type_params) ;
1834
1844
}
1835
1845
}
1836
1846
0 commit comments