diff options
| author | Ben Kimock <kimockb@gmail.com> | 2024-03-15 14:13:11 -0400 |
|---|---|---|
| committer | Ben Kimock <kimockb@gmail.com> | 2024-03-16 15:22:05 -0400 |
| commit | 5f4f2526b84e585842bc94c74a56588ec0154c10 (patch) | |
| tree | 4e14f809674c03eafd8123cf7b67a6698b5965c9 /compiler/rustc_monomorphize/src/lib.rs | |
| parent | 1ca424ca436d4d4449def39723c9ec442837c370 (diff) | |
| download | rust-5f4f2526b84e585842bc94c74a56588ec0154c10.tar.gz rust-5f4f2526b84e585842bc94c74a56588ec0154c10.zip | |
Handle calls to upstream monomorphizations in compiler_builtins
Diffstat (limited to 'compiler/rustc_monomorphize/src/lib.rs')
| -rw-r--r-- | compiler/rustc_monomorphize/src/lib.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/compiler/rustc_monomorphize/src/lib.rs b/compiler/rustc_monomorphize/src/lib.rs index 7f36ae91f1a..6de54541643 100644 --- a/compiler/rustc_monomorphize/src/lib.rs +++ b/compiler/rustc_monomorphize/src/lib.rs @@ -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); |
