@@ -174,11 +174,11 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
174
174
// Non-power-of-two vectors have padding up to the next power-of-two.
175
175
// If we're a packed repr, remove the padding while keeping the alignment as close
176
176
// to a vector as possible.
177
- ( BackendRepr :: Memory { sized : true } , AbiAlign { abi : Align :: max_aligned_factor ( size) } )
177
+ ( BackendRepr :: Memory { sized : true } , Align :: max_aligned_factor ( size) )
178
178
} else {
179
179
( BackendRepr :: SimdVector { element : e_repr, count } , dl. llvmlike_vector_align ( size) )
180
180
} ;
181
- let size = size. align_to ( align. abi ) ;
181
+ let size = size. align_to ( align) ;
182
182
183
183
Ok ( LayoutData {
184
184
variants : Variants :: Single { index : VariantIdx :: new ( 0 ) } ,
@@ -190,7 +190,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
190
190
largest_niche : elt. largest_niche ,
191
191
uninhabited : false ,
192
192
size,
193
- align,
193
+ align : AbiAlign :: new ( align ) ,
194
194
max_repr_align : None ,
195
195
unadjusted_abi_align : elt. align . abi ,
196
196
randomization_seed : elt. randomization_seed . wrapping_add ( Hash64 :: new ( count) ) ,
@@ -388,7 +388,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
388
388
return Err ( LayoutCalculatorError :: UnexpectedUnsized ( * field) ) ;
389
389
}
390
390
391
- align = align. max ( field. align ) ;
391
+ align = align. max ( field. align . abi ) ;
392
392
max_repr_align = max_repr_align. max ( field. max_repr_align ) ;
393
393
size = cmp:: max ( size, field. size ) ;
394
394
@@ -423,13 +423,13 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
423
423
}
424
424
425
425
if let Some ( pack) = repr. pack {
426
- align = align. min ( AbiAlign :: new ( pack) ) ;
426
+ align = align. min ( pack) ;
427
427
}
428
428
// The unadjusted ABI alignment does not include repr(align), but does include repr(pack).
429
429
// See documentation on `LayoutData::unadjusted_abi_align`.
430
- let unadjusted_abi_align = align. abi ;
430
+ let unadjusted_abi_align = align;
431
431
if let Some ( repr_align) = repr. align {
432
- align = align. max ( AbiAlign :: new ( repr_align) ) ;
432
+ align = align. max ( repr_align) ;
433
433
}
434
434
// `align` must not be modified after this, or `unadjusted_abi_align` could be inaccurate.
435
435
let align = align;
@@ -441,14 +441,12 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
441
441
Ok ( Some ( ( repr, _) ) ) => match repr {
442
442
// Mismatched alignment (e.g. union is #[repr(packed)]): disable opt
443
443
BackendRepr :: Scalar ( _) | BackendRepr :: ScalarPair ( _, _)
444
- if repr. scalar_align ( dl) . unwrap ( ) != align. abi =>
444
+ if repr. scalar_align ( dl) . unwrap ( ) != align =>
445
445
{
446
446
BackendRepr :: Memory { sized : true }
447
447
}
448
448
// Vectors require at least element alignment, else disable the opt
449
- BackendRepr :: SimdVector { element, count : _ }
450
- if element. align ( dl) . abi > align. abi =>
451
- {
449
+ BackendRepr :: SimdVector { element, count : _ } if element. align ( dl) . abi > align => {
452
450
BackendRepr :: Memory { sized : true }
453
451
}
454
452
// the alignment tests passed and we can use this
@@ -474,8 +472,8 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
474
472
backend_repr,
475
473
largest_niche : None ,
476
474
uninhabited : false ,
477
- align,
478
- size : size. align_to ( align. abi ) ,
475
+ align : AbiAlign :: new ( align ) ,
476
+ size : size. align_to ( align) ,
479
477
max_repr_align,
480
478
unadjusted_abi_align,
481
479
randomization_seed : combined_seed,
@@ -611,15 +609,15 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
611
609
612
610
let mut align = dl. aggregate_align ;
613
611
let mut max_repr_align = repr. align ;
614
- let mut unadjusted_abi_align = align. abi ;
612
+ let mut unadjusted_abi_align = align;
615
613
616
614
let mut variant_layouts = variants
617
615
. iter_enumerated ( )
618
616
. map ( |( j, v) | {
619
617
let mut st = self . univariant ( v, repr, StructKind :: AlwaysSized ) . ok ( ) ?;
620
618
st. variants = Variants :: Single { index : j } ;
621
619
622
- align = align. max ( st. align ) ;
620
+ align = align. max ( st. align . abi ) ;
623
621
max_repr_align = max_repr_align. max ( st. max_repr_align ) ;
624
622
unadjusted_abi_align = unadjusted_abi_align. max ( st. unadjusted_abi_align ) ;
625
623
@@ -646,7 +644,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
646
644
let ( niche_start, niche_scalar) = niche. reserve ( dl, count) ?;
647
645
let niche_offset = niche. offset ;
648
646
let niche_size = niche. value . size ( dl) ;
649
- let size = variant_layouts[ largest_variant_index] . size . align_to ( align. abi ) ;
647
+ let size = variant_layouts[ largest_variant_index] . size . align_to ( align) ;
650
648
651
649
let all_variants_fit = variant_layouts. iter_enumerated_mut ( ) . all ( |( i, layout) | {
652
650
if i == largest_variant_index {
@@ -699,7 +697,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
699
697
. iter_enumerated ( )
700
698
. all ( |( i, layout) | i == largest_variant_index || layout. size == Size :: ZERO ) ;
701
699
let same_size = size == variant_layouts[ largest_variant_index] . size ;
702
- let same_align = align == variant_layouts[ largest_variant_index] . align ;
700
+ let same_align = align == variant_layouts[ largest_variant_index] . align . abi ;
703
701
704
702
let uninhabited = variant_layouts. iter ( ) . all ( |v| v. is_uninhabited ( ) ) ;
705
703
let abi = if same_size && same_align && others_zst {
@@ -746,7 +744,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
746
744
largest_niche,
747
745
uninhabited,
748
746
size,
749
- align,
747
+ align : AbiAlign :: new ( align ) ,
750
748
max_repr_align,
751
749
unadjusted_abi_align,
752
750
randomization_seed : combined_seed,
@@ -818,7 +816,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
818
816
819
817
let mut align = dl. aggregate_align ;
820
818
let mut max_repr_align = repr. align ;
821
- let mut unadjusted_abi_align = align. abi ;
819
+ let mut unadjusted_abi_align = align;
822
820
823
821
let mut size = Size :: ZERO ;
824
822
@@ -860,15 +858,15 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
860
858
}
861
859
}
862
860
size = cmp:: max ( size, st. size ) ;
863
- align = align. max ( st. align ) ;
861
+ align = align. max ( st. align . abi ) ;
864
862
max_repr_align = max_repr_align. max ( st. max_repr_align ) ;
865
863
unadjusted_abi_align = unadjusted_abi_align. max ( st. unadjusted_abi_align ) ;
866
864
Ok ( st)
867
865
} )
868
866
. collect :: < Result < IndexVec < VariantIdx , _ > , _ > > ( ) ?;
869
867
870
868
// Align the maximum variant size to the largest alignment.
871
- size = size. align_to ( align. abi ) ;
869
+ size = size. align_to ( align) ;
872
870
873
871
// FIXME(oli-obk): deduplicate and harden these checks
874
872
if size. bytes ( ) >= dl. obj_size_bound ( ) {
@@ -1042,7 +1040,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1042
1040
} ;
1043
1041
if pair_offsets[ FieldIdx :: new ( 0 ) ] == Size :: ZERO
1044
1042
&& pair_offsets[ FieldIdx :: new ( 1 ) ] == * offset
1045
- && align == pair. align
1043
+ && align == pair. align . abi
1046
1044
&& size == pair. size
1047
1045
{
1048
1046
// We can use `ScalarPair` only when it matches our
@@ -1066,7 +1064,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1066
1064
// Also need to bump up the size and alignment, so that the entire value fits
1067
1065
// in here.
1068
1066
variant. size = cmp:: max ( variant. size , size) ;
1069
- variant. align . abi = cmp:: max ( variant. align . abi , align. abi ) ;
1067
+ variant. align . abi = cmp:: max ( variant. align . abi , align) ;
1070
1068
}
1071
1069
}
1072
1070
}
@@ -1092,7 +1090,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1092
1090
largest_niche,
1093
1091
uninhabited,
1094
1092
backend_repr : abi,
1095
- align,
1093
+ align : AbiAlign :: new ( align ) ,
1096
1094
size,
1097
1095
max_repr_align,
1098
1096
unadjusted_abi_align,
@@ -1169,7 +1167,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1169
1167
// To allow unsizing `&Foo<Type>` -> `&Foo<dyn Trait>`, the layout of the struct must
1170
1168
// not depend on the layout of the tail.
1171
1169
let max_field_align =
1172
- fields_excluding_tail. iter ( ) . map ( |f| f. align . abi . bytes ( ) ) . max ( ) . unwrap_or ( 1 ) ;
1170
+ fields_excluding_tail. iter ( ) . map ( |f| f. align . bytes ( ) ) . max ( ) . unwrap_or ( 1 ) ;
1173
1171
let largest_niche_size = fields_excluding_tail
1174
1172
. iter ( )
1175
1173
. filter_map ( |f| f. largest_niche )
@@ -1189,7 +1187,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1189
1187
} else {
1190
1188
// Returns `log2(effective-align)`. The calculation assumes that size is an
1191
1189
// integer multiple of align, except for ZSTs.
1192
- let align = layout. align . abi . bytes ( ) ;
1190
+ let align = layout. align . bytes ( ) ;
1193
1191
let size = layout. size . bytes ( ) ;
1194
1192
let niche_size = layout. largest_niche . map ( |n| n. available ( dl) ) . unwrap_or ( 0 ) ;
1195
1193
// Group [u8; 4] with align-4 or [u8; 6] with align-2 fields.
@@ -1288,7 +1286,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1288
1286
if let StructKind :: Prefixed ( prefix_size, prefix_align) = kind {
1289
1287
let prefix_align =
1290
1288
if let Some ( pack) = pack { prefix_align. min ( pack) } else { prefix_align } ;
1291
- align = align. max ( AbiAlign :: new ( prefix_align) ) ;
1289
+ align = align. max ( prefix_align) ;
1292
1290
offset = prefix_size. align_to ( prefix_align) ;
1293
1291
}
1294
1292
for & i in & inverse_memory_index {
@@ -1312,7 +1310,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1312
1310
field. align
1313
1311
} ;
1314
1312
offset = offset. align_to ( field_align. abi ) ;
1315
- align = align. max ( field_align) ;
1313
+ align = align. max ( field_align. abi ) ;
1316
1314
max_repr_align = max_repr_align. max ( field. max_repr_align ) ;
1317
1315
1318
1316
debug ! ( "univariant offset: {:?} field: {:#?}" , offset, field) ;
@@ -1339,9 +1337,9 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1339
1337
1340
1338
// The unadjusted ABI alignment does not include repr(align), but does include repr(pack).
1341
1339
// See documentation on `LayoutData::unadjusted_abi_align`.
1342
- let unadjusted_abi_align = align. abi ;
1340
+ let unadjusted_abi_align = align;
1343
1341
if let Some ( repr_align) = repr. align {
1344
- align = align. max ( AbiAlign :: new ( repr_align) ) ;
1342
+ align = align. max ( repr_align) ;
1345
1343
}
1346
1344
// `align` must not be modified after this point, or `unadjusted_abi_align` could be inaccurate.
1347
1345
let align = align;
@@ -1360,7 +1358,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1360
1358
debug_assert ! ( inverse_memory_index. iter( ) . copied( ) . eq( fields. indices( ) ) ) ;
1361
1359
inverse_memory_index. into_iter ( ) . map ( |it| it. index ( ) as u32 ) . collect ( )
1362
1360
} ;
1363
- let size = min_size. align_to ( align. abi ) ;
1361
+ let size = min_size. align_to ( align) ;
1364
1362
// FIXME(oli-obk): deduplicate and harden these checks
1365
1363
if size. bytes ( ) >= dl. obj_size_bound ( ) {
1366
1364
return Err ( LayoutCalculatorError :: SizeOverflow ) ;
@@ -1383,8 +1381,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1383
1381
layout_of_single_non_zst_field = Some ( field) ;
1384
1382
1385
1383
// Field fills the struct and it has a scalar or scalar pair ABI.
1386
- if offsets[ i] . bytes ( ) == 0 && align. abi == field. align . abi && size == field. size
1387
- {
1384
+ if offsets[ i] . bytes ( ) == 0 && align == field. align . abi && size == field. size {
1388
1385
match field. backend_repr {
1389
1386
// For plain scalars, or vectors of them, we can't unpack
1390
1387
// newtypes for `#[repr(C)]`, as that affects C ABIs.
@@ -1428,7 +1425,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1428
1425
} ;
1429
1426
if offsets[ i] == pair_offsets[ FieldIdx :: new ( 0 ) ]
1430
1427
&& offsets[ j] == pair_offsets[ FieldIdx :: new ( 1 ) ]
1431
- && align == pair. align
1428
+ && align == pair. align . abi
1432
1429
&& size == pair. size
1433
1430
{
1434
1431
// We can use `ScalarPair` only when it matches our
@@ -1450,7 +1447,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1450
1447
Some ( l) => l. unadjusted_abi_align ,
1451
1448
None => {
1452
1449
// `repr(transparent)` with all ZST fields.
1453
- align. abi
1450
+ align
1454
1451
}
1455
1452
}
1456
1453
} else {
@@ -1465,7 +1462,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1465
1462
backend_repr : abi,
1466
1463
largest_niche,
1467
1464
uninhabited,
1468
- align,
1465
+ align : AbiAlign :: new ( align ) ,
1469
1466
size,
1470
1467
max_repr_align,
1471
1468
unadjusted_abi_align,
@@ -1488,7 +1485,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
1488
1485
for i in layout. fields . index_by_increasing_offset ( ) {
1489
1486
let offset = layout. fields . offset ( i) ;
1490
1487
let f = & fields[ FieldIdx :: new ( i) ] ;
1491
- write ! ( s, "[o{}a{}s{}" , offset. bytes( ) , f. align. abi . bytes( ) , f. size. bytes( ) ) . unwrap ( ) ;
1488
+ write ! ( s, "[o{}a{}s{}" , offset. bytes( ) , f. align. bytes( ) , f. size. bytes( ) ) . unwrap ( ) ;
1492
1489
if let Some ( n) = f. largest_niche {
1493
1490
write ! (
1494
1491
s,
0 commit comments