Skip to content

Commit 14a8b0a

Browse files
committed
LayoutDetails.pref_pos
1 parent 35f23fa commit 14a8b0a

Some content is hidden

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

56 files changed

+327
-319
lines changed

src/librustc/mir/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,7 @@ impl<'tcx> TerminatorKind<'tcx> {
15021502
SwitchInt { ref values, switch_ty, .. } => ty::tls::with(|tcx| {
15031503
let param_env = ty::ParamEnv::empty();
15041504
let switch_ty = tcx.lift(&switch_ty).unwrap();
1505-
let size = tcx.layout_of(param_env.and(switch_ty)).unwrap().size;
1505+
let size = tcx.layout_of(param_env.and(switch_ty)).unwrap().pref_pos.size;
15061506
values
15071507
.iter()
15081508
.map(|&u| {

src/librustc/ty/layout.rs

Lines changed: 81 additions & 80 deletions
Large diffs are not rendered by default.

src/librustc/ty/print/pretty.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,7 @@ pub trait PrettyPrinter<'tcx>:
910910
let ty = self.tcx().lift(&ct.ty).unwrap();
911911
let size = self.tcx().layout_of(ty::ParamEnv::empty().and(ty))
912912
.unwrap()
913+
.pref_pos
913914
.size;
914915
let i_str = i.name_str();
915916
match data {

src/librustc/ty/sty.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2276,7 +2276,7 @@ impl<'tcx> Const<'tcx> {
22762276
pub fn from_bits(tcx: TyCtxt<'tcx>, bits: u128, ty: ParamEnvAnd<'tcx, Ty<'tcx>>) -> &'tcx Self {
22772277
let size = tcx.layout_of(ty).unwrap_or_else(|e| {
22782278
panic!("could not compute layout for {:?}: {:?}", ty, e)
2279-
}).size;
2279+
}).pref_pos.size;
22802280
Self::from_scalar(tcx, Scalar::from_uint(bits, size), ty.value)
22812281
}
22822282

@@ -2303,7 +2303,7 @@ impl<'tcx> Const<'tcx> {
23032303
ty: Ty<'tcx>,
23042304
) -> Option<u128> {
23052305
assert_eq!(self.ty, ty);
2306-
let size = tcx.layout_of(param_env.with_reveal_all().and(ty)).ok()?.size;
2306+
let size = tcx.layout_of(param_env.with_reveal_all().and(ty)).ok()?.pref_pos.size;
23072307
// if `ty` does not depend on generic parameters, use an empty param_env
23082308
self.eval(tcx, param_env).val.try_to_bits(size)
23092309
}

src/librustc_codegen_llvm/abi.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ impl ArgAbiExt<'ll, 'tcx> for ArgAbi<'tcx, Ty<'tcx>> {
200200
return;
201201
}
202202
if self.is_sized_indirect() {
203-
OperandValue::Ref(val, None, self.layout.align.abi).store(bx, dst)
203+
OperandValue::Ref(val, None, self.layout.pref_pos.align.abi).store(bx, dst)
204204
} else if self.is_unsized_indirect() {
205205
bug!("unsized ArgAbi must be handled through store_fn_arg");
206206
} else if let PassMode::Cast(cast) = self.mode {
@@ -210,7 +210,7 @@ impl ArgAbiExt<'ll, 'tcx> for ArgAbi<'tcx, Ty<'tcx>> {
210210
if can_store_through_cast_ptr {
211211
let cast_ptr_llty = bx.type_ptr_to(cast.llvm_type(bx));
212212
let cast_dst = bx.pointercast(dst.llval, cast_ptr_llty);
213-
bx.store(val, cast_dst, self.layout.align.abi);
213+
bx.store(val, cast_dst, self.layout.pref_pos.align.abi);
214214
} else {
215215
// The actual return type is a struct, but the ABI
216216
// adaptation code has cast it into some scalar type. The
@@ -238,10 +238,10 @@ impl ArgAbiExt<'ll, 'tcx> for ArgAbi<'tcx, Ty<'tcx>> {
238238
// ...and then memcpy it to the intended destination.
239239
bx.memcpy(
240240
dst.llval,
241-
self.layout.align.abi,
241+
self.layout.pref_pos.align.abi,
242242
llscratch,
243243
scratch_align,
244-
bx.const_usize(self.layout.size.bytes()),
244+
bx.const_usize(self.layout.pref_pos.size.bytes()),
245245
MemFlags::empty()
246246
);
247247

@@ -269,7 +269,8 @@ impl ArgAbiExt<'ll, 'tcx> for ArgAbi<'tcx, Ty<'tcx>> {
269269
OperandValue::Pair(next(), next()).store(bx, dst);
270270
}
271271
PassMode::Indirect(_, Some(_)) => {
272-
OperandValue::Ref(next(), Some(next()), self.layout.align.abi).store(bx, dst);
272+
let align = self.layout.pref_pos.align.abi;
273+
OperandValue::Ref(next(), Some(next()), align).store(bx, dst);
273274
}
274275
PassMode::Direct(_) | PassMode::Indirect(_, None) | PassMode::Cast(_) => {
275276
let next_arg = next();

src/librustc_codegen_llvm/builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
546546
let keep_going = header_bx.icmp(IntPredicate::IntNE, current, end);
547547
header_bx.cond_br(keep_going, body_bx.llbb(), next_bx.llbb());
548548

549-
let align = dest.align.restrict_for_offset(dest.layout.field(self.cx(), 0).size);
549+
let align = dest.align.restrict_for_offset(dest.layout.field(self.cx(), 0).pref_pos.size);
550550
cg_elem.val.store(&mut body_bx,
551551
PlaceRef::new_sized_aligned(current, cg_elem.layout, align));
552552

src/librustc_codegen_llvm/common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,9 +314,9 @@ impl ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> {
314314
alloc: &Allocation,
315315
offset: Size,
316316
) -> PlaceRef<'tcx, &'ll Value> {
317-
assert_eq!(alloc.align, layout.align.abi);
317+
assert_eq!(alloc.align, layout.pref_pos.align.abi);
318318
let llty = self.type_ptr_to(layout.llvm_type(self));
319-
let llval = if layout.size == Size::ZERO {
319+
let llval = if layout.pref_pos.size == Size::ZERO {
320320
let llval = self.const_usize(alloc.align.bytes());
321321
unsafe { llvm::LLVMConstIntToPtr(llval, llty) }
322322
} else {

src/librustc_codegen_llvm/debuginfo/metadata.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -496,17 +496,17 @@ fn trait_pointer_metadata(
496496
cx.tcx.mk_mut_ptr(cx.tcx.types.u8),
497497
syntax_pos::DUMMY_SP),
498498
offset: layout.fields.offset(0),
499-
size: data_ptr_field.size,
500-
align: data_ptr_field.align.abi,
499+
size: data_ptr_field.pref_pos.size,
500+
align: data_ptr_field.pref_pos.align.abi,
501501
flags: DIFlags::FlagArtificial,
502502
discriminant: None,
503503
},
504504
MemberDescription {
505505
name: "vtable".to_owned(),
506506
type_metadata: type_metadata(cx, vtable_field.ty, syntax_pos::DUMMY_SP),
507507
offset: layout.fields.offset(1),
508-
size: vtable_field.size,
509-
align: vtable_field.align.abi,
508+
size: vtable_field.pref_pos.size,
509+
align: vtable_field.pref_pos.align.abi,
510510
flags: DIFlags::FlagArtificial,
511511
discriminant: None,
512512
},
@@ -1128,8 +1128,8 @@ impl<'tcx> StructMemberDescriptionFactory<'tcx> {
11281128
name,
11291129
type_metadata: type_metadata(cx, field.ty, self.span),
11301130
offset: layout.fields.offset(i),
1131-
size: field.size,
1132-
align: field.align.abi,
1131+
size: field.pref_pos.size,
1132+
align: field.pref_pos.align.abi,
11331133
flags: DIFlags::FlagZero,
11341134
discriminant: None,
11351135
}
@@ -1252,8 +1252,8 @@ impl<'tcx> UnionMemberDescriptionFactory<'tcx> {
12521252
name: f.ident.to_string(),
12531253
type_metadata: type_metadata(cx, field.ty, self.span),
12541254
offset: Size::ZERO,
1255-
size: field.size,
1256-
align: field.align.abi,
1255+
size: field.pref_pos.size,
1256+
align: field.pref_pos.align.abi,
12571257
flags: DIFlags::FlagZero,
12581258
discriminant: None,
12591259
}
@@ -1386,8 +1386,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
13861386
},
13871387
type_metadata: variant_type_metadata,
13881388
offset: Size::ZERO,
1389-
size: self.layout.size,
1390-
align: self.layout.align.abi,
1389+
size: self.layout.pref_pos.size,
1390+
align: self.layout.pref_pos.align.abi,
13911391
flags: DIFlags::FlagZero,
13921392
discriminant: None,
13931393
}
@@ -1435,8 +1435,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14351435
},
14361436
type_metadata: variant_type_metadata,
14371437
offset: Size::ZERO,
1438-
size: self.layout.size,
1439-
align: self.layout.align.abi,
1438+
size: self.layout.pref_pos.size,
1439+
align: self.layout.pref_pos.align.abi,
14401440
flags: DIFlags::FlagZero,
14411441
discriminant: Some(
14421442
self.layout.ty.discriminant_for_variant(cx.tcx, i).unwrap().val as u64
@@ -1490,7 +1490,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14901490
}
14911491
let inner_offset = offset - field_offset;
14921492
let field = layout.field(cx, i);
1493-
if inner_offset + size <= field.size {
1493+
if inner_offset + size <= field.pref_pos.size {
14941494
write!(name, "{}$", i).unwrap();
14951495
compute_field_path(cx, name, field, inner_offset, size);
14961496
}
@@ -1499,7 +1499,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14991499
compute_field_path(cx, &mut name,
15001500
self.layout,
15011501
self.layout.fields.offset(discr_index),
1502-
self.layout.field(cx, discr_index).size);
1502+
self.layout.field(cx, discr_index).pref_pos.size);
15031503
variant_info_for(*niche_variants.start()).map_struct_name(|variant_name| {
15041504
name.push_str(variant_name);
15051505
});
@@ -1510,8 +1510,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15101510
name,
15111511
type_metadata: variant_type_metadata,
15121512
offset: Size::ZERO,
1513-
size: variant.size,
1514-
align: variant.align.abi,
1513+
size: variant.pref_pos.size,
1514+
align: variant.pref_pos.align.abi,
15151515
flags: DIFlags::FlagZero,
15161516
discriminant: None,
15171517
}
@@ -1554,8 +1554,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15541554
name: variant_info.variant_name(),
15551555
type_metadata: variant_type_metadata,
15561556
offset: Size::ZERO,
1557-
size: self.layout.size,
1558-
align: self.layout.align.abi,
1557+
size: self.layout.pref_pos.size,
1558+
align: self.layout.pref_pos.align.abi,
15591559
flags: DIFlags::FlagZero,
15601560
discriminant: niche_value,
15611561
}
@@ -1859,8 +1859,8 @@ fn prepare_enum_metadata(
18591859
enum_name.as_ptr(),
18601860
file_metadata,
18611861
UNKNOWN_LINE_NUMBER,
1862-
layout.size.bits(),
1863-
layout.align.abi.bits() as u32,
1862+
layout.pref_pos.size.bits(),
1863+
layout.pref_pos.align.abi.bits() as u32,
18641864
DIFlags::FlagZero,
18651865
None,
18661866
0, // RuntimeLang
@@ -1980,8 +1980,8 @@ fn prepare_enum_metadata(
19801980
ptr::null_mut(),
19811981
file_metadata,
19821982
UNKNOWN_LINE_NUMBER,
1983-
layout.size.bits(),
1984-
layout.align.abi.bits() as u32,
1983+
layout.pref_pos.size.bits(),
1984+
layout.pref_pos.align.abi.bits() as u32,
19851985
DIFlags::FlagZero,
19861986
discriminator_metadata,
19871987
empty_array,
@@ -1998,8 +1998,8 @@ fn prepare_enum_metadata(
19981998
enum_name.as_ptr(),
19991999
file_metadata,
20002000
UNKNOWN_LINE_NUMBER,
2001-
layout.size.bits(),
2002-
layout.align.abi.bits() as u32,
2001+
layout.pref_pos.size.bits(),
2002+
layout.pref_pos.align.abi.bits() as u32,
20032003
DIFlags::FlagZero,
20042004
None,
20052005
type_array,

src/librustc_codegen_llvm/type_of.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn uncached_llvm_type<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
2323
// x86_mmx" type. In general there shouldn't be a need for other
2424
// one-element SIMD vectors, so it's assumed this won't clash with
2525
// much else.
26-
let use_x86_mmx = count == 1 && layout.size.bits() == 64 &&
26+
let use_x86_mmx = count == 1 && layout.pref_pos.size.bits() == 64 &&
2727
(cx.sess().target.target.arch == "x86" ||
2828
cx.sess().target.target.arch == "x86_64");
2929
if use_x86_mmx {
@@ -74,7 +74,7 @@ fn uncached_llvm_type<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
7474

7575
match layout.fields {
7676
layout::FieldPlacement::Union(_) => {
77-
let fill = cx.type_padding_filler(layout.size, layout.align.abi);
77+
let fill = cx.type_padding_filler(layout.pref_pos.size, layout.pref_pos.align.abi);
7878
let packed = false;
7979
match name {
8080
None => {
@@ -114,15 +114,15 @@ fn struct_llfields<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
114114

115115
let mut packed = false;
116116
let mut offset = Size::ZERO;
117-
let mut prev_effective_align = layout.align.abi;
117+
let mut prev_effective_align = layout.pref_pos.align.abi;
118118
let mut result: Vec<_> = Vec::with_capacity(1 + field_count * 2);
119119
for i in layout.fields.index_by_increasing_offset() {
120120
let target_offset = layout.fields.offset(i as usize);
121121
let field = layout.field(cx, i);
122-
let effective_field_align = layout.align.abi
123-
.min(field.align.abi)
122+
let effective_field_align = layout.pref_pos.align.abi
123+
.min(field.pref_pos.align.abi)
124124
.restrict_for_offset(target_offset);
125-
packed |= effective_field_align < field.align.abi;
125+
packed |= effective_field_align < field.pref_pos.align.abi;
126126

127127
debug!("struct_llfields: {}: {:?} offset: {:?} target_offset: {:?} \
128128
effective_field_align: {}",
@@ -135,41 +135,41 @@ fn struct_llfields<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
135135
debug!(" padding before: {:?}", padding);
136136

137137
result.push(field.llvm_type(cx));
138-
offset = target_offset + field.size;
138+
offset = target_offset + field.pref_pos.size;
139139
prev_effective_align = effective_field_align;
140140
}
141141
if !layout.is_unsized() && field_count > 0 {
142-
if offset > layout.size {
142+
if offset > layout.pref_pos.size {
143143
bug!("layout: {:#?} stride: {:?} offset: {:?}",
144-
layout, layout.size, offset);
144+
layout, layout.pref_pos.size, offset);
145145
}
146-
let padding = layout.size - offset;
146+
let padding = layout.pref_pos.size - offset;
147147
let padding_align = prev_effective_align;
148-
assert_eq!(offset.align_to(padding_align) + padding, layout.size);
148+
assert_eq!(offset.align_to(padding_align) + padding, layout.pref_pos.size);
149149
debug!("struct_llfields: pad_bytes: {:?} offset: {:?} stride: {:?}",
150-
padding, offset, layout.size);
150+
padding, offset, layout.pref_pos.size);
151151
result.push(cx.type_padding_filler(padding, padding_align));
152152
assert_eq!(result.len(), 1 + field_count * 2);
153153
} else {
154154
debug!("struct_llfields: offset: {:?} stride: {:?}",
155-
offset, layout.size);
155+
offset, layout.pref_pos.size);
156156
}
157157

158158
(result, packed)
159159
}
160160

161161
impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
162162
pub fn align_of(&self, ty: Ty<'tcx>) -> Align {
163-
self.layout_of(ty).align.abi
163+
self.layout_of(ty).pref_pos.align.abi
164164
}
165165

166166
pub fn size_of(&self, ty: Ty<'tcx>) -> Size {
167-
self.layout_of(ty).size
167+
self.layout_of(ty).pref_pos.size
168168
}
169169

170170
pub fn size_and_align_of(&self, ty: Ty<'tcx>) -> (Size, Align) {
171171
let layout = self.layout_of(ty);
172-
(layout.size, layout.align.abi)
172+
(layout.pref_pos.size, layout.pref_pos.align.abi)
173173
}
174174
}
175175

src/librustc_codegen_llvm/va_arg.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ fn emit_ptr_va_arg(
7575
bx.cx.data_layout().pointer_pos.align)
7676
} else {
7777
(layout.llvm_type(bx.cx),
78-
layout.size,
79-
layout.align)
78+
layout.pref_pos.size,
79+
layout.pref_pos.align)
8080
};
8181
let (addr, addr_align) = emit_direct_ptr_va_arg(bx, list, llty, size, align.abi,
8282
slot_size, allow_higher_align);

0 commit comments

Comments
 (0)