]> git.lizzy.rs Git - rust.git/commitdiff
librustc: Fix field offsets for packed structs.
authorLuqman Aden <laden@csclub.uwaterloo.ca>
Mon, 18 Aug 2014 18:03:20 +0000 (14:03 -0400)
committerLuqman Aden <laden@csclub.uwaterloo.ca>
Mon, 18 Aug 2014 18:46:46 +0000 (14:46 -0400)
src/librustc/middle/trans/cabi_x86_64.rs

index 32e481dd2d48020661fb8fdeb3022d1fb4768439..2ab4814fa0cc3c633e3a2a579d6efc37ca9c0bc6 100644 (file)
@@ -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();