1212
1313//! Code that is useful in various codegen modules.
1414
15- use llvm:: { self , ValueRef , ContextRef , TypeKind , True , False , Bool , OperandBundleDef } ;
15+ use llvm;
16+ use llvm:: { ValueRef , ContextRef , TypeKind } ;
17+ use llvm:: { True , False , Bool , OperandBundleDef } ;
1618use rustc:: hir:: def_id:: DefId ;
1719use rustc:: middle:: lang_items:: LangItem ;
1820use abi;
@@ -27,8 +29,6 @@ use rustc::ty::{self, Ty, TyCtxt};
2729use rustc:: ty:: layout:: { HasDataLayout , LayoutOf } ;
2830use rustc:: hir;
2931
30- use meth;
31-
3232use libc:: { c_uint, c_char} ;
3333use std:: iter;
3434
@@ -448,101 +448,3 @@ pub fn ty_fn_sig<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
448448 _ => bug ! ( "unexpected type {:?} to ty_fn_sig" , ty)
449449 }
450450}
451-
452- pub fn size_and_align_of_dst < ' a , ' tcx > ( bx : & Builder < ' a , ' tcx > , t : Ty < ' tcx > , info : ValueRef )
453- -> ( ValueRef , ValueRef ) {
454- debug ! ( "calculate size of DST: {}; with lost info: {:?}" ,
455- t, Value ( info) ) ;
456- if bx. cx . type_is_sized ( t) {
457- let ( size, align) = bx. cx . size_and_align_of ( t) ;
458- debug ! ( "size_and_align_of_dst t={} info={:?} size: {:?} align: {:?}" ,
459- t, Value ( info) , size, align) ;
460- let size = C_usize ( bx. cx , size. bytes ( ) ) ;
461- let align = C_usize ( bx. cx , align. abi ( ) ) ;
462- return ( size, align) ;
463- }
464- assert ! ( !info. is_null( ) ) ;
465- match t. sty {
466- ty:: TyDynamic ( ..) => {
467- // load size/align from vtable
468- ( meth:: SIZE . get_usize ( bx, info) , meth:: ALIGN . get_usize ( bx, info) )
469- }
470- ty:: TySlice ( _) | ty:: TyStr => {
471- let unit = t. sequence_element_type ( bx. tcx ( ) ) ;
472- // The info in this case is the length of the str, so the size is that
473- // times the unit size.
474- let ( size, align) = bx. cx . size_and_align_of ( unit) ;
475- ( bx. mul ( info, C_usize ( bx. cx , size. bytes ( ) ) ) ,
476- C_usize ( bx. cx , align. abi ( ) ) )
477- }
478- _ => {
479- let cx = bx. cx ;
480- // First get the size of all statically known fields.
481- // Don't use size_of because it also rounds up to alignment, which we
482- // want to avoid, as the unsized field's alignment could be smaller.
483- assert ! ( !t. is_simd( ) ) ;
484- let layout = cx. layout_of ( t) ;
485- debug ! ( "DST {} layout: {:?}" , t, layout) ;
486-
487- let i = layout. fields . count ( ) - 1 ;
488- let sized_size = layout. fields . offset ( i) . bytes ( ) ;
489- let sized_align = layout. align . abi ( ) ;
490- debug ! ( "DST {} statically sized prefix size: {} align: {}" ,
491- t, sized_size, sized_align) ;
492- let sized_size = C_usize ( cx, sized_size) ;
493- let sized_align = C_usize ( cx, sized_align) ;
494-
495- // Recurse to get the size of the dynamically sized field (must be
496- // the last field).
497- let field_ty = layout. field ( cx, i) . ty ;
498- let ( unsized_size, mut unsized_align) = size_and_align_of_dst ( bx, field_ty, info) ;
499-
500- // FIXME (#26403, #27023): We should be adding padding
501- // to `sized_size` (to accommodate the `unsized_align`
502- // required of the unsized field that follows) before
503- // summing it with `sized_size`. (Note that since #26403
504- // is unfixed, we do not yet add the necessary padding
505- // here. But this is where the add would go.)
506-
507- // Return the sum of sizes and max of aligns.
508- let size = bx. add ( sized_size, unsized_size) ;
509-
510- // Packed types ignore the alignment of their fields.
511- if let ty:: TyAdt ( def, _) = t. sty {
512- if def. repr . packed ( ) {
513- unsized_align = sized_align;
514- }
515- }
516-
517- // Choose max of two known alignments (combined value must
518- // be aligned according to more restrictive of the two).
519- let align = match ( const_to_opt_u128 ( sized_align, false ) ,
520- const_to_opt_u128 ( unsized_align, false ) ) {
521- ( Some ( sized_align) , Some ( unsized_align) ) => {
522- // If both alignments are constant, (the sized_align should always be), then
523- // pick the correct alignment statically.
524- C_usize ( cx, :: std:: cmp:: max ( sized_align, unsized_align) as u64 )
525- }
526- _ => bx. select ( bx. icmp ( llvm:: IntUGT , sized_align, unsized_align) ,
527- sized_align,
528- unsized_align)
529- } ;
530-
531- // Issue #27023: must add any necessary padding to `size`
532- // (to make it a multiple of `align`) before returning it.
533- //
534- // Namely, the returned size should be, in C notation:
535- //
536- // `size + ((size & (align-1)) ? align : 0)`
537- //
538- // emulated via the semi-standard fast bit trick:
539- //
540- // `(size + (align-1)) & -align`
541-
542- let addend = bx. sub ( align, C_usize ( bx. cx , 1 ) ) ;
543- let size = bx. and ( bx. add ( size, addend) , bx. neg ( align) ) ;
544-
545- ( size, align)
546- }
547- }
548- }
0 commit comments