Handle calls to upstream monomorphizations in compiler_builtins
This commit is contained in:
parent
1ca424ca43
commit
5f4f2526b8
12 changed files with 95 additions and 9 deletions
|
@ -1020,7 +1020,7 @@ fn visit_instance_use<'tcx>(
|
|||
|
||||
/// 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.
|
||||
fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: &Instance<'tcx>) -> bool {
|
||||
pub(crate) fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: &Instance<'tcx>) -> bool {
|
||||
let Some(def_id) = instance.def.def_id_if_not_guaranteed_local_codegen() else {
|
||||
return true;
|
||||
};
|
||||
|
|
|
@ -11,7 +11,10 @@ use rustc_hir::lang_items::LangItem;
|
|||
use rustc_middle::query::{Providers, TyCtxtAt};
|
||||
use rustc_middle::traits;
|
||||
use rustc_middle::ty::adjustment::CustomCoerceUnsized;
|
||||
use rustc_middle::ty::Instance;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
use rustc_span::def_id::LOCAL_CRATE;
|
||||
use rustc_span::ErrorGuaranteed;
|
||||
|
||||
mod collector;
|
||||
|
@ -20,6 +23,8 @@ mod partitioning;
|
|||
mod polymorphize;
|
||||
mod util;
|
||||
|
||||
use collector::should_codegen_locally;
|
||||
|
||||
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
|
||||
|
||||
fn custom_coerce_unsize_info<'tcx>(
|
||||
|
@ -45,6 +50,22 @@ fn custom_coerce_unsize_info<'tcx>(
|
|||
}
|
||||
}
|
||||
|
||||
/// Returns whether a call from the current crate to the [`Instance`] would produce a call
|
||||
/// from `compiler_builtins` to a symbol the linker must resolve.
|
||||
///
|
||||
/// Such calls from `compiler_bultins` are effectively impossible for the linker to handle. Some
|
||||
/// linkers will optimize such that dead calls to unresolved symbols are not an error, but this is
|
||||
/// not guaranteed. So we used this function in codegen backends to ensure we do not generate any
|
||||
/// unlinkable calls.
|
||||
pub fn is_call_from_compiler_builtins_to_upstream_monomorphization<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
instance: Instance<'tcx>,
|
||||
) -> bool {
|
||||
!instance.def_id().is_local()
|
||||
&& tcx.is_compiler_builtins(LOCAL_CRATE)
|
||||
&& !should_codegen_locally(tcx, &instance)
|
||||
}
|
||||
|
||||
pub fn provide(providers: &mut Providers) {
|
||||
partitioning::provide(providers);
|
||||
polymorphize::provide(providers);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue