@@ -101,8 +101,7 @@ fn struct_llfields<'a, 'tcx>(
101
101
let mut offset = Size :: ZERO ;
102
102
let mut prev_effective_align = layout. align . abi ;
103
103
let mut result: Vec < _ > = Vec :: with_capacity ( 1 + field_count * 2 ) ;
104
- let mut projection = vec ! [ 0 ; field_count] ;
105
- let mut padding_used = false ;
104
+ let mut field_remapping = vec ! [ 0 ; field_count] ;
106
105
for i in layout. fields . index_by_increasing_offset ( ) {
107
106
let target_offset = layout. fields . offset ( i as usize ) ;
108
107
let field = layout. field ( cx, i) ;
@@ -122,17 +121,17 @@ fn struct_llfields<'a, 'tcx>(
122
121
assert ! ( target_offset >= offset) ;
123
122
let padding = target_offset - offset;
124
123
if padding != Size :: ZERO {
125
- padding_used = true ;
126
124
let padding_align = prev_effective_align. min ( effective_field_align) ;
127
125
assert_eq ! ( offset. align_to( padding_align) + padding, target_offset) ;
128
126
result. push ( cx. type_padding_filler ( padding, padding_align) ) ;
129
127
debug ! ( " padding before: {:?}" , padding) ;
130
128
}
131
- projection [ i] = result. len ( ) as u32 ;
129
+ field_remapping [ i] = result. len ( ) as u32 ;
132
130
result. push ( field. llvm_type ( cx) ) ;
133
131
offset = target_offset + field. size ;
134
132
prev_effective_align = effective_field_align;
135
133
}
134
+ let padding_used = result. len ( ) > field_count;
136
135
if !layout. is_unsized ( ) && field_count > 0 {
137
136
if offset > layout. size {
138
137
bug ! ( "layout: {:#?} stride: {:?} offset: {:?}" , layout, layout. size, offset) ;
@@ -151,7 +150,7 @@ fn struct_llfields<'a, 'tcx>(
151
150
debug ! ( "struct_llfields: offset: {:?} stride: {:?}" , offset, layout. size) ;
152
151
}
153
152
154
- ( result, packed, padding_used. then_some ( projection . into_boxed_slice ( ) ) )
153
+ ( result, packed, padding_used. then_some ( field_remapping . into_boxed_slice ( ) ) )
155
154
}
156
155
157
156
impl < ' a , ' tcx > CodegenCx < ' a , ' tcx > {
@@ -268,17 +267,20 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
268
267
} ;
269
268
debug ! ( "--> mapped {:#?} to llty={:?}" , self , llty) ;
270
269
271
- cx. type_lowering
272
- . borrow_mut ( )
273
- . insert ( ( self . ty , variant_index) , TypeLowering { lltype : llty, field_remapping : None } ) ;
270
+ cx. type_lowering . borrow_mut ( ) . insert (
271
+ ( self . ty , variant_index) ,
272
+ TypeLowering { lltype : llty, field_remapping : field_remapping } ,
273
+ ) ;
274
274
275
275
if let Some ( ( llty, layout) ) = defer {
276
276
let ( llfields, packed, new_field_remapping) = struct_llfields ( cx, layout) ;
277
277
cx. set_struct_body ( llty, & llfields, packed) ;
278
- field_remapping = new_field_remapping;
278
+ cx. type_lowering
279
+ . borrow_mut ( )
280
+ . get_mut ( & ( self . ty , variant_index) )
281
+ . unwrap ( )
282
+ . field_remapping = new_field_remapping;
279
283
}
280
- cx. type_lowering . borrow_mut ( ) . get_mut ( & ( self . ty , variant_index) ) . unwrap ( ) . field_remapping =
281
- field_remapping;
282
284
llty
283
285
}
284
286
@@ -378,7 +380,9 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyAndLayout<'tcx> {
378
380
// `field_remapping` is `None` no padding was used and the llvm field index
379
381
// matches the memory index.
380
382
match cx. type_lowering . borrow ( ) . get ( & ( self . ty , variant_index) ) {
381
- Some ( TypeLowering { field_remapping : Some ( ref prj) , .. } ) => prj[ index] as u64 ,
383
+ Some ( TypeLowering { field_remapping : Some ( ref remap) , .. } ) => {
384
+ remap[ index] as u64
385
+ }
382
386
Some ( _) => self . fields . memory_index ( index) as u64 ,
383
387
None => {
384
388
bug ! ( "TyAndLayout::llvm_field_index({:?}): type info not found" , self )
0 commit comments