struct packing on m68k

Mike Stump mrs@wrs.com
Tue Sep 23 19:47:00 GMT 1997


This enables __attribute__ ((packed)) and friends to work on an m68k...

struct F {
  unsigned char ver:4;
  unsigned char frag:4;
} __attribute__ ((packed));

struct IP {
  struct F f;
  unsigned char opt:4;
  unsigned char len:4;
} __attribute__ ((packed));

struct IP a = { { 1, 2 }, 3, 4};

Otherwise the size of F is 2 bytes for no real good reason(?), other
than ABI compatibility.

The theory is that if you use -fpack-struct, or __attribute__
((packed)) then you don't care about ABI compatibility and changing
the layout to be what most people expect (and what almost all others
CPU platforms do), is a good thing.

Doing diffs in stor-layout.c.~1~:
*** stor-layout.c.~1~	Fri Aug 15 11:56:53 1997
--- stor-layout.c	Tue Sep 23 17:20:51 1997
*************** 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
--------------

The only issue that I know of is, will the compiler ever emit bad code
if the alignment is shortened?  I was hoping that the answer was no,
but, in the absence of knowledge...

Does this look reasonable to install?



More information about the Gcc mailing list