From 82fa4368ed50db5081504523249222856c34a3aa Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Mon, 18 Aug 2014 14:03:20 -0400 Subject: [PATCH] librustc: Fix field offsets for packed structs. --- src/librustc/middle/trans/cabi_x86_64.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/librustc/middle/trans/cabi_x86_64.rs b/src/librustc/middle/trans/cabi_x86_64.rs index 32e481dd2d4..2ab4814fa0c 100644 --- a/src/librustc/middle/trans/cabi_x86_64.rs +++ b/src/librustc/middle/trans/cabi_x86_64.rs @@ -176,11 +176,15 @@ fn unify(cls: &mut [RegClass], } fn classify_struct(tys: &[Type], - cls: &mut [RegClass], i: uint, - off: uint) { + cls: &mut [RegClass], + i: uint, + off: uint, + packed: bool) { let mut field_off = off; for ty in tys.iter() { - field_off = align(field_off, *ty); + if !packed { + field_off = align(field_off, *ty); + } classify(*ty, cls, i, field_off); field_off += ty_size(*ty); } @@ -219,7 +223,7 @@ fn classify(ty: Type, unify(cls, ix + off / 8u, SSEDs); } Struct => { - classify_struct(ty.field_types().as_slice(), cls, ix, off); + classify_struct(ty.field_types().as_slice(), cls, ix, off, ty.is_packed()); } Array => { let len = ty.array_length(); -- 2.44.0