1
Fork 0

Handle calls to upstream monomorphizations in compiler_builtins

This commit is contained in:
Ben Kimock 2024-03-15 14:13:11 -04:00
parent 1ca424ca43
commit 5f4f2526b8
12 changed files with 95 additions and 9 deletions

View file

@ -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;
};

View file

@ -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);