Introduce and provide a hook for should_codegen_locally
This commit is contained in:
parent
d3dd34a1d4
commit
0d508bb0cd
@ -103,6 +103,10 @@ fn clone(&self) -> Self { *self }
|
|||||||
|
|
||||||
/// Create a list-like THIR representation for debugging.
|
/// Create a list-like THIR representation for debugging.
|
||||||
hook thir_flat(key: LocalDefId) -> String;
|
hook thir_flat(key: LocalDefId) -> String;
|
||||||
|
|
||||||
|
/// Returns `true` if we should codegen an instance in the local crate, or returns `false` if we
|
||||||
|
/// can just link to the upstream crate and therefore don't need a mono item.
|
||||||
|
hook should_codegen_locally(instance: crate::ty::Instance<'tcx>) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cold]
|
#[cold]
|
||||||
|
@ -228,6 +228,7 @@
|
|||||||
self, AssocKind, GenericParamDefKind, Instance, InstanceKind, Ty, TyCtxt, TypeFoldable,
|
self, AssocKind, GenericParamDefKind, Instance, InstanceKind, Ty, TyCtxt, TypeFoldable,
|
||||||
TypeVisitableExt, VtblEntry,
|
TypeVisitableExt, VtblEntry,
|
||||||
};
|
};
|
||||||
|
use rustc_middle::util::Providers;
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_session::config::EntryFnType;
|
use rustc_session::config::EntryFnType;
|
||||||
use rustc_session::Limit;
|
use rustc_session::Limit;
|
||||||
@ -930,7 +931,7 @@ fn visit_instance_use<'tcx>(
|
|||||||
|
|
||||||
/// Returns `true` if we should codegen an instance in the local crate, or returns `false` if we
|
/// Returns `true` if we should codegen an instance in the local crate, or returns `false` if we
|
||||||
/// can just link to the upstream crate and therefore don't need a mono item.
|
/// can just link to the upstream crate and therefore don't need a mono item.
|
||||||
pub(crate) fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) -> bool {
|
pub(crate) fn should_codegen_locally_hook<'tcx>(tcx: TyCtxtAt<'tcx>, instance: Instance<'tcx>) -> bool {
|
||||||
let Some(def_id) = instance.def.def_id_if_not_guaranteed_local_codegen() else {
|
let Some(def_id) = instance.def.def_id_if_not_guaranteed_local_codegen() else {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@ -946,7 +947,7 @@ pub(crate) fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance
|
|||||||
}
|
}
|
||||||
|
|
||||||
if tcx.is_reachable_non_generic(def_id)
|
if tcx.is_reachable_non_generic(def_id)
|
||||||
|| instance.polymorphize(tcx).upstream_monomorphization(tcx).is_some()
|
|| instance.polymorphize(*tcx).upstream_monomorphization(*tcx).is_some()
|
||||||
{
|
{
|
||||||
// We can link to the item in question, no instance needed in this crate.
|
// We can link to the item in question, no instance needed in this crate.
|
||||||
return false;
|
return false;
|
||||||
@ -967,6 +968,12 @@ pub(crate) fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if we should codegen an instance in the local crate, or returns `false` if we
|
||||||
|
/// can just link to the upstream crate and therefore don't need a mono item.
|
||||||
|
pub(crate) fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) -> bool {
|
||||||
|
tcx.should_codegen_locally(instance)
|
||||||
|
}
|
||||||
|
|
||||||
/// For a given pair of source and target type that occur in an unsizing coercion,
|
/// For a given pair of source and target type that occur in an unsizing coercion,
|
||||||
/// this function finds the pair of types that determines the vtable linking
|
/// this function finds the pair of types that determines the vtable linking
|
||||||
/// them.
|
/// them.
|
||||||
@ -1613,3 +1620,7 @@ pub(crate) fn collect_crate_mono_items<'tcx>(
|
|||||||
|
|
||||||
(mono_items, state.usage_map.into_inner())
|
(mono_items, state.usage_map.into_inner())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn provide(providers: &mut Providers) {
|
||||||
|
providers.hooks.should_codegen_locally = should_codegen_locally_hook;
|
||||||
|
}
|
||||||
|
@ -5,12 +5,13 @@
|
|||||||
|
|
||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::query::{Providers, TyCtxtAt};
|
use rustc_middle::query::TyCtxtAt;
|
||||||
use rustc_middle::traits;
|
use rustc_middle::traits;
|
||||||
use rustc_middle::ty::adjustment::CustomCoerceUnsized;
|
use rustc_middle::ty::adjustment::CustomCoerceUnsized;
|
||||||
use rustc_middle::ty::Instance;
|
use rustc_middle::ty::Instance;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
|
use rustc_middle::util::Providers;
|
||||||
use rustc_span::def_id::DefId;
|
use rustc_span::def_id::DefId;
|
||||||
use rustc_span::def_id::LOCAL_CRATE;
|
use rustc_span::def_id::LOCAL_CRATE;
|
||||||
use rustc_span::ErrorGuaranteed;
|
use rustc_span::ErrorGuaranteed;
|
||||||
|
@ -112,9 +112,9 @@
|
|||||||
CodegenUnit, CodegenUnitNameBuilder, InstantiationMode, Linkage, MonoItem, MonoItemData,
|
CodegenUnit, CodegenUnitNameBuilder, InstantiationMode, Linkage, MonoItem, MonoItemData,
|
||||||
Visibility,
|
Visibility,
|
||||||
};
|
};
|
||||||
use rustc_middle::query::Providers;
|
|
||||||
use rustc_middle::ty::print::{characteristic_def_id_of_type, with_no_trimmed_paths};
|
use rustc_middle::ty::print::{characteristic_def_id_of_type, with_no_trimmed_paths};
|
||||||
use rustc_middle::ty::{self, visit::TypeVisitableExt, InstanceKind, TyCtxt};
|
use rustc_middle::ty::{self, visit::TypeVisitableExt, InstanceKind, TyCtxt};
|
||||||
|
use rustc_middle::util::Providers;
|
||||||
use rustc_session::config::{DumpMonoStatsFormat, SwitchWithOptPath};
|
use rustc_session::config::{DumpMonoStatsFormat, SwitchWithOptPath};
|
||||||
use rustc_session::CodegenUnits;
|
use rustc_session::CodegenUnits;
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
@ -1314,4 +1314,6 @@ pub fn provide(providers: &mut Providers) {
|
|||||||
.find(|cgu| cgu.name() == name)
|
.find(|cgu| cgu.name() == name)
|
||||||
.unwrap_or_else(|| panic!("failed to find cgu with name {name:?}"))
|
.unwrap_or_else(|| panic!("failed to find cgu with name {name:?}"))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
collector::provide(providers);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user