@@ -109,8 +109,8 @@ use rustc_middle::bug;
109
109
use rustc_middle:: middle:: codegen_fn_attrs:: CodegenFnAttrFlags ;
110
110
use rustc_middle:: middle:: exported_symbols:: { SymbolExportInfo , SymbolExportLevel } ;
111
111
use rustc_middle:: mir:: mono:: {
112
- CodegenUnit , CodegenUnitNameBuilder , InstantiationMode , Linkage , MonoItem , MonoItemData ,
113
- Visibility ,
112
+ CodegenUnit , CodegenUnitNameBuilder , InstantiationMode , Linkage , LinkageInfo , MonoItem ,
113
+ MonoItemData , Visibility ,
114
114
} ;
115
115
use rustc_middle:: ty:: print:: { characteristic_def_id_of_type, with_no_trimmed_paths} ;
116
116
use rustc_middle:: ty:: visit:: TypeVisitableExt ;
@@ -245,7 +245,7 @@ where
245
245
let cgu = codegen_units. entry ( cgu_name) . or_insert_with ( || CodegenUnit :: new ( cgu_name) ) ;
246
246
247
247
let mut can_be_internalized = true ;
248
- let ( linkage , visibility) = mono_item_linkage_and_visibility (
248
+ let ( linkage_info , visibility) = mono_item_linkage_info_and_visibility (
249
249
cx. tcx ,
250
250
& mono_item,
251
251
& mut can_be_internalized,
@@ -259,7 +259,7 @@ where
259
259
260
260
cgu. items_mut ( ) . insert ( mono_item, MonoItemData {
261
261
inlined : false ,
262
- linkage ,
262
+ linkage_info ,
263
263
visibility,
264
264
size_estimate,
265
265
} ) ;
@@ -278,7 +278,7 @@ where
278
278
// This is a CGU-private copy.
279
279
cgu. items_mut ( ) . entry ( inlined_item) . or_insert_with ( || MonoItemData {
280
280
inlined : true ,
281
- linkage : Linkage :: Internal ,
281
+ linkage_info : LinkageInfo :: ImplicitInternal ,
282
282
visibility : Visibility :: Default ,
283
283
size_estimate : inlined_item. size_estimate ( cx. tcx ) ,
284
284
} ) ;
@@ -589,7 +589,8 @@ fn internalize_symbols<'tcx>(
589
589
590
590
// If we got here, we did not find any uses from other CGUs, so
591
591
// it's fine to make this monomorphization internal.
592
- data. linkage = Linkage :: Internal ;
592
+ debug_assert_eq ! ( data. linkage_info, LinkageInfo :: ImplicitExternal ) ;
593
+ data. linkage_info = LinkageInfo :: ImplicitInternal ;
593
594
data. visibility = Visibility :: Default ;
594
595
}
595
596
}
@@ -607,7 +608,7 @@ fn mark_code_coverage_dead_code_cgu<'tcx>(codegen_units: &mut [CodegenUnit<'tcx>
607
608
// function symbols to be included via `-u` or `/include` linker args.
608
609
let dead_code_cgu = codegen_units
609
610
. iter_mut ( )
610
- . filter ( |cgu| cgu. items ( ) . iter ( ) . any ( |( _, data) | data. linkage == Linkage :: External ) )
611
+ . filter ( |cgu| cgu. items ( ) . iter ( ) . any ( |( _, data) | data. linkage_info . is_external ( ) ) )
611
612
. min_by_key ( |cgu| cgu. size_estimate ( ) ) ;
612
613
613
614
// If there are no CGUs that have externally linked items, then we just
@@ -736,24 +737,26 @@ fn fallback_cgu_name(name_builder: &mut CodegenUnitNameBuilder<'_>) -> Symbol {
736
737
name_builder. build_cgu_name ( LOCAL_CRATE , & [ "fallback" ] , Some ( "cgu" ) )
737
738
}
738
739
739
- fn mono_item_linkage_and_visibility < ' tcx > (
740
+ fn mono_item_linkage_info_and_visibility < ' tcx > (
740
741
tcx : TyCtxt < ' tcx > ,
741
742
mono_item : & MonoItem < ' tcx > ,
742
743
can_be_internalized : & mut bool ,
743
744
can_export_generics : bool ,
744
745
always_export_generics : bool ,
745
- ) -> ( Linkage , Visibility ) {
746
+ ) -> ( LinkageInfo , Visibility ) {
746
747
if let Some ( explicit_linkage) = mono_item. explicit_linkage ( tcx) {
747
- return ( explicit_linkage, Visibility :: Default ) ;
748
+ ( LinkageInfo :: Explicit ( explicit_linkage) , Visibility :: Default )
749
+ } else {
750
+ let vis = mono_item_visibility (
751
+ tcx,
752
+ mono_item,
753
+ can_be_internalized,
754
+ can_export_generics,
755
+ always_export_generics,
756
+ ) ;
757
+
758
+ ( LinkageInfo :: ImplicitExternal , vis)
748
759
}
749
- let vis = mono_item_visibility (
750
- tcx,
751
- mono_item,
752
- can_be_internalized,
753
- can_export_generics,
754
- always_export_generics,
755
- ) ;
756
- ( Linkage :: External , vis)
757
760
}
758
761
759
762
type CguNameCache = UnordMap < ( DefId , bool ) , Symbol > ;
@@ -1033,15 +1036,15 @@ fn debug_dump<'a, 'tcx: 'a>(tcx: TyCtxt<'tcx>, label: &str, cgus: &[CodegenUnit<
1033
1036
writeln ! ( s, " - items: {num_items}, mean size: {mean_size:.1}, sizes: {sizes}" , ) ;
1034
1037
1035
1038
for ( item, data) in cgu. items_in_deterministic_order ( tcx) {
1036
- let linkage = data. linkage ;
1039
+ let linkage_info = data. linkage_info ;
1037
1040
let symbol_name = item. symbol_name ( tcx) . name ;
1038
1041
let symbol_hash_start = symbol_name. rfind ( 'h' ) ;
1039
1042
let symbol_hash = symbol_hash_start. map_or ( "<no hash>" , |i| & symbol_name[ i..] ) ;
1040
1043
let kind = if !data. inlined { "root" } else { "inlined" } ;
1041
1044
let size = data. size_estimate ;
1042
1045
let _ = with_no_trimmed_paths ! ( writeln!(
1043
1046
s,
1044
- " - {item} [{linkage :?}] [{symbol_hash}] ({kind}, size: {size})"
1047
+ " - {item} [{linkage_info :?}] [{symbol_hash}] ({kind}, size: {size})"
1045
1048
) ) ;
1046
1049
}
1047
1050
@@ -1194,7 +1197,7 @@ fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> (&DefIdSet, &[Co
1194
1197
1195
1198
for cgu in codegen_units {
1196
1199
for ( & mono_item, & data) in cgu. items ( ) {
1197
- item_to_cgus. entry ( mono_item) . or_default ( ) . push ( ( cgu. name ( ) , data. linkage ) ) ;
1200
+ item_to_cgus. entry ( mono_item) . or_default ( ) . push ( ( cgu. name ( ) , data. linkage_info ) ) ;
1198
1201
}
1199
1202
}
1200
1203
@@ -1207,11 +1210,11 @@ fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> (&DefIdSet, &[Co
1207
1210
let cgus = item_to_cgus. get_mut ( i) . unwrap_or ( & mut empty) ;
1208
1211
cgus. sort_by_key ( |( name, _) | * name) ;
1209
1212
cgus. dedup ( ) ;
1210
- for & ( ref cgu_name, linkage ) in cgus. iter ( ) {
1213
+ for & ( ref cgu_name, linkage_info ) in cgus. iter ( ) {
1211
1214
output. push ( ' ' ) ;
1212
1215
output. push_str ( cgu_name. as_str ( ) ) ;
1213
1216
1214
- let linkage_abbrev = match linkage {
1217
+ let linkage_abbrev = match linkage_info . into_linkage ( ) {
1215
1218
Linkage :: External => "External" ,
1216
1219
Linkage :: AvailableExternally => "Available" ,
1217
1220
Linkage :: LinkOnceAny => "OnceAny" ,
0 commit comments