@@ -109,8 +109,8 @@ use rustc_middle::bug;
109109use rustc_middle:: middle:: codegen_fn_attrs:: CodegenFnAttrFlags ;
110110use rustc_middle:: middle:: exported_symbols:: { SymbolExportInfo , SymbolExportLevel } ;
111111use rustc_middle:: mir:: mono:: {
112- CodegenUnit , CodegenUnitNameBuilder , InstantiationMode , Linkage , MonoItem , MonoItemData ,
113- Visibility ,
112+ CodegenUnit , CodegenUnitNameBuilder , InstantiationMode , Linkage , LinkageInfo , MonoItem ,
113+ MonoItemData , Visibility ,
114114} ;
115115use rustc_middle:: ty:: print:: { characteristic_def_id_of_type, with_no_trimmed_paths} ;
116116use rustc_middle:: ty:: visit:: TypeVisitableExt ;
@@ -245,7 +245,7 @@ where
245245 let cgu = codegen_units. entry ( cgu_name) . or_insert_with ( || CodegenUnit :: new ( cgu_name) ) ;
246246
247247 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 (
249249 cx. tcx ,
250250 & mono_item,
251251 & mut can_be_internalized,
@@ -259,7 +259,7 @@ where
259259
260260 cgu. items_mut ( ) . insert ( mono_item, MonoItemData {
261261 inlined : false ,
262- linkage ,
262+ linkage_info ,
263263 visibility,
264264 size_estimate,
265265 } ) ;
@@ -278,7 +278,7 @@ where
278278 // This is a CGU-private copy.
279279 cgu. items_mut ( ) . entry ( inlined_item) . or_insert_with ( || MonoItemData {
280280 inlined : true ,
281- linkage : Linkage :: Internal ,
281+ linkage_info : LinkageInfo :: ImplicitInternal ,
282282 visibility : Visibility :: Default ,
283283 size_estimate : inlined_item. size_estimate ( cx. tcx ) ,
284284 } ) ;
@@ -589,7 +589,8 @@ fn internalize_symbols<'tcx>(
589589
590590 // If we got here, we did not find any uses from other CGUs, so
591591 // 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 ;
593594 data. visibility = Visibility :: Default ;
594595 }
595596 }
@@ -607,7 +608,7 @@ fn mark_code_coverage_dead_code_cgu<'tcx>(codegen_units: &mut [CodegenUnit<'tcx>
607608 // function symbols to be included via `-u` or `/include` linker args.
608609 let dead_code_cgu = codegen_units
609610 . 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 ( ) ) )
611612 . min_by_key ( |cgu| cgu. size_estimate ( ) ) ;
612613
613614 // 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 {
736737 name_builder. build_cgu_name ( LOCAL_CRATE , & [ "fallback" ] , Some ( "cgu" ) )
737738}
738739
739- fn mono_item_linkage_and_visibility < ' tcx > (
740+ fn mono_item_linkage_info_and_visibility < ' tcx > (
740741 tcx : TyCtxt < ' tcx > ,
741742 mono_item : & MonoItem < ' tcx > ,
742743 can_be_internalized : & mut bool ,
743744 can_export_generics : bool ,
744745 always_export_generics : bool ,
745- ) -> ( Linkage , Visibility ) {
746+ ) -> ( LinkageInfo , Visibility ) {
746747 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)
748759 }
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)
757760}
758761
759762type CguNameCache = UnordMap < ( DefId , bool ) , Symbol > ;
@@ -1033,15 +1036,15 @@ fn debug_dump<'a, 'tcx: 'a>(tcx: TyCtxt<'tcx>, label: &str, cgus: &[CodegenUnit<
10331036 writeln ! ( s, " - items: {num_items}, mean size: {mean_size:.1}, sizes: {sizes}" , ) ;
10341037
10351038 for ( item, data) in cgu. items_in_deterministic_order ( tcx) {
1036- let linkage = data. linkage ;
1039+ let linkage_info = data. linkage_info ;
10371040 let symbol_name = item. symbol_name ( tcx) . name ;
10381041 let symbol_hash_start = symbol_name. rfind ( 'h' ) ;
10391042 let symbol_hash = symbol_hash_start. map_or ( "<no hash>" , |i| & symbol_name[ i..] ) ;
10401043 let kind = if !data. inlined { "root" } else { "inlined" } ;
10411044 let size = data. size_estimate ;
10421045 let _ = with_no_trimmed_paths ! ( writeln!(
10431046 s,
1044- " - {item} [{linkage :?}] [{symbol_hash}] ({kind}, size: {size})"
1047+ " - {item} [{linkage_info :?}] [{symbol_hash}] ({kind}, size: {size})"
10451048 ) ) ;
10461049 }
10471050
@@ -1194,7 +1197,7 @@ fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> (&DefIdSet, &[Co
11941197
11951198 for cgu in codegen_units {
11961199 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 ) ) ;
11981201 }
11991202 }
12001203
@@ -1207,11 +1210,11 @@ fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> (&DefIdSet, &[Co
12071210 let cgus = item_to_cgus. get_mut ( i) . unwrap_or ( & mut empty) ;
12081211 cgus. sort_by_key ( |( name, _) | * name) ;
12091212 cgus. dedup ( ) ;
1210- for & ( ref cgu_name, linkage ) in cgus. iter ( ) {
1213+ for & ( ref cgu_name, linkage_info ) in cgus. iter ( ) {
12111214 output. push ( ' ' ) ;
12121215 output. push_str ( cgu_name. as_str ( ) ) ;
12131216
1214- let linkage_abbrev = match linkage {
1217+ let linkage_abbrev = match linkage_info . into_linkage ( ) {
12151218 Linkage :: External => "External" ,
12161219 Linkage :: AvailableExternally => "Available" ,
12171220 Linkage :: LinkOnceAny => "OnceAny" ,
0 commit comments