mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Move compiler_builtin check to the use case
This commit is contained in:
parent
14430e66be
commit
9b80250abb
@ -10,12 +10,12 @@ use std::mem;
|
|||||||
use cranelift_codegen::ir::{ArgumentPurpose, SigRef};
|
use cranelift_codegen::ir::{ArgumentPurpose, SigRef};
|
||||||
use cranelift_codegen::isa::CallConv;
|
use cranelift_codegen::isa::CallConv;
|
||||||
use cranelift_module::ModuleError;
|
use cranelift_module::ModuleError;
|
||||||
|
use rustc_codegen_ssa::base::is_call_from_compiler_builtins_to_upstream_monomorphization;
|
||||||
use rustc_codegen_ssa::errors::CompilerBuiltinsCannotCall;
|
use rustc_codegen_ssa::errors::CompilerBuiltinsCannotCall;
|
||||||
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||||
use rustc_middle::ty::layout::FnAbiOf;
|
use rustc_middle::ty::layout::FnAbiOf;
|
||||||
use rustc_middle::ty::print::with_no_trimmed_paths;
|
use rustc_middle::ty::print::with_no_trimmed_paths;
|
||||||
use rustc_middle::ty::TypeVisitableExt;
|
use rustc_middle::ty::TypeVisitableExt;
|
||||||
use rustc_monomorphize::is_call_from_compiler_builtins_to_upstream_monomorphization;
|
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_target::abi::call::{Conv, FnAbi, PassMode};
|
use rustc_target::abi::call::{Conv, FnAbi, PassMode};
|
||||||
|
@ -5,13 +5,13 @@ use cranelift_codegen::CodegenError;
|
|||||||
use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext};
|
use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext};
|
||||||
use cranelift_module::ModuleError;
|
use cranelift_module::ModuleError;
|
||||||
use rustc_ast::InlineAsmOptions;
|
use rustc_ast::InlineAsmOptions;
|
||||||
|
use rustc_codegen_ssa::base::is_call_from_compiler_builtins_to_upstream_monomorphization;
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||||
use rustc_middle::ty::adjustment::PointerCoercion;
|
use rustc_middle::ty::adjustment::PointerCoercion;
|
||||||
use rustc_middle::ty::layout::FnAbiOf;
|
use rustc_middle::ty::layout::FnAbiOf;
|
||||||
use rustc_middle::ty::print::with_no_trimmed_paths;
|
use rustc_middle::ty::print::with_no_trimmed_paths;
|
||||||
use rustc_middle::ty::TypeVisitableExt;
|
use rustc_middle::ty::TypeVisitableExt;
|
||||||
use rustc_monomorphize::is_call_from_compiler_builtins_to_upstream_monomorphization;
|
|
||||||
|
|
||||||
use crate::constant::ConstantCx;
|
use crate::constant::ConstantCx;
|
||||||
use crate::debuginfo::{FunctionDebugContext, TypeDebugContext};
|
use crate::debuginfo::{FunctionDebugContext, TypeDebugContext};
|
||||||
|
@ -24,7 +24,6 @@ extern crate rustc_hir;
|
|||||||
extern crate rustc_incremental;
|
extern crate rustc_incremental;
|
||||||
extern crate rustc_index;
|
extern crate rustc_index;
|
||||||
extern crate rustc_metadata;
|
extern crate rustc_metadata;
|
||||||
extern crate rustc_monomorphize;
|
|
||||||
extern crate rustc_session;
|
extern crate rustc_session;
|
||||||
extern crate rustc_span;
|
extern crate rustc_span;
|
||||||
extern crate rustc_target;
|
extern crate rustc_target;
|
||||||
|
@ -806,6 +806,34 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
|
|||||||
ongoing_codegen
|
ongoing_codegen
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 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.
|
||||||
|
///
|
||||||
|
/// Note that calls to LLVM intrinsics are uniquely okay because they won't make it to the linker.
|
||||||
|
pub fn is_call_from_compiler_builtins_to_upstream_monomorphization<'tcx>(
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
instance: Instance<'tcx>,
|
||||||
|
) -> bool {
|
||||||
|
fn is_llvm_intrinsic(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
||||||
|
if let Some(name) = tcx.codegen_fn_attrs(def_id).link_name {
|
||||||
|
name.as_str().starts_with("llvm.")
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let def_id = instance.def_id();
|
||||||
|
!def_id.is_local()
|
||||||
|
&& tcx.is_compiler_builtins(LOCAL_CRATE)
|
||||||
|
&& !is_llvm_intrinsic(tcx, def_id)
|
||||||
|
&& !tcx.should_codegen_locally(instance)
|
||||||
|
}
|
||||||
|
|
||||||
impl CrateInfo {
|
impl CrateInfo {
|
||||||
pub fn new(tcx: TyCtxt<'_>, target_cpu: String) -> CrateInfo {
|
pub fn new(tcx: TyCtxt<'_>, target_cpu: String) -> CrateInfo {
|
||||||
let crate_types = tcx.crate_types().to_vec();
|
let crate_types = tcx.crate_types().to_vec();
|
||||||
|
@ -3,7 +3,7 @@ use super::operand::OperandValue::{Immediate, Pair, Ref, ZeroSized};
|
|||||||
use super::place::{PlaceRef, PlaceValue};
|
use super::place::{PlaceRef, PlaceValue};
|
||||||
use super::{CachedLlbb, FunctionCx, LocalRef};
|
use super::{CachedLlbb, FunctionCx, LocalRef};
|
||||||
|
|
||||||
use crate::base;
|
use crate::base::{self, is_call_from_compiler_builtins_to_upstream_monomorphization};
|
||||||
use crate::common::{self, IntPredicate};
|
use crate::common::{self, IntPredicate};
|
||||||
use crate::errors::CompilerBuiltinsCannotCall;
|
use crate::errors::CompilerBuiltinsCannotCall;
|
||||||
use crate::meth;
|
use crate::meth;
|
||||||
@ -18,7 +18,6 @@ use rustc_middle::ty::layout::{HasTyCtxt, LayoutOf, ValidityRequirement};
|
|||||||
use rustc_middle::ty::print::{with_no_trimmed_paths, with_no_visible_paths};
|
use rustc_middle::ty::print::{with_no_trimmed_paths, with_no_visible_paths};
|
||||||
use rustc_middle::ty::{self, Instance, Ty};
|
use rustc_middle::ty::{self, Instance, Ty};
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_monomorphize::is_call_from_compiler_builtins_to_upstream_monomorphization;
|
|
||||||
use rustc_session::config::OptLevel;
|
use rustc_session::config::OptLevel;
|
||||||
use rustc_span::{source_map::Spanned, sym, Span};
|
use rustc_span::{source_map::Spanned, sym, Span};
|
||||||
use rustc_target::abi::call::{ArgAbi, FnAbi, PassMode, Reg};
|
use rustc_target::abi::call::{ArgAbi, FnAbi, PassMode, Reg};
|
||||||
|
@ -8,12 +8,8 @@ use rustc_middle::bug;
|
|||||||
use rustc_middle::query::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::TyCtxt;
|
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
use rustc_middle::util::Providers;
|
use rustc_middle::util::Providers;
|
||||||
use rustc_span::def_id::DefId;
|
|
||||||
use rustc_span::def_id::LOCAL_CRATE;
|
|
||||||
use rustc_span::ErrorGuaranteed;
|
use rustc_span::ErrorGuaranteed;
|
||||||
|
|
||||||
mod collector;
|
mod collector;
|
||||||
@ -46,34 +42,6 @@ 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.
|
|
||||||
///
|
|
||||||
/// Note that calls to LLVM intrinsics are uniquely okay because they won't make it to the linker.
|
|
||||||
pub fn is_call_from_compiler_builtins_to_upstream_monomorphization<'tcx>(
|
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
instance: Instance<'tcx>,
|
|
||||||
) -> bool {
|
|
||||||
fn is_llvm_intrinsic(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
|
||||||
if let Some(name) = tcx.codegen_fn_attrs(def_id).link_name {
|
|
||||||
name.as_str().starts_with("llvm.")
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let def_id = instance.def_id();
|
|
||||||
!def_id.is_local()
|
|
||||||
&& tcx.is_compiler_builtins(LOCAL_CRATE)
|
|
||||||
&& !is_llvm_intrinsic(tcx, def_id)
|
|
||||||
&& !tcx.should_codegen_locally(instance)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub fn provide(providers: &mut Providers) {
|
||||||
partitioning::provide(providers);
|
partitioning::provide(providers);
|
||||||
polymorphize::provide(providers);
|
polymorphize::provide(providers);
|
||||||
|
Loading…
Reference in New Issue
Block a user