11use crate :: dep_graph:: { DepConstructor , DepNode , WorkProduct , WorkProductId } ;
22use crate :: ich:: { NodeIdHashingMode , StableHashingContext } ;
33use crate :: ty:: { subst:: InternalSubsts , Instance , InstanceDef , SymbolName , TyCtxt } ;
4- use rustc_attr:: InlineAttr ;
54use rustc_data_structures:: base_n;
65use rustc_data_structures:: fingerprint:: Fingerprint ;
76use rustc_data_structures:: fx:: FxHashMap ;
@@ -79,14 +78,6 @@ impl<'tcx> MonoItem<'tcx> {
7978 }
8079
8180 pub fn instantiation_mode ( & self , tcx : TyCtxt < ' tcx > ) -> InstantiationMode {
82- let generate_cgu_internal_copies = tcx
83- . sess
84- . opts
85- . debugging_opts
86- . inline_in_all_cgus
87- . unwrap_or_else ( || tcx. sess . opts . optimize != OptLevel :: No )
88- && !tcx. sess . link_dead_code ( ) ;
89-
9081 match * self {
9182 MonoItem :: Fn ( ref instance) => {
9283 let entry_def_id = tcx. entry_fn ( LOCAL_CRATE ) . map ( |( id, _) | id) ;
@@ -99,21 +90,26 @@ impl<'tcx> MonoItem<'tcx> {
9990 return InstantiationMode :: GloballyShared { may_conflict : false } ;
10091 }
10192
93+ let generate_cgu_internal_copies = tcx
94+ . sess
95+ . opts
96+ . debugging_opts
97+ . inline_in_all_cgus
98+ . unwrap_or_else ( || tcx. sess . opts . optimize != OptLevel :: No )
99+ && !tcx. sess . link_dead_code ( ) ;
100+
102101 // At this point we don't have explicit linkage and we're an
103- // inlined function. If we're inlining into all CGUs then we'll
104- // be creating a local copy per CGU.
102+ // inlined function. If we should generate local copies for each CGU,
103+ // then return `LocalCopy`, otherwise we'll just generate one copy
104+ // and share it with all CGUs in this crate.
105105 if generate_cgu_internal_copies {
106- return InstantiationMode :: LocalCopy ;
107- }
108-
109- // Finally, if this is `#[inline(always)]` we're sure to respect
110- // that with an inline copy per CGU, but otherwise we'll be
111- // creating one copy of this `#[inline]` function which may
112- // conflict with upstream crates as it could be an exported
113- // symbol.
114- match tcx. codegen_fn_attrs ( instance. def_id ( ) ) . inline {
115- InlineAttr :: Always => InstantiationMode :: LocalCopy ,
116- _ => InstantiationMode :: GloballyShared { may_conflict : true } ,
106+ InstantiationMode :: LocalCopy
107+ } else {
108+ // Finally, if we've reached this point, then we should optimize for
109+ // compilation speed. In that regard, we will ignore any `#[inline]`
110+ // annotations on the function and simply codegen it as usual. This could
111+ // conflict with upstream crates as it could be an exported symbol.
112+ InstantiationMode :: GloballyShared { may_conflict : true }
117113 }
118114 }
119115 MonoItem :: Static ( ..) | MonoItem :: GlobalAsm ( ..) => {
0 commit comments