1
1
use crate :: dep_graph:: { dep_constructor, DepNode , WorkProduct , WorkProductId } ;
2
2
use crate :: ich:: { NodeIdHashingMode , StableHashingContext } ;
3
3
use crate :: ty:: { subst:: InternalSubsts , Instance , InstanceDef , SymbolName , TyCtxt } ;
4
+ use rustc_attr:: InlineAttr ;
4
5
use rustc_data_structures:: base_n;
5
6
use rustc_data_structures:: fingerprint:: Fingerprint ;
6
7
use rustc_data_structures:: fx:: FxHashMap ;
@@ -78,6 +79,14 @@ impl<'tcx> MonoItem<'tcx> {
78
79
}
79
80
80
81
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
+
81
90
match * self {
82
91
MonoItem :: Fn ( ref instance) => {
83
92
let entry_def_id = tcx. entry_fn ( LOCAL_CRATE ) . map ( |( id, _) | id) ;
@@ -90,26 +99,21 @@ impl<'tcx> MonoItem<'tcx> {
90
99
return InstantiationMode :: GloballyShared { may_conflict : false } ;
91
100
}
92
101
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
-
101
102
// At this point we don't have explicit linkage and we're an
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.
103
+ // inlined function. If we're inlining into all CGUs then we'll
104
+ // be creating a local copy per CGU.
105
105
if generate_cgu_internal_copies {
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 }
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 } ,
113
117
}
114
118
}
115
119
MonoItem :: Static ( ..) | MonoItem :: GlobalAsm ( ..) => {
0 commit comments