Skip to content

Commit 6e9db01

Browse files
committed
Remove InstanceKind::generates_cgu_internal_copy
1 parent eea88f5 commit 6e9db01

File tree

4 files changed

+11
-64
lines changed

4 files changed

+11
-64
lines changed

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

+1-10
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,7 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, _: LocalCrate) -> DefIdMap<S
9393
return None;
9494
}
9595

96-
// Functions marked with #[inline] are codegened with "internal"
97-
// linkage and are not exported unless marked with an extern
98-
// indicator
99-
if !Instance::mono(tcx, def_id.to_def_id()).def.generates_cgu_internal_copy(tcx)
100-
|| tcx.codegen_fn_attrs(def_id.to_def_id()).contains_extern_indicator()
101-
{
102-
Some(def_id)
103-
} else {
104-
None
105-
}
96+
if tcx.cross_crate_inlinable(def_id) { None } else { Some(def_id) }
10697
})
10798
.map(|def_id| {
10899
// We won't link right if this symbol is stripped during LTO.

compiler/rustc_middle/src/mir/mono.rs

+4-10
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,10 @@ impl<'tcx> MonoItem<'tcx> {
123123
return InstantiationMode::GloballyShared { may_conflict: false };
124124
}
125125

126-
// FIXME: The logic for which functions are permitted to get LocalCopy is actually spread
127-
// across 4 functions:
128-
// * cross_crate_inlinable(def_id)
129-
// * InstanceKind::requires_inline
130-
// * InstanceKind::generate_cgu_internal_copy
131-
// * MonoItem::instantiation_mode
132-
// Since reachable_non_generics calls InstanceKind::generates_cgu_internal_copy to decide
133-
// which symbols this crate exports, we are obligated to only generate LocalCopy when
134-
// generates_cgu_internal_copy returns true.
135-
if !instance.def.generates_cgu_internal_copy(tcx) {
126+
// We need to ensure that we do not decide the InstantiationMode of an exported symbol is
127+
// LocalCopy. Since exported symbols are computed based on the output of
128+
// cross_crate_inlinable, we are beholden to our previous decisions.
129+
if !tcx.cross_crate_inlinable(instance.def_id()) {
136130
return InstantiationMode::GloballyShared { may_conflict: false };
137131
}
138132

compiler/rustc_middle/src/ty/instance.rs

-44
Original file line numberDiff line numberDiff line change
@@ -301,50 +301,6 @@ impl<'tcx> InstanceKind<'tcx> {
301301
)
302302
}
303303

304-
/// Returns `true` if the machine code for this instance is instantiated in
305-
/// each codegen unit that references it.
306-
/// Note that this is only a hint! The compiler can globally decide to *not*
307-
/// do this in order to speed up compilation. CGU-internal copies are
308-
/// only exist to enable inlining. If inlining is not performed (e.g. at
309-
/// `-Copt-level=0`) then the time for generating them is wasted and it's
310-
/// better to create a single copy with external linkage.
311-
pub fn generates_cgu_internal_copy(&self, tcx: TyCtxt<'tcx>) -> bool {
312-
if self.requires_inline(tcx) {
313-
return true;
314-
}
315-
if let ty::InstanceKind::DropGlue(.., Some(ty))
316-
| ty::InstanceKind::AsyncDropGlueCtorShim(.., Some(ty)) = *self
317-
{
318-
// Drop glue generally wants to be instantiated at every codegen
319-
// unit, but without an #[inline] hint. We should make this
320-
// available to normal end-users.
321-
if tcx.sess.opts.incremental.is_none() {
322-
return true;
323-
}
324-
// When compiling with incremental, we can generate a *lot* of
325-
// codegen units. Including drop glue into all of them has a
326-
// considerable compile time cost.
327-
//
328-
// We include enums without destructors to allow, say, optimizing
329-
// drops of `Option::None` before LTO. We also respect the intent of
330-
// `#[inline]` on `Drop::drop` implementations.
331-
return ty.ty_adt_def().is_none_or(|adt_def| {
332-
match *self {
333-
ty::InstanceKind::DropGlue(..) => adt_def.destructor(tcx).map(|dtor| dtor.did),
334-
ty::InstanceKind::AsyncDropGlueCtorShim(..) => {
335-
adt_def.async_destructor(tcx).map(|dtor| dtor.ctor)
336-
}
337-
_ => unreachable!(),
338-
}
339-
.map_or_else(|| adt_def.is_enum(), |did| tcx.cross_crate_inlinable(did))
340-
});
341-
}
342-
if let ty::InstanceKind::ThreadLocalShim(..) = *self {
343-
return false;
344-
}
345-
tcx.cross_crate_inlinable(self.def_id())
346-
}
347-
348304
pub fn requires_caller_location(&self, tcx: TyCtxt<'_>) -> bool {
349305
match *self {
350306
InstanceKind::Item(def_id) | InstanceKind::Virtual(def_id, _) => {

compiler/rustc_mir_transform/src/cross_crate_inline.rs

+6
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ fn cross_crate_inlinable(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
7575
return false;
7676
}
7777

78+
if let Some(drop_in_place) = tcx.lang_items().drop_in_place_fn() {
79+
if rustc_hir::def_id::DefId::from(def_id) == drop_in_place {
80+
return true;
81+
}
82+
}
83+
7884
if !tcx.is_mir_available(def_id) {
7985
return false;
8086
}

0 commit comments

Comments
 (0)