diff options
author | Mike Stump <mrs@wrs.com> | 1997-10-16 21:45:24 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-10-16 15:45:24 -0600 |
commit | 5c19a35643bd0c7d5a2766a5b91f6b6b4cb7242d (patch) | |
tree | 074af1c4450358fa3fca1e255fb9492918cce5f8 /gcc | |
parent | bdd7e652f4b7b615e07eef4f83d80fb9ab7425e8 (diff) | |
download | gcc-5c19a35643bd0c7d5a2766a5b91f6b6b4cb7242d.zip gcc-5c19a35643bd0c7d5a2766a5b91f6b6b4cb7242d.tar.gz gcc-5c19a35643bd0c7d5a2766a5b91f6b6b4cb7242d.tar.bz2 |
c-decl.c (start_struct): Ensure that structs with forward declarations are in fact packed when...
* c-decl.c (start_struct): Ensure that structs with forward
declarations are in fact packed when -fpack-struct is given.
* 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.
From-SVN: r15939
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/c-decl.c | 1 | ||||
-rw-r--r-- | gcc/stor-layout.c | 19 |
3 files changed, 22 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 065b3dd..32a3239 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +Thu Oct 16 15:43:26 1997 Mike Stump (mrs@wrs.com) + + * c-decl.c (start_struct): Ensure that structs with forward + declarations are in fact packed when -fpack-struct is given. + + * 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. + Thu Oct 16 15:17:54 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * rs6000.h (ROUND_TYPE_ALIGN): Don't blow up if no fields in record. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 5774f75..e38cdb1 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -5529,6 +5529,7 @@ start_struct (code, name) 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'"), diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 7c4b4f6..2ccf45e 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -306,11 +306,7 @@ layout_record (rec) 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, @@ -324,6 +320,11 @@ layout_record (rec) 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)) { @@ -563,11 +564,7 @@ layout_union (rec) 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). @@ -575,6 +572,12 @@ layout_union (rec) 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 size. We reverse them again later. */ |