MCPcopy Create free account
hub / github.com/Rust-GPU/rust-cuda / struct_llfields

Function struct_llfields

crates/rustc_codegen_nvvm/src/ty.rs:568–616  ·  view source on GitHub ↗
(
    cx: &CodegenCx<'a, 'tcx>,
    layout: TyAndLayout<'tcx>,
)

Source from the content-addressed store, hash-verified

566}
567
568fn 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
618impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
619 pub fn align_of(&self, ty: Ty<'tcx>) -> Align {

Callers 2

llvm_typeMethod · 0.85
uncached_llvm_typeFunction · 0.85

Calls 4

offsetMethod · 0.80
type_padding_fillerMethod · 0.80
pushMethod · 0.45
llvm_typeMethod · 0.45

Tested by

no test coverage detected