@@ -408,11 +408,20 @@ fn llalign_of(t: TypeRef) -> ValueRef {
408
408
}
409
409
410
410
fn size_of ( cx : @block_ctxt , t : ty:: t ) -> result {
411
+ size_of_ ( cx, t, align_total)
412
+ }
413
+
414
+ tag align_mode {
415
+ align_total;
416
+ align_next ( ty:: t) ;
417
+ }
418
+
419
+ fn size_of_ ( cx : @block_ctxt , t : ty:: t , mode : align_mode ) -> result {
411
420
let ccx = bcx_ccx ( cx) ;
412
421
if check type_has_static_size ( ccx, t) {
413
422
let sp = cx. sp ;
414
423
rslt ( cx, llsize_of ( type_of ( ccx, sp, t) ) )
415
- } else { dynamic_size_of ( cx, t) }
424
+ } else { dynamic_size_of ( cx, t, mode ) }
416
425
}
417
426
418
427
fn align_of ( cx : @block_ctxt , t : ty:: t ) -> result {
@@ -524,8 +533,9 @@ fn static_size_of_tag(cx: @crate_ctxt, sp: span, t: ty::t)
524
533
}
525
534
}
526
535
527
- fn dynamic_size_of ( cx : @block_ctxt , t : ty:: t ) -> result {
528
- fn align_elements ( cx : @block_ctxt , elts : [ ty:: t ] ) -> result {
536
+ fn dynamic_size_of ( cx : @block_ctxt , t : ty:: t , mode : align_mode ) -> result {
537
+ fn align_elements ( cx : @block_ctxt , elts : [ ty:: t ] ,
538
+ mode : align_mode ) -> result {
529
539
//
530
540
// C padding rules:
531
541
//
@@ -547,7 +557,15 @@ fn dynamic_size_of(cx: @block_ctxt, t: ty::t) -> result {
547
557
off = Add ( bcx, aligned_off, elt_size. val ) ;
548
558
max_align = umax ( bcx, max_align, elt_align. val ) ;
549
559
}
550
- off = align_to ( bcx, off, max_align) ;
560
+ off = alt mode {
561
+ align_total. {
562
+ align_to( bcx, off, max_align)
563
+ }
564
+ align_next ( t) {
565
+ let { bcx, val: align } = align_of ( bcx, t) ;
566
+ align_to ( bcx, off, align)
567
+ }
568
+ } ;
551
569
ret rslt( bcx, off) ;
552
570
}
553
571
alt ty:: struct ( bcx_tcx ( cx) , t) {
@@ -558,12 +576,12 @@ fn dynamic_size_of(cx: @block_ctxt, t: ty::t) -> result {
558
576
ty:: ty_rec ( flds) {
559
577
let tys: [ ty:: t ] = [ ] ;
560
578
for f: ty:: field in flds { tys += [ f. mt . ty ] ; }
561
- ret align_elements ( cx, tys) ;
579
+ ret align_elements ( cx, tys, mode ) ;
562
580
}
563
581
ty:: ty_tup ( elts) {
564
582
let tys = [ ] ;
565
583
for tp in elts { tys += [ tp] ; }
566
- ret align_elements ( cx, tys) ;
584
+ ret align_elements ( cx, tys, mode ) ;
567
585
}
568
586
ty:: ty_tag ( tid, tps) {
569
587
let bcx = cx;
@@ -581,7 +599,7 @@ fn dynamic_size_of(cx: @block_ctxt, t: ty::t) -> result {
581
599
let t = ty:: substitute_type_params ( bcx_tcx ( cx) , tps, raw_ty) ;
582
600
tys += [ t] ;
583
601
}
584
- let rslt = align_elements ( bcx, tys) ;
602
+ let rslt = align_elements ( bcx, tys, mode ) ;
585
603
bcx = rslt. bcx ;
586
604
let this_size = rslt. val ;
587
605
let old_max_size = Load ( bcx, max_size) ;
@@ -738,7 +756,7 @@ fn GEP_tup_like(cx: @block_ctxt, t: ty::t, base: ValueRef, ixs: [int])
738
756
let prefix_ty = ty:: mk_tup ( bcx_tcx ( cx) , args) ;
739
757
740
758
let bcx = cx;
741
- let sz = size_of ( bcx, prefix_ty) ;
759
+ let sz = size_of_ ( bcx, prefix_ty, align_next ( s . target ) ) ;
742
760
ret rslt( sz. bcx , bump_ptr ( sz. bcx , s. target , base, sz. val ) ) ;
743
761
}
744
762
0 commit comments