Rollup merge of #137601 - davidtwco:deduplicate-type-has-metadata, r=fmease,bjorn3
ssa/mono: deduplicate `type_has_metadata` The implementation of the `type_has_metadata` function is duplicated in `rustc_codegen_ssa` and `rustc_monomorphize`, so move this to `rustc_middle`.
This commit is contained in:
commit
51085b21ce
5 changed files with 24 additions and 30 deletions
|
@ -2,7 +2,7 @@ use rustc_abi::Primitive::{Int, Pointer};
|
||||||
use rustc_abi::{Align, BackendRepr, FieldsShape, Size, TagEncoding, VariantIdx, Variants};
|
use rustc_abi::{Align, BackendRepr, FieldsShape, Size, TagEncoding, VariantIdx, Variants};
|
||||||
use rustc_middle::mir::PlaceTy;
|
use rustc_middle::mir::PlaceTy;
|
||||||
use rustc_middle::mir::interpret::Scalar;
|
use rustc_middle::mir::interpret::Scalar;
|
||||||
use rustc_middle::ty::layout::{HasTyCtxt, LayoutOf, TyAndLayout};
|
use rustc_middle::ty::layout::{HasTyCtxt, HasTypingEnv, LayoutOf, TyAndLayout};
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
use rustc_middle::{bug, mir};
|
use rustc_middle::{bug, mir};
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
@ -168,7 +168,11 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
|
||||||
};
|
};
|
||||||
let val = PlaceValue {
|
let val = PlaceValue {
|
||||||
llval,
|
llval,
|
||||||
llextra: if bx.cx().type_has_metadata(field.ty) { self.val.llextra } else { None },
|
llextra: if bx.cx().tcx().type_has_metadata(field.ty, bx.cx().typing_env()) {
|
||||||
|
self.val.llextra
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
},
|
||||||
align: effective_field_align,
|
align: effective_field_align,
|
||||||
};
|
};
|
||||||
val.with_type(field)
|
val.with_type(field)
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::assert_matches::assert_matches;
|
||||||
use arrayvec::ArrayVec;
|
use arrayvec::ArrayVec;
|
||||||
use rustc_abi::{self as abi, FIRST_VARIANT, FieldIdx};
|
use rustc_abi::{self as abi, FIRST_VARIANT, FieldIdx};
|
||||||
use rustc_middle::ty::adjustment::PointerCoercion;
|
use rustc_middle::ty::adjustment::PointerCoercion;
|
||||||
use rustc_middle::ty::layout::{HasTyCtxt, LayoutOf, TyAndLayout};
|
use rustc_middle::ty::layout::{HasTyCtxt, HasTypingEnv, LayoutOf, TyAndLayout};
|
||||||
use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
|
||||||
use rustc_middle::{bug, mir, span_bug};
|
use rustc_middle::{bug, mir, span_bug};
|
||||||
use rustc_session::config::OptLevel;
|
use rustc_session::config::OptLevel;
|
||||||
|
@ -878,7 +878,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||||
|
|
||||||
let ty = cg_place.layout.ty;
|
let ty = cg_place.layout.ty;
|
||||||
assert!(
|
assert!(
|
||||||
if bx.cx().type_has_metadata(ty) {
|
if bx.cx().tcx().type_has_metadata(ty, bx.cx().typing_env()) {
|
||||||
matches!(val, OperandValue::Pair(..))
|
matches!(val, OperandValue::Pair(..))
|
||||||
} else {
|
} else {
|
||||||
matches!(val, OperandValue::Immediate(..))
|
matches!(val, OperandValue::Immediate(..))
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use rustc_abi::{AddressSpace, Float, Integer, Reg};
|
use rustc_abi::{AddressSpace, Float, Integer, Reg};
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
|
use rustc_middle::ty::Ty;
|
||||||
use rustc_middle::ty::layout::{HasTyCtxt, HasTypingEnv, TyAndLayout};
|
use rustc_middle::ty::layout::{HasTyCtxt, HasTypingEnv, TyAndLayout};
|
||||||
use rustc_middle::ty::{self, Ty};
|
|
||||||
use rustc_target::callconv::{ArgAbi, CastTarget, FnAbi};
|
use rustc_target::callconv::{ArgAbi, CastTarget, FnAbi};
|
||||||
|
|
||||||
use super::BackendTypes;
|
use super::BackendTypes;
|
||||||
|
@ -84,19 +84,6 @@ pub trait DerivedTypeCodegenMethods<'tcx>:
|
||||||
fn type_is_freeze(&self, ty: Ty<'tcx>) -> bool {
|
fn type_is_freeze(&self, ty: Ty<'tcx>) -> bool {
|
||||||
ty.is_freeze(self.tcx(), self.typing_env())
|
ty.is_freeze(self.tcx(), self.typing_env())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_has_metadata(&self, ty: Ty<'tcx>) -> bool {
|
|
||||||
if ty.is_sized(self.tcx(), self.typing_env()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let tail = self.tcx().struct_tail_for_codegen(ty, self.typing_env());
|
|
||||||
match tail.kind() {
|
|
||||||
ty::Foreign(..) => false,
|
|
||||||
ty::Str | ty::Slice(..) | ty::Dynamic(..) => true,
|
|
||||||
_ => bug!("unexpected unsized tail: {:?}", tail),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx, T> DerivedTypeCodegenMethods<'tcx> for T where
|
impl<'tcx, T> DerivedTypeCodegenMethods<'tcx> for T where
|
||||||
|
|
|
@ -208,6 +208,20 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
tcx.struct_tail_raw(ty, |ty| tcx.normalize_erasing_regions(typing_env, ty), || {})
|
tcx.struct_tail_raw(ty, |ty| tcx.normalize_erasing_regions(typing_env, ty), || {})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if a type has metadata.
|
||||||
|
pub fn type_has_metadata(self, ty: Ty<'tcx>, typing_env: ty::TypingEnv<'tcx>) -> bool {
|
||||||
|
if ty.is_sized(self, typing_env) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let tail = self.struct_tail_for_codegen(ty, typing_env);
|
||||||
|
match tail.kind() {
|
||||||
|
ty::Foreign(..) => false,
|
||||||
|
ty::Str | ty::Slice(..) | ty::Dynamic(..) => true,
|
||||||
|
_ => bug!("unexpected unsized tail: {:?}", tail),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the deeply last field of nested structures, or the same type if
|
/// Returns the deeply last field of nested structures, or the same type if
|
||||||
/// not a structure at all. Corresponds to the only possible unsized field,
|
/// not a structure at all. Corresponds to the only possible unsized field,
|
||||||
/// and its type can be used to determine unsizing strategy.
|
/// and its type can be used to determine unsizing strategy.
|
||||||
|
|
|
@ -1043,18 +1043,7 @@ fn find_vtable_types_for_unsizing<'tcx>(
|
||||||
) -> (Ty<'tcx>, Ty<'tcx>) {
|
) -> (Ty<'tcx>, Ty<'tcx>) {
|
||||||
let ptr_vtable = |inner_source: Ty<'tcx>, inner_target: Ty<'tcx>| {
|
let ptr_vtable = |inner_source: Ty<'tcx>, inner_target: Ty<'tcx>| {
|
||||||
let typing_env = ty::TypingEnv::fully_monomorphized();
|
let typing_env = ty::TypingEnv::fully_monomorphized();
|
||||||
let type_has_metadata = |ty: Ty<'tcx>| -> bool {
|
if tcx.type_has_metadata(inner_source, typing_env) {
|
||||||
if ty.is_sized(tcx.tcx, typing_env) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
let tail = tcx.struct_tail_for_codegen(ty, typing_env);
|
|
||||||
match tail.kind() {
|
|
||||||
ty::Foreign(..) => false,
|
|
||||||
ty::Str | ty::Slice(..) | ty::Dynamic(..) => true,
|
|
||||||
_ => bug!("unexpected unsized tail: {:?}", tail),
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if type_has_metadata(inner_source) {
|
|
||||||
(inner_source, inner_target)
|
(inner_source, inner_target)
|
||||||
} else {
|
} else {
|
||||||
tcx.struct_lockstep_tails_for_codegen(inner_source, inner_target, typing_env)
|
tcx.struct_lockstep_tails_for_codegen(inner_source, inner_target, typing_env)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue