Skip to content

Commit fca4c69

Browse files
committed
Replace NullOp::SizeOf and NullOp::AlignOf by lang items.
1 parent 3f2a592 commit fca4c69

File tree

81 files changed

+598
-698
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+598
-698
lines changed

compiler/rustc_borrowck/src/type_check/mod.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,16 +1046,6 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
10461046
}
10471047
}
10481048

1049-
&Rvalue::NullaryOp(NullOp::SizeOf | NullOp::AlignOf, ty) => {
1050-
let trait_ref =
1051-
ty::TraitRef::new(tcx, tcx.require_lang_item(LangItem::Sized, span), [ty]);
1052-
1053-
self.prove_trait_ref(
1054-
trait_ref,
1055-
location.to_locations(),
1056-
ConstraintCategory::SizedBound,
1057-
);
1058-
}
10591049
&Rvalue::NullaryOp(NullOp::ContractChecks, _) => {}
10601050
&Rvalue::NullaryOp(NullOp::UbChecks, _) => {}
10611051

compiler/rustc_codegen_cranelift/example/example.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,6 @@ pub fn debug_tuple() -> DebugTuple {
7272
DebugTuple(())
7373
}
7474

75-
pub fn size_of<T>() -> usize {
76-
intrinsics::size_of::<T>()
77-
}
78-
7975
pub fn use_size_of() -> usize {
8076
size_of::<u64>()
8177
}

