From mboxrd@z Thu Jan 1 00:00:00 1970 From: mrs@wrs.com (Mike Stump) To: egcs@cygnus.com Subject: m68k structure packing Date: Tue, 30 Sep 1997 12:08:00 -0000 Message-id: <199709301908.MAA01711@kankakee.wrs.com> X-SW-Source: 1997-09/msg01155.html Could you fold in this work from the FSF sources? Thanks. Fri Sep 26 14:06:45 1997 Mike Stump * c-decl.c (start_struct): Ensure that structs with forward declarations are in fact packed when -fpack-struct is given. Wed Sep 24 11:31:24 1997 Mike Stump * stor-layout.c (layout_record): Ignore STRUCTURE_SIZE_BOUNDARY if we are packing a structure. This allows a structure with only bytes to be aligned on a byte boundary and have no padding on a m68k. Index: stor-layout.c =================================================================== RCS file: /folk/mrs/.cvsroot/egcs/gcc/stor-layout.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -c -p -r1.1.1.1 -r1.2 *** stor-layout.c 1997/08/15 18:56:53 1.1.1.1 --- stor-layout.c 1997/09/24 18:41:48 1.2 *************** layout_record (rec) *** 306,316 **** tree rec; { register tree field; - #ifdef STRUCTURE_SIZE_BOUNDARY - unsigned record_align = MAX (STRUCTURE_SIZE_BOUNDARY, TYPE_ALIGN (rec)); - #else unsigned record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec)); - #endif /* These must be laid out *after* the record is. */ tree pending_statics = NULL_TREE; /* Record size so far is CONST_SIZE + VAR_SIZE bits, --- 306,312 ---- *************** layout_record (rec) *** 324,329 **** --- 320,330 ---- that we know VAR_SIZE has. */ register int var_align = BITS_PER_UNIT; + #ifdef STRUCTURE_SIZE_BOUNDARY + /* Packed structures don't need to have minimum size. */ + if (! TYPE_PACKED (rec)) + record_align = MAX (record_align, STRUCTURE_SIZE_BOUNDARY); + #endif for (field = TYPE_FIELDS (rec); field; field = TREE_CHAIN (field)) { *************** layout_union (rec) *** 563,579 **** tree rec; { register tree field; - #ifdef STRUCTURE_SIZE_BOUNDARY - unsigned union_align = STRUCTURE_SIZE_BOUNDARY; - #else unsigned union_align = BITS_PER_UNIT; - #endif /* The size of the union, based on the fields scanned so far, is max (CONST_SIZE, VAR_SIZE). VAR_SIZE may be null; then CONST_SIZE by itself is the size. */ register int const_size = 0; register tree var_size = 0; /* If this is a QUAL_UNION_TYPE, we want to process the fields in the reverse order in building the COND_EXPR that denotes its --- 564,582 ---- tree rec; { register tree field; unsigned union_align = BITS_PER_UNIT; /* The size of the union, based on the fields scanned so far, is max (CONST_SIZE, VAR_SIZE). VAR_SIZE may be null; then CONST_SIZE by itself is the size. */ register int const_size = 0; register tree var_size = 0; + + #ifdef STRUCTURE_SIZE_BOUNDARY + /* Packed structures don't need to have minimum size. */ + if (! TYPE_PACKED (rec)) + union_align = STRUCTURE_SIZE_BOUNDARY; + #endif /* If this is a QUAL_UNION_TYPE, we want to process the fields in the reverse order in building the COND_EXPR that denotes its Index: c-decl.c =================================================================== RCS file: /folk/mrs/.cvsroot/egcs/gcc/c-decl.c,v retrieving revision 1.1.1.4 retrieving revision 1.2 diff -c -p -r1.1.1.4 -r1.2 *** c-decl.c 1997/09/16 02:07:07 1.1.1.4 --- c-decl.c 1997/09/26 21:09:25 1.2 *************** start_struct (code, name) *** 5527,5532 **** --- 5527,5533 ---- if (ref && TREE_CODE (ref) == code) { C_TYPE_BEING_DEFINED (ref) = 1; + TYPE_PACKED (ref) = flag_pack_struct; if (TYPE_FIELDS (ref)) error ((code == UNION_TYPE ? "redefinition of `union %s'" : "redefinition of `struct %s'"), ------