(
cx: &CodegenCx<'a, 'tcx>,
layout: TyAndLayout<'tcx>,
)
| 566 | } |
| 567 | |
| 568 | fn struct_llfields<'a, 'tcx>( |
| 569 | cx: &CodegenCx<'a, 'tcx>, |
| 570 | layout: TyAndLayout<'tcx>, |
| 571 | ) -> (Vec<&'a Type>, bool) { |
| 572 | let field_count = layout.fields.count(); |
| 573 | |
| 574 | let mut packed = false; |
| 575 | let mut offset = Size::ZERO; |
| 576 | let mut prev_effective_align = layout.align.abi; |
| 577 | let mut result: Vec<_> = Vec::with_capacity(1 + field_count * 2); |
| 578 | for i in layout.fields.index_by_increasing_offset() { |
| 579 | let target_offset = layout.fields.offset(i as usize); |
| 580 | let field = layout.field(cx, i); |
| 581 | let effective_field_align = layout |
| 582 | .align |
| 583 | .abi |
| 584 | .min(field.align.abi) |
| 585 | .restrict_for_offset(target_offset); |
| 586 | packed |= effective_field_align < field.align.abi; |
| 587 | |
| 588 | assert!(target_offset >= offset); |
| 589 | let padding = target_offset - offset; |
| 590 | let padding_align = prev_effective_align.min(effective_field_align); |
| 591 | assert_eq!(offset.align_to(padding_align) + padding, target_offset); |
| 592 | result.push(cx.type_padding_filler(padding, padding_align)); |
| 593 | |
| 594 | result.push(field.llvm_type(cx)); |
| 595 | offset = target_offset + field.size; |
| 596 | prev_effective_align = effective_field_align; |
| 597 | } |
| 598 | if !layout.is_unsized() && field_count > 0 { |
| 599 | if offset > layout.size { |
| 600 | bug!( |
| 601 | "layout: {:#?} stride: {:?} offset: {:?}", |
| 602 | layout, |
| 603 | layout.size, |
| 604 | offset |
| 605 | ); |
| 606 | } |
| 607 | let padding = layout.size - offset; |
| 608 | let padding_align = prev_effective_align; |
| 609 | assert_eq!(offset.align_to(padding_align) + padding, layout.size); |
| 610 | result.push(cx.type_padding_filler(padding, padding_align)); |
| 611 | assert_eq!(result.len(), 1 + field_count * 2); |
| 612 | } else { |
| 613 | } |
| 614 | |
| 615 | (result, packed) |
| 616 | } |
| 617 | |
| 618 | impl<'a, 'tcx> CodegenCx<'a, 'tcx> { |
| 619 | pub fn align_of(&self, ty: Ty<'tcx>) -> Align { |
no test coverage detected