compiler/rustc_codegen_cranelift/example/mini_core.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
extern_types,
77
decl_macro,
88
rustc_attrs,
9+
rustc_private,
910
transparent_unions,
1011
auto_traits,
1112
freeze_impls,
@@ -594,7 +595,7 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Box<U>> for Box<T> {}
594595
impl<T> Box<T> {
595596
pub fn new(val: T) -> Box<T> {
596597
unsafe {
597-
let size = intrinsics::size_of::<T>();
598+
let size = size_of::<T>();
598599
let ptr = libc::malloc(size);
599600
intrinsics::copy(&val as *const T as *const u8, ptr, size);
600601
Box(Unique { pointer: NonNull(ptr as *const T), _marker: PhantomData }, Global)
@@ -646,11 +647,11 @@ pub mod intrinsics {
646647
#[rustc_intrinsic]
647648
pub fn abort() -> !;
648649
#[rustc_intrinsic]
649-
pub fn size_of<T>() -> usize;
650+
pub const fn size_of<T>() -> usize;
650651
#[rustc_intrinsic]
651652
pub unsafe fn size_of_val<T: ?::Sized>(val: *const T) -> usize;
652653
#[rustc_intrinsic]
653-
pub fn align_of<T>() -> usize;
654+
pub const fn align_of<T>() -> usize;
654655
#[rustc_intrinsic]
655656
pub unsafe fn align_of_val<T: ?::Sized>(val: *const T) -> usize;
656657
#[rustc_intrinsic]
@@ -715,6 +716,23 @@ impl<T> Index<usize> for [T] {
715716
}
716717
}
717718

719+
pub const fn size_of<T>() -> usize {
720+
const { intrinsics::size_of::<T>() }
721+
}
722+
723+
pub const fn align_of<T>() -> usize {
724+
const { intrinsics::align_of::<T>() }
725+
}
726+
727+
trait SizedTypeProperties: Sized {
728+
#[lang = "mem_size_const"]
729+
const SIZE: usize = intrinsics::size_of::<Self>();
730+
731+
#[lang = "mem_align_const"]
732+
const ALIGN: usize = intrinsics::align_of::<Self>();
733+
}
734+
impl<T> SizedTypeProperties for T {}
735+
718736
extern "C" {
719737
type VaListImpl;
720738
}

compiler/rustc_codegen_cranelift/example/mini_core_hello_world.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ fn start<T: Termination + 'static>(
109109
puts(*argv as *const i8);
110110
}
111111
unsafe {
112-
puts(*((argv as usize + intrinsics::size_of::<*const u8>()) as *const *const i8));
112+
puts(*((argv as usize + size_of::<*const u8>()) as *const *const i8));
113113
}
114114
unsafe {
115-
puts(*((argv as usize + 2 * intrinsics::size_of::<*const u8>()) as *const *const i8));
115+
puts(*((argv as usize + 2 * size_of::<*const u8>()) as *const *const i8));
116116
}
117117
}
118118

@@ -213,8 +213,8 @@ fn main() {
213213
assert_eq!(intrinsics::size_of_val(a) as u8, 16);
214214
assert_eq!(intrinsics::size_of_val(&0u32) as u8, 4);
215215

216-
assert_eq!(intrinsics::align_of::<u16>() as u8, 2);
217-
assert_eq!(intrinsics::align_of_val(&a) as u8, intrinsics::align_of::<&str>() as u8);
216+
assert_eq!(align_of::<u16>() as u8, 2);
217+
assert_eq!(intrinsics::align_of_val(&a) as u8, align_of::<&str>() as u8);
218218

219219
let u8_needs_drop = const { intrinsics::needs_drop::<u8>() };
220220
assert!(!u8_needs_drop);

compiler/rustc_codegen_cranelift/src/base.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -840,8 +840,6 @@ fn codegen_stmt<'tcx>(fx: &mut FunctionCx<'_, '_, 'tcx>, cur_block: Block, stmt:
840840
assert!(lval.layout().ty.is_sized(fx.tcx, fx.typing_env()));
841841
let layout = fx.layout_of(fx.monomorphize(ty));
842842
let val = match null_op {
843-
NullOp::SizeOf => layout.size.bytes(),
844-
NullOp::AlignOf => layout.align.bytes(),
845843
NullOp::OffsetOf(fields) => fx
846844
.tcx
847845
.offset_of_subfield(

compiler/rustc_codegen_ssa/src/mir/rvalue.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -611,16 +611,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
611611
let ty = self.monomorphize(ty);
612612
let layout = bx.cx().layout_of(ty);
613613
let val = match null_op {
614-
mir::NullOp::SizeOf => {
615-
assert!(bx.cx().type_is_sized(ty));
616-
let val = layout.size.bytes();
617-
bx.cx().const_usize(val)
618-
}
619-
mir::NullOp::AlignOf => {
620-
assert!(bx.cx().type_is_sized(ty));
621-
let val = layout.align.bytes();
622-
bx.cx().const_usize(val)
623-
}
624614
mir::NullOp::OffsetOf(fields) => {
625615
let val = bx
626616
.tcx()

compiler/rustc_const_eval/src/check_consts/check.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -646,11 +646,7 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
646646
Rvalue::Cast(_, _, _) => {}
647647

648648
Rvalue::NullaryOp(
649-
NullOp::SizeOf
650-
| NullOp::AlignOf
651-
| NullOp::OffsetOf(_)
652-
| NullOp::UbChecks
653-
| NullOp::ContractChecks,
649+
NullOp::OffsetOf(_) | NullOp::UbChecks | NullOp::ContractChecks,
654650
_,
655651
) => {}
656652
Rvalue::ShallowInitBox(_, _) => {}

compiler/rustc_const_eval/src/interpret/intrinsics.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,24 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
156156
let b_ty = self.read_type_id(&args[1])?;
157157
self.write_scalar(Scalar::from_bool(a_ty == b_ty), dest)?;
158158
}
159+
sym::size_of => {
160+
let tp_ty = instance.args.type_at(0);
161+
let layout = self.layout_of(tp_ty)?;
162+
if !layout.is_sized() {
163+
span_bug!(self.cur_span(), "unsized type for `size_of`");
164+
}
165+
let val = layout.size.bytes();
166+
self.write_scalar(Scalar::from_target_usize(val, self), dest)?;
167+
}
168+
sym::align_of => {
169+
let tp_ty = instance.args.type_at(0);
170+
let layout = self.layout_of(tp_ty)?;
171+
if !layout.is_sized() {
172+
span_bug!(self.cur_span(), "unsized type for `align_of`");
173+
}
174+
let val = layout.align.bytes();
175+
self.write_scalar(Scalar::from_target_usize(val, self), dest)?;
176+
}
159177
sym::variant_count => {
160178
let tp_ty = instance.args.type_at(0);
161179
let ty = match tp_ty.kind() {

compiler/rustc_const_eval/src/interpret/operator.rs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -517,20 +517,6 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
517517
let usize_layout = || self.layout_of(self.tcx.types.usize).unwrap();
518518

519519
interp_ok(match null_op {
520-
SizeOf => {
521-
if !layout.is_sized() {
522-
span_bug!(self.cur_span(), "unsized type for `NullaryOp::SizeOf`");
523-
}
524-
let val = layout.size.bytes();
525-
ImmTy::from_uint(val, usize_layout())
526-
}
527-
AlignOf => {
528-
if !layout.is_sized() {
529-
span_bug!(self.cur_span(), "unsized type for `NullaryOp::AlignOf`");
530-
}
531-
let val = layout.align.bytes();
532-
ImmTy::from_uint(val, usize_layout())
533-
}
534520
OffsetOf(fields) => {
535521
let val =
536522
self.tcx.offset_of_subfield(self.typing_env, layout, fields.iter()).bytes();

compiler/rustc_hir/src/lang_items.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ language_item_table! {
168168
MetaSized, sym::meta_sized, meta_sized_trait, Target::Trait, GenericRequirement::Exact(0);
169169
PointeeSized, sym::pointee_sized, pointee_sized_trait, Target::Trait, GenericRequirement::Exact(0);
170170
Unsize, sym::unsize, unsize_trait, Target::Trait, GenericRequirement::Minimum(1);
171+
AlignOf, sym::mem_align_const, align_const, Target::AssocConst, GenericRequirement::Exact(0);
172+
SizeOf, sym::mem_size_const, size_const, Target::AssocConst, GenericRequirement::Exact(0);
171173
/// Trait injected by `#[derive(PartialEq)]`, (i.e. "Partial EQ").
172174
StructuralPeq, sym::structural_peq, structural_peq_trait, Target::Trait, GenericRequirement::None;
173175
Copy, sym::copy, copy_trait, Target::Trait, GenericRequirement::Exact(0);

0 commit comments

Comments
 (0)