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
This commit is contained in:
parent
bdd7e652f4
commit
5c19a35643
@ -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>
|
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.
|
* rs6000.h (ROUND_TYPE_ALIGN): Don't blow up if no fields in record.
|
||||||
|
@ -5529,6 +5529,7 @@ start_struct (code, name)
|
|||||||
if (ref && TREE_CODE (ref) == code)
|
if (ref && TREE_CODE (ref) == code)
|
||||||
{
|
{
|
||||||
C_TYPE_BEING_DEFINED (ref) = 1;
|
C_TYPE_BEING_DEFINED (ref) = 1;
|
||||||
|
TYPE_PACKED (ref) = flag_pack_struct;
|
||||||
if (TYPE_FIELDS (ref))
|
if (TYPE_FIELDS (ref))
|
||||||
error ((code == UNION_TYPE ? "redefinition of `union %s'"
|
error ((code == UNION_TYPE ? "redefinition of `union %s'"
|
||||||
: "redefinition of `struct %s'"),
|
: "redefinition of `struct %s'"),
|
||||||
|
@ -306,11 +306,7 @@ layout_record (rec)
|
|||||||
tree rec;
|
tree rec;
|
||||||
{
|
{
|
||||||
register tree field;
|
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));
|
unsigned record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
|
||||||
#endif
|
|
||||||
/* These must be laid out *after* the record is. */
|
/* These must be laid out *after* the record is. */
|
||||||
tree pending_statics = NULL_TREE;
|
tree pending_statics = NULL_TREE;
|
||||||
/* Record size so far is CONST_SIZE + VAR_SIZE bits,
|
/* Record size so far is CONST_SIZE + VAR_SIZE bits,
|
||||||
@ -324,6 +320,11 @@ layout_record (rec)
|
|||||||
that we know VAR_SIZE has. */
|
that we know VAR_SIZE has. */
|
||||||
register int var_align = BITS_PER_UNIT;
|
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))
|
for (field = TYPE_FIELDS (rec); field; field = TREE_CHAIN (field))
|
||||||
{
|
{
|
||||||
@ -563,11 +564,7 @@ layout_union (rec)
|
|||||||
tree rec;
|
tree rec;
|
||||||
{
|
{
|
||||||
register tree field;
|
register tree field;
|
||||||
#ifdef STRUCTURE_SIZE_BOUNDARY
|
|
||||||
unsigned union_align = STRUCTURE_SIZE_BOUNDARY;
|
|
||||||
#else
|
|
||||||
unsigned union_align = BITS_PER_UNIT;
|
unsigned union_align = BITS_PER_UNIT;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The size of the union, based on the fields scanned so far,
|
/* The size of the union, based on the fields scanned so far,
|
||||||
is max (CONST_SIZE, VAR_SIZE).
|
is max (CONST_SIZE, VAR_SIZE).
|
||||||
@ -575,6 +572,12 @@ layout_union (rec)
|
|||||||
register int const_size = 0;
|
register int const_size = 0;
|
||||||
register tree var_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
|
/* 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
|
the reverse order in building the COND_EXPR that denotes its
|
||||||
size. We reverse them again later. */
|
size. We reverse them again later. */
|
||||||
|
Loading…
Reference in New Issue
Block a user