@@ -392,6 +392,7 @@ fn vec_slice_metadata(
392
392
align: pointer_align,
393
393
flags: DIFlags :: FlagZero ,
394
394
discriminant: None ,
395
+ source_info: None ,
395
396
} ,
396
397
MemberDescription {
397
398
name: "length" . to_owned( ) ,
@@ -401,6 +402,7 @@ fn vec_slice_metadata(
401
402
align: usize_align,
402
403
flags: DIFlags :: FlagZero ,
403
404
discriminant: None ,
405
+ source_info: None ,
404
406
} ,
405
407
] ;
406
408
@@ -508,6 +510,7 @@ fn trait_pointer_metadata(
508
510
align: data_ptr_field. align. abi,
509
511
flags: DIFlags :: FlagArtificial ,
510
512
discriminant: None ,
513
+ source_info: None ,
511
514
} ,
512
515
MemberDescription {
513
516
name: "vtable" . to_owned( ) ,
@@ -517,6 +520,7 @@ fn trait_pointer_metadata(
517
520
align: vtable_field. align. abi,
518
521
flags: DIFlags :: FlagArtificial ,
519
522
discriminant: None ,
523
+ source_info: None ,
520
524
} ,
521
525
] ;
522
526
@@ -1026,6 +1030,12 @@ impl MetadataCreationResult<'ll> {
1026
1030
}
1027
1031
}
1028
1032
1033
+ #[ derive( Debug ) ]
1034
+ struct SourceInfo < ' ll > {
1035
+ file : & ' ll DIFile ,
1036
+ line : u32 ,
1037
+ }
1038
+
1029
1039
/// Description of a type member, which can either be a regular field (as in
1030
1040
/// structs or tuples) or an enum variant.
1031
1041
#[ derive( Debug ) ]
@@ -1037,6 +1047,7 @@ struct MemberDescription<'ll> {
1037
1047
align : Align ,
1038
1048
flags : DIFlags ,
1039
1049
discriminant : Option < u64 > ,
1050
+ source_info : Option < SourceInfo < ' ll > > ,
1040
1051
}
1041
1052
1042
1053
impl < ' ll > MemberDescription < ' ll > {
@@ -1045,14 +1056,18 @@ impl<'ll> MemberDescription<'ll> {
1045
1056
cx : & CodegenCx < ' ll , ' _ > ,
1046
1057
composite_type_metadata : & ' ll DIScope ,
1047
1058
) -> & ' ll DIType {
1059
+ let ( file, line) = self
1060
+ . source_info
1061
+ . map ( |info| ( info. file , info. line ) )
1062
+ . unwrap_or_else ( || ( unknown_file_metadata ( cx) , UNKNOWN_LINE_NUMBER ) ) ;
1048
1063
unsafe {
1049
1064
llvm:: LLVMRustDIBuilderCreateVariantMemberType (
1050
1065
DIB ( cx) ,
1051
1066
composite_type_metadata,
1052
1067
self . name . as_ptr ( ) . cast ( ) ,
1053
1068
self . name . len ( ) ,
1054
- unknown_file_metadata ( cx ) ,
1055
- UNKNOWN_LINE_NUMBER ,
1069
+ file ,
1070
+ line ,
1056
1071
self . size . bits ( ) ,
1057
1072
self . align . bits ( ) as u32 ,
1058
1073
self . offset . bits ( ) ,
@@ -1124,6 +1139,7 @@ impl<'tcx> StructMemberDescriptionFactory<'tcx> {
1124
1139
align : field. align . abi ,
1125
1140
flags : DIFlags :: FlagZero ,
1126
1141
discriminant : None ,
1142
+ source_info : None ,
1127
1143
}
1128
1144
} )
1129
1145
. collect ( )
@@ -1185,6 +1201,7 @@ impl<'tcx> TupleMemberDescriptionFactory<'tcx> {
1185
1201
align,
1186
1202
flags : DIFlags :: FlagZero ,
1187
1203
discriminant : None ,
1204
+ source_info : None ,
1188
1205
}
1189
1206
} )
1190
1207
. collect ( )
@@ -1244,6 +1261,7 @@ impl<'tcx> UnionMemberDescriptionFactory<'tcx> {
1244
1261
align : field. align . abi ,
1245
1262
flags : DIFlags :: FlagZero ,
1246
1263
discriminant : None ,
1264
+ source_info : None ,
1247
1265
}
1248
1266
} )
1249
1267
. collect ( )
@@ -1351,10 +1369,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1351
1369
1352
1370
let variant_info_for = |index : VariantIdx | match self . enum_type . kind {
1353
1371
ty:: Adt ( adt, _) => VariantInfo :: Adt ( & adt. variants [ index] ) ,
1354
- ty:: Generator ( _ , substs, _) => {
1372
+ ty:: Generator ( def_id , substs, _) => {
1355
1373
let ( generator_layout, generator_saved_local_names) =
1356
1374
generator_variant_info_data. as_ref ( ) . unwrap ( ) ;
1357
1375
VariantInfo :: Generator {
1376
+ def_id,
1358
1377
substs,
1359
1378
generator_layout : * generator_layout,
1360
1379
generator_saved_local_names,
@@ -1406,6 +1425,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1406
1425
align: self . layout. align. abi,
1407
1426
flags: DIFlags :: FlagZero ,
1408
1427
discriminant: None ,
1428
+ source_info: variant_info. source_info( cx) ,
1409
1429
} ]
1410
1430
}
1411
1431
Variants :: Multiple {
@@ -1462,6 +1482,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1462
1482
self . layout . ty . discriminant_for_variant ( cx. tcx , i) . unwrap ( ) . val
1463
1483
as u64 ,
1464
1484
) ,
1485
+ source_info : variant_info. source_info ( cx) ,
1465
1486
}
1466
1487
} )
1467
1488
. collect ( )
@@ -1527,7 +1548,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1527
1548
self . layout . fields . offset ( discr_index) ,
1528
1549
self . layout . field ( cx, discr_index) . size ,
1529
1550
) ;
1530
- variant_info_for ( * niche_variants. start ( ) ) . map_struct_name ( |variant_name| {
1551
+ let variant_info = variant_info_for ( * niche_variants. start ( ) ) ;
1552
+ variant_info. map_struct_name ( |variant_name| {
1531
1553
name. push_str ( variant_name) ;
1532
1554
} ) ;
1533
1555
@@ -1540,6 +1562,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1540
1562
align: variant. align. abi,
1541
1563
flags: DIFlags :: FlagZero ,
1542
1564
discriminant: None ,
1565
+ source_info: variant_info. source_info( cx) ,
1543
1566
} ]
1544
1567
} else {
1545
1568
variants
@@ -1589,6 +1612,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1589
1612
align : self . layout . align . abi ,
1590
1613
flags : DIFlags :: FlagZero ,
1591
1614
discriminant : niche_value,
1615
+ source_info : variant_info. source_info ( cx) ,
1592
1616
}
1593
1617
} )
1594
1618
. collect ( )
@@ -1631,6 +1655,7 @@ impl VariantMemberDescriptionFactory<'ll, 'tcx> {
1631
1655
align,
1632
1656
flags : DIFlags :: FlagZero ,
1633
1657
discriminant : None ,
1658
+ source_info : None ,
1634
1659
}
1635
1660
} )
1636
1661
. collect ( )
@@ -1648,6 +1673,7 @@ enum EnumDiscriminantInfo<'ll> {
1648
1673
enum VariantInfo < ' a , ' tcx > {
1649
1674
Adt ( & ' tcx ty:: VariantDef ) ,
1650
1675
Generator {
1676
+ def_id : DefId ,
1651
1677
substs : SubstsRef < ' tcx > ,
1652
1678
generator_layout : & ' tcx GeneratorLayout < ' tcx > ,
1653
1679
generator_saved_local_names : & ' a IndexVec < mir:: GeneratorSavedLocal , Option < Symbol > > ,
@@ -1696,6 +1722,24 @@ impl<'tcx> VariantInfo<'_, 'tcx> {
1696
1722
} ;
1697
1723
field_name. map ( |name| name. to_string ( ) ) . unwrap_or_else ( || format ! ( "__{}" , i) )
1698
1724
}
1725
+
1726
+ fn source_info ( & self , cx : & CodegenCx < ' ll , ' tcx > ) -> Option < SourceInfo < ' ll > > {
1727
+ match self {
1728
+ VariantInfo :: Generator { def_id, variant_index, .. } => {
1729
+ let span =
1730
+ cx. tcx . generator_layout ( * def_id) . variant_source_info [ * variant_index] . span ;
1731
+ if !span. is_dummy ( ) {
1732
+ let loc = cx. lookup_debug_loc ( span. lo ( ) ) ;
1733
+ return Some ( SourceInfo {
1734
+ file : file_metadata ( cx, & loc. file , def_id. krate ) ,
1735
+ line : loc. line . unwrap_or ( UNKNOWN_LINE_NUMBER ) ,
1736
+ } ) ;
1737
+ }
1738
+ }
1739
+ _ => { }
1740
+ }
1741
+ None
1742
+ }
1699
1743
}
1700
1744
1701
1745
/// Returns a tuple of (1) `type_metadata_stub` of the variant, (2) a
@@ -1775,7 +1819,8 @@ fn prepare_enum_metadata(
1775
1819
span : Span ,
1776
1820
outer_field_tys : Vec < Ty < ' tcx > > ,
1777
1821
) -> RecursiveTypeDescription < ' ll , ' tcx > {
1778
- let enum_name = compute_debuginfo_type_name ( cx. tcx , enum_type, false ) ;
1822
+ let tcx = cx. tcx ;
1823
+ let enum_name = compute_debuginfo_type_name ( tcx, enum_type, false ) ;
1779
1824
1780
1825
let containing_scope = get_namespace_for_item ( cx, enum_def_id) ;
1781
1826
// FIXME: This should emit actual file metadata for the enum, but we
@@ -1789,7 +1834,7 @@ fn prepare_enum_metadata(
1789
1834
let discriminant_type_metadata = |discr : Primitive | {
1790
1835
let enumerators_metadata: Vec < _ > = match enum_type. kind {
1791
1836
ty:: Adt ( def, _) => def
1792
- . discriminants ( cx . tcx )
1837
+ . discriminants ( tcx)
1793
1838
. zip ( & def. variants )
1794
1839
. map ( |( ( _, discr) , v) | {
1795
1840
let name = v. ident . as_str ( ) ;
@@ -1812,15 +1857,16 @@ fn prepare_enum_metadata(
1812
1857
. collect ( ) ,
1813
1858
ty:: Generator ( _, substs, _) => substs
1814
1859
. as_generator ( )
1815
- . variant_range ( enum_def_id, cx . tcx )
1860
+ . variant_range ( enum_def_id, tcx)
1816
1861
. map ( |variant_index| {
1862
+ debug_assert_eq ! ( tcx. types. u32 , substs. as_generator( ) . discr_ty( tcx) ) ;
1817
1863
let name = substs. as_generator ( ) . variant_name ( variant_index) ;
1818
1864
unsafe {
1819
1865
Some ( llvm:: LLVMRustDIBuilderCreateEnumerator (
1820
1866
DIB ( cx) ,
1821
1867
name. as_ptr ( ) . cast ( ) ,
1822
1868
name. len ( ) ,
1823
- // Generators use u32 as discriminant type.
1869
+ // Generators use u32 as discriminant type, verified above .
1824
1870
variant_index. as_u32 ( ) . into ( ) ,
1825
1871
true , // IsUnsigned
1826
1872
) )
@@ -1838,12 +1884,12 @@ fn prepare_enum_metadata(
1838
1884
None => {
1839
1885
let ( discriminant_size, discriminant_align) = ( discr. size ( cx) , discr. align ( cx) ) ;
1840
1886
let discriminant_base_type_metadata =
1841
- type_metadata ( cx, discr. to_ty ( cx . tcx ) , rustc_span:: DUMMY_SP ) ;
1887
+ type_metadata ( cx, discr. to_ty ( tcx) , rustc_span:: DUMMY_SP ) ;
1842
1888
1843
1889
let item_name;
1844
1890
let discriminant_name = match enum_type. kind {
1845
1891
ty:: Adt ( ..) => {
1846
- item_name = cx . tcx . item_name ( enum_def_id) . as_str ( ) ;
1892
+ item_name = tcx. item_name ( enum_def_id) . as_str ( ) ;
1847
1893
& * item_name
1848
1894
}
1849
1895
ty:: Generator ( ..) => enum_name. as_str ( ) ,
0 commit comments