https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66337

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|WAITING                     |NEW

--- Comment #5 from Martin Sebor <msebor at gcc dot gnu.org> ---
Thank you for the background.   I agree that the __alignof__ operator doesn't
seem to be returning the correct result in this case.  Based on the GCC manual,
I would expect __alignof__(member) to evaluate to the alignment of the member's
type, or 8 in this case, not 4.

After some debugging I believe the reduced alignment is due to the definition
of the ADJUST_FIELD_ALIGN macro in config/rs6000/linux64.h.  Testing shows even
though the double field alignment is set to 32 bits the overall layout of the
struct (e.g., adjacent fields and padding between them) respects the 64-bit
double alignment.  I don't know enough of the history to guess why it's done
this way but this is what I found in commit logs:

/* PowerPC64 Linux word-aligns FP doubles when -malign-power is given.  */
#undef  ADJUST_FIELD_ALIGN
#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
  (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED))            \
   ? 128                                                                \
   : (TARGET_64BIT                                                      \
      && TARGET_ALIGN_NATURAL == 0                                      \
      && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode)   \
   ? MIN ((COMPUTED), 32)                                               \
   : (COMPUTED))

The comment under it explains why the struct containing the double field is
doubleword aligned:

/* PowerPC64 Linux increases natural record alignment to doubleword if
   the first field is an FP double, only if in power alignment mode.  */

The ADJUST_FIELD_ALIGN macro was introduced into the rs6000 back end in r56135
with the following comment:

/* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints.  */

Reply via email to