Message ID | alpine.LSU.2.20.1702020905000.12993@r111.fhfr.qr |
---|---|
State | New |
Headers | show |
> On 2 Feb 2017, at 08:08, Richard Biener <rguenther@suse.de> wrote: > > On Wed, 1 Feb 2017, Segher Boessenkool wrote: > >> On Wed, Feb 01, 2017 at 03:53:09PM -0600, Segher Boessenkool wrote: >>> On Wed, Feb 01, 2017 at 11:59:10AM +0100, Richard Biener wrote: >>>> Wasn't successful in making a cross to ppc64-linux build its libobjc. >>> >>> I'll do a native build. Just the patch in the first message in this >>> thread? And just running the testsuite is enough, or is there >>> something specific you want tested? >> >> Done now. No new failures on powerpc64-linux {-m32,-m64}. I needed >> the following additional patch; I do not know if that works on other >> targets (or if it actually is correct!) > > Yes, I knew I needed something there but didn't know what is correct > either ;) But I concluded as 'type' is const char * here which is > totally broken it probably doesn't matter what we pass as 2nd argument > either ... > > So, consider the patch changed like Segher proposed below (and thanks > Segher for the testing). For reference attached again below, including > tm.texi.in. > > Barring further comments I'll check this in at the beginning of next > week. I bootstrapped (+ada +obj-c++) 245116+this patch on x86_64-darwin15 and powerpc-darwin9, I don’t see any regressions on the objective-c or objective-c++ suites (which include testing -fgnu-runtime on Darwin). Iain > > Thanks, > Richard. > > 2017-02-02 Richard Biener <rguenther@suse.de> > > PR tree-optimization/79256 > PR middle-end/79278 > * builtins.c (get_object_alignment_2): Use min_align_of_type > to extract alignment for MEM_REFs to honor BIGGEST_FIELD_ALIGNMENT > and ADJUST_FIELD_ALIGN. > > * doc/tm.texi.in (ADJUST_FIELD_ALIGN): Adjust to take additional > type parameter. > * doc/tm.texi: Regenerate. > * stor-layout.c (layout_decl): Adjust. > (update_alignment_for_field): Likewise. > (place_field): Likewise. > (min_align_of_type): Likewise. > * config/arc/arc.h (ADJUST_FIELD_ALIGN): Adjust. > * config/epiphany/epiphany.h (ADJUST_FIELD_ALIGN): Likewise. > * config/epiphany/epiphany.c (epiphany_adjust_field_align): Likewise. > * config/frv/frv.h (ADJUST_FIELD_ALIGN): Likewise. > * config/frv/frv.c (frv_adjust_field_align): Likewise. > * config/i386/i386.h (ADJUST_FIELD_ALIGN): Likewise. > * config/i386/i386.c (x86_field_alignment): Likewise. > * config/rs6000/aix.h (ADJUST_FIELD_ALIGN): Likewise. > * config/rs6000/darwin.h (ADJUST_FIELD_ALIGN): Likewise. > * config/rs6000/freebsd64.h (ADJUST_FIELD_ALIGN): Likewise. > * config/rs6000/linux64.h (ADJUST_FIELD_ALIGN): Likewise. > * config/rs6000/sysv4.h (ADJUST_FIELD_ALIGN): Likewise. > * config/rs6000/rs6000.c (rs6000_special_adjust_field_align_p): > Likewise. > > go/ > * go-backend.c (go_field_alignment): Adjust. > > libobjc/ > * encoding.c (objc_layout_structure_next_member): Adjust > ADJUST_FIELD_ALIGN usage. > > Index: gcc/builtins.c > =================================================================== > --- gcc/builtins.c (revision 245115) > +++ gcc/builtins.c (working copy) > @@ -334,9 +334,11 @@ get_object_alignment_2 (tree exp, unsign > Do so only if get_pointer_alignment_1 did not reveal absolute > alignment knowledge and if using that alignment would > improve the situation. */ > + unsigned int talign; > if (!addr_p && !known_alignment > - && TYPE_ALIGN (TREE_TYPE (exp)) > align) > - align = TYPE_ALIGN (TREE_TYPE (exp)); > + && (talign = min_align_of_type (TREE_TYPE (exp)) * BITS_PER_UNIT) > + && talign > align) > + align = talign; > else > { > /* Else adjust bitpos accordingly. */ > Index: gcc/config/arc/arc.h > =================================================================== > --- gcc/config/arc/arc.h (revision 245115) > +++ gcc/config/arc/arc.h (working copy) > @@ -317,8 +317,8 @@ if (GET_MODE_CLASS (MODE) == MODE_INT \ > construct. > */ > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > -(TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode \ > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > +(TYPE_MODE (strip_array_types (TYPE)) == DFmode \ > ? MIN ((COMPUTED), 32) : (COMPUTED)) > > > Index: gcc/config/epiphany/epiphany.c > =================================================================== > --- gcc/config/epiphany/epiphany.c (revision 245115) > +++ gcc/config/epiphany/epiphany.c (working copy) > @@ -2855,12 +2855,12 @@ epiphany_special_round_type_align (tree > arrays-at-the-end-of-structs work, like for struct gcov_fn_info in > libgcov.c . */ > unsigned > -epiphany_adjust_field_align (tree field, unsigned computed) > +epiphany_adjust_field_align (tree type, unsigned computed) > { > if (computed == 32 > - && TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE) > + && TREE_CODE (type) == ARRAY_TYPE) > { > - tree elmsz = TYPE_SIZE (TREE_TYPE (TREE_TYPE (field))); > + tree elmsz = TYPE_SIZE (TREE_TYPE (type)); > > if (!tree_fits_uhwi_p (elmsz) || tree_to_uhwi (elmsz) >= 32) > return 64; > Index: gcc/config/epiphany/epiphany.h > =================================================================== > --- gcc/config/epiphany/epiphany.h (revision 245115) > +++ gcc/config/epiphany/epiphany.h (working copy) > @@ -187,8 +187,8 @@ along with GCC; see the file COPYING3. > (SPECIFIED_ALIGN)) \ > : MAX ((MANGLED_ALIGN), (SPECIFIED_ALIGN))) > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > - epiphany_adjust_field_align((FIELD), (COMPUTED)) > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > + epiphany_adjust_field_align((TYPE), (COMPUTED)) > > /* Layout of source language data types. */ > > Index: gcc/config/frv/frv.c > =================================================================== > --- gcc/config/frv/frv.c (revision 245115) > +++ gcc/config/frv/frv.c (working copy) > @@ -6482,7 +6482,8 @@ int > frv_adjust_field_align (tree field, int computed) > { > /* Make sure that the bitfield is not wider than the type. */ > - if (DECL_BIT_FIELD (field) > + if (field > + && DECL_BIT_FIELD (field) > && !DECL_ARTIFICIAL (field)) > { > tree parent = DECL_CONTEXT (field); > Index: gcc/config/frv/frv.h > =================================================================== > --- gcc/config/frv/frv.h (revision 245115) > +++ gcc/config/frv/frv.h (working copy) > @@ -331,7 +331,7 @@ > alignment computed in the usual way is COMPUTED. GCC uses this > value instead of the value in `BIGGEST_ALIGNMENT' or > `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only. */ > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > frv_adjust_field_align (FIELD, COMPUTED) > #endif > > Index: gcc/config/i386/i386.c > =================================================================== > --- gcc/config/i386/i386.c (revision 245115) > +++ gcc/config/i386/i386.c (working copy) > @@ -41676,10 +41676,9 @@ x86_file_start (void) > } > > int > -x86_field_alignment (tree field, int computed) > +x86_field_alignment (tree type, int computed) > { > machine_mode mode; > - tree type = TREE_TYPE (field); > > if (TARGET_64BIT || TARGET_ALIGN_DOUBLE) > return computed; > Index: gcc/config/i386/i386.h > =================================================================== > --- gcc/config/i386/i386.h (revision 245115) > +++ gcc/config/i386/i386.h (working copy) > @@ -847,8 +847,8 @@ extern const char *host_detect_local_cpu > #define BIGGEST_FIELD_ALIGNMENT 32 > #endif > #else > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > - x86_field_alignment ((FIELD), (COMPUTED)) > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > + x86_field_alignment ((TYPE), (COMPUTED)) > #endif > > /* If defined, a C expression to compute the alignment given to a > Index: gcc/config/rs6000/aix.h > =================================================================== > --- gcc/config/rs6000/aix.h (revision 245115) > +++ gcc/config/rs6000/aix.h (working copy) > @@ -218,9 +218,9 @@ > > /* This now supports a natural alignment mode. */ > /* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */ > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > ((TARGET_ALIGN_NATURAL == 0 \ > - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ > + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ > ? MIN ((COMPUTED), 32) \ > : (COMPUTED)) > > Index: gcc/config/rs6000/darwin.h > =================================================================== > --- gcc/config/rs6000/darwin.h (revision 245115) > +++ gcc/config/rs6000/darwin.h (working copy) > @@ -319,7 +319,7 @@ extern int darwin_emit_branch_islands; > suppressed for vector and long double items (both 128 in size). > There is a dummy use of the FIELD argument to avoid an unused variable > warning (see PR59496). */ > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > ((void) (FIELD), \ > (TARGET_ALIGN_NATURAL \ > ? (COMPUTED) \ > Index: gcc/config/rs6000/freebsd64.h > =================================================================== > --- gcc/config/rs6000/freebsd64.h (revision 245115) > +++ gcc/config/rs6000/freebsd64.h (working copy) > @@ -365,12 +365,12 @@ extern int dot_symbols; > > /* 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)) \ > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ > ? 128 \ > : (TARGET_64BIT \ > && TARGET_ALIGN_NATURAL == 0 \ > - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ > + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ > ? MIN ((COMPUTED), 32) \ > : (COMPUTED)) > > Index: gcc/config/rs6000/linux64.h > =================================================================== > --- gcc/config/rs6000/linux64.h (revision 245115) > +++ gcc/config/rs6000/linux64.h (working copy) > @@ -292,12 +292,12 @@ extern int dot_symbols; > > /* 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)) \ > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ > ? 128 \ > : (TARGET_64BIT \ > && TARGET_ALIGN_NATURAL == 0 \ > - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ > + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ > ? MIN ((COMPUTED), 32) \ > : (COMPUTED)) > > Index: gcc/config/rs6000/rs6000.c > =================================================================== > --- gcc/config/rs6000/rs6000.c (revision 245115) > +++ gcc/config/rs6000/rs6000.c (working copy) > @@ -7972,9 +7972,9 @@ rs6000_data_alignment (tree type, unsign > /* Previous GCC releases forced all vector types to have 16-byte alignment. */ > > bool > -rs6000_special_adjust_field_align_p (tree field, unsigned int computed) > +rs6000_special_adjust_field_align_p (tree type, unsigned int computed) > { > - if (TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE) > + if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE) > { > if (computed != 128) > { > Index: gcc/config/rs6000/sysv4.h > =================================================================== > --- gcc/config/rs6000/sysv4.h (revision 245115) > +++ gcc/config/rs6000/sysv4.h (working copy) > @@ -298,8 +298,8 @@ do { \ > > /* An expression for the alignment of a structure field FIELD if the > alignment computed in the usual way is COMPUTED. */ > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > - (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED)) \ > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ > ? 128 : COMPUTED) > > #undef BIGGEST_FIELD_ALIGNMENT > Index: gcc/doc/tm.texi > =================================================================== > --- gcc/doc/tm.texi (revision 245115) > +++ gcc/doc/tm.texi (working copy) > @@ -1042,13 +1042,15 @@ structure and union fields only, unless > by the @code{__attribute__ ((aligned (@var{n})))} construct. > @end defmac > > -@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{computed}) > -An expression for the alignment of a structure field @var{field} if the > -alignment computed in the usual way (including applying of > -@code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the > +@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed}) > +An expression for the alignment of a structure field @var{field} of > +type @var{type} if the alignment computed in the usual way (including > +applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the > alignment) is @var{computed}. It overrides alignment only if the > field alignment has not been set by the > -@code{__attribute__ ((aligned (@var{n})))} construct. > +@code{__attribute__ ((aligned (@var{n})))} construct. Note that @var{field} > +may be @code{NULL_TREE} in case we just query for the minimum alignment > +of a field of type @var{type} in structure context. > @end defmac > > @defmac MAX_STACK_ALIGNMENT > Index: gcc/doc/tm.texi.in > =================================================================== > --- gcc/doc/tm.texi.in (revision 245115) > +++ gcc/doc/tm.texi.in (working copy) > @@ -990,13 +990,15 @@ structure and union fields only, unless > by the @code{__attribute__ ((aligned (@var{n})))} construct. > @end defmac > > -@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{computed}) > -An expression for the alignment of a structure field @var{field} if the > -alignment computed in the usual way (including applying of > -@code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the > +@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed}) > +An expression for the alignment of a structure field @var{field} of > +type @var{type} if the alignment computed in the usual way (including > +applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the > alignment) is @var{computed}. It overrides alignment only if the > field alignment has not been set by the > -@code{__attribute__ ((aligned (@var{n})))} construct. > +@code{__attribute__ ((aligned (@var{n})))} construct. Note that @var{field} > +may be @code{NULL_TREE} in case we just query for the minimum alignment > +of a field of type @var{type} in structure context. > @end defmac > > @defmac MAX_STACK_ALIGNMENT > Index: gcc/go/go-backend.c > =================================================================== > --- gcc/go/go-backend.c (revision 245115) > +++ gcc/go/go-backend.c (working copy) > @@ -71,11 +71,7 @@ go_field_alignment (tree t) > #endif > > #ifdef ADJUST_FIELD_ALIGN > - { > - tree field ATTRIBUTE_UNUSED; > - field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL, t); > - v = ADJUST_FIELD_ALIGN (field, v); > - } > + v = ADJUST_FIELD_ALIGN (NULL_TREE, t, v); > #endif > > return v / BITS_PER_UNIT; > Index: gcc/stor-layout.c > =================================================================== > --- gcc/stor-layout.c (revision 245115) > +++ gcc/stor-layout.c (working copy) > @@ -718,7 +718,8 @@ layout_decl (tree decl, unsigned int kno > (unsigned) BIGGEST_FIELD_ALIGNMENT)); > #endif > #ifdef ADJUST_FIELD_ALIGN > - SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, DECL_ALIGN (decl))); > + SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, TREE_TYPE (decl), > + DECL_ALIGN (decl))); > #endif > } > > @@ -1032,7 +1033,7 @@ update_alignment_for_field (record_layou > > #ifdef ADJUST_FIELD_ALIGN > if (! TYPE_USER_ALIGN (type)) > - type_align = ADJUST_FIELD_ALIGN (field, type_align); > + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); > #endif > > /* Targets might chose to handle unnamed and hence possibly > @@ -1260,7 +1261,7 @@ place_field (record_layout_info rli, tre > > #ifdef ADJUST_FIELD_ALIGN > if (! TYPE_USER_ALIGN (type)) > - type_align = ADJUST_FIELD_ALIGN (field, type_align); > + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); > #endif > > /* A bit field may not span more units of alignment of its type > @@ -1303,7 +1304,7 @@ place_field (record_layout_info rli, tre > > #ifdef ADJUST_FIELD_ALIGN > if (! TYPE_USER_ALIGN (type)) > - type_align = ADJUST_FIELD_ALIGN (field, type_align); > + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); > #endif > > if (maximum_field_alignment != 0) > @@ -2411,9 +2412,7 @@ min_align_of_type (tree type) > #endif > unsigned int field_align = align; > #ifdef ADJUST_FIELD_ALIGN > - tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, type); > - field_align = ADJUST_FIELD_ALIGN (field, field_align); > - ggc_free (field); > + field_align = ADJUST_FIELD_ALIGN (NULL_TREE, type, field_align); > #endif > align = MIN (align, field_align); > } > Index: libobjc/encoding.c > =================================================================== > --- libobjc/encoding.c (revision 245115) > +++ libobjc/encoding.c (working copy) > @@ -1159,7 +1159,7 @@ objc_layout_structure_next_member (struc > desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT); > #endif > #ifdef ADJUST_FIELD_ALIGN > - desired_align = ADJUST_FIELD_ALIGN (type, desired_align); > + desired_align = ADJUST_FIELD_ALIGN (type, type, desired_align); > #endif > > /* Record must have at least as much alignment as any field.
On Fri, 3 Feb 2017, Iain Sandoe wrote: > > > On 2 Feb 2017, at 08:08, Richard Biener <rguenther@suse.de> wrote: > > > > On Wed, 1 Feb 2017, Segher Boessenkool wrote: > > > >> On Wed, Feb 01, 2017 at 03:53:09PM -0600, Segher Boessenkool wrote: > >>> On Wed, Feb 01, 2017 at 11:59:10AM +0100, Richard Biener wrote: > >>>> Wasn't successful in making a cross to ppc64-linux build its libobjc. > >>> > >>> I'll do a native build. Just the patch in the first message in this > >>> thread? And just running the testsuite is enough, or is there > >>> something specific you want tested? > >> > >> Done now. No new failures on powerpc64-linux {-m32,-m64}. I needed > >> the following additional patch; I do not know if that works on other > >> targets (or if it actually is correct!) > > > > Yes, I knew I needed something there but didn't know what is correct > > either ;) But I concluded as 'type' is const char * here which is > > totally broken it probably doesn't matter what we pass as 2nd argument > > either ... > > > > So, consider the patch changed like Segher proposed below (and thanks > > Segher for the testing). For reference attached again below, including > > tm.texi.in. > > > > Barring further comments I'll check this in at the beginning of next > > week. > > I bootstrapped (+ada +obj-c++) 245116+this patch on x86_64-darwin15 and > powerpc-darwin9, I don’t see any regressions on the objective-c or > objective-c++ suites (which include testing -fgnu-runtime on Darwin). Now applied as r245245 with the earlier PR79256 fix (partly) reverted. Richard. > Iain > > > > > Thanks, > > Richard. > > > > 2017-02-02 Richard Biener <rguenther@suse.de> > > > > PR tree-optimization/79256 > > PR middle-end/79278 > > * builtins.c (get_object_alignment_2): Use min_align_of_type > > to extract alignment for MEM_REFs to honor BIGGEST_FIELD_ALIGNMENT > > and ADJUST_FIELD_ALIGN. > > > > * doc/tm.texi.in (ADJUST_FIELD_ALIGN): Adjust to take additional > > type parameter. > > * doc/tm.texi: Regenerate. > > * stor-layout.c (layout_decl): Adjust. > > (update_alignment_for_field): Likewise. > > (place_field): Likewise. > > (min_align_of_type): Likewise. > > * config/arc/arc.h (ADJUST_FIELD_ALIGN): Adjust. > > * config/epiphany/epiphany.h (ADJUST_FIELD_ALIGN): Likewise. > > * config/epiphany/epiphany.c (epiphany_adjust_field_align): Likewise. > > * config/frv/frv.h (ADJUST_FIELD_ALIGN): Likewise. > > * config/frv/frv.c (frv_adjust_field_align): Likewise. > > * config/i386/i386.h (ADJUST_FIELD_ALIGN): Likewise. > > * config/i386/i386.c (x86_field_alignment): Likewise. > > * config/rs6000/aix.h (ADJUST_FIELD_ALIGN): Likewise. > > * config/rs6000/darwin.h (ADJUST_FIELD_ALIGN): Likewise. > > * config/rs6000/freebsd64.h (ADJUST_FIELD_ALIGN): Likewise. > > * config/rs6000/linux64.h (ADJUST_FIELD_ALIGN): Likewise. > > * config/rs6000/sysv4.h (ADJUST_FIELD_ALIGN): Likewise. > > * config/rs6000/rs6000.c (rs6000_special_adjust_field_align_p): > > Likewise. > > > > go/ > > * go-backend.c (go_field_alignment): Adjust. > > > > libobjc/ > > * encoding.c (objc_layout_structure_next_member): Adjust > > ADJUST_FIELD_ALIGN usage. > > > > Index: gcc/builtins.c > > =================================================================== > > --- gcc/builtins.c (revision 245115) > > +++ gcc/builtins.c (working copy) > > @@ -334,9 +334,11 @@ get_object_alignment_2 (tree exp, unsign > > Do so only if get_pointer_alignment_1 did not reveal absolute > > alignment knowledge and if using that alignment would > > improve the situation. */ > > + unsigned int talign; > > if (!addr_p && !known_alignment > > - && TYPE_ALIGN (TREE_TYPE (exp)) > align) > > - align = TYPE_ALIGN (TREE_TYPE (exp)); > > + && (talign = min_align_of_type (TREE_TYPE (exp)) * BITS_PER_UNIT) > > + && talign > align) > > + align = talign; > > else > > { > > /* Else adjust bitpos accordingly. */ > > Index: gcc/config/arc/arc.h > > =================================================================== > > --- gcc/config/arc/arc.h (revision 245115) > > +++ gcc/config/arc/arc.h (working copy) > > @@ -317,8 +317,8 @@ if (GET_MODE_CLASS (MODE) == MODE_INT \ > > construct. > > */ > > > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > > -(TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode \ > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > +(TYPE_MODE (strip_array_types (TYPE)) == DFmode \ > > ? MIN ((COMPUTED), 32) : (COMPUTED)) > > > > > > Index: gcc/config/epiphany/epiphany.c > > =================================================================== > > --- gcc/config/epiphany/epiphany.c (revision 245115) > > +++ gcc/config/epiphany/epiphany.c (working copy) > > @@ -2855,12 +2855,12 @@ epiphany_special_round_type_align (tree > > arrays-at-the-end-of-structs work, like for struct gcov_fn_info in > > libgcov.c . */ > > unsigned > > -epiphany_adjust_field_align (tree field, unsigned computed) > > +epiphany_adjust_field_align (tree type, unsigned computed) > > { > > if (computed == 32 > > - && TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE) > > + && TREE_CODE (type) == ARRAY_TYPE) > > { > > - tree elmsz = TYPE_SIZE (TREE_TYPE (TREE_TYPE (field))); > > + tree elmsz = TYPE_SIZE (TREE_TYPE (type)); > > > > if (!tree_fits_uhwi_p (elmsz) || tree_to_uhwi (elmsz) >= 32) > > return 64; > > Index: gcc/config/epiphany/epiphany.h > > =================================================================== > > --- gcc/config/epiphany/epiphany.h (revision 245115) > > +++ gcc/config/epiphany/epiphany.h (working copy) > > @@ -187,8 +187,8 @@ along with GCC; see the file COPYING3. > > (SPECIFIED_ALIGN)) \ > > : MAX ((MANGLED_ALIGN), (SPECIFIED_ALIGN))) > > > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > > - epiphany_adjust_field_align((FIELD), (COMPUTED)) > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > + epiphany_adjust_field_align((TYPE), (COMPUTED)) > > > > /* Layout of source language data types. */ > > > > Index: gcc/config/frv/frv.c > > =================================================================== > > --- gcc/config/frv/frv.c (revision 245115) > > +++ gcc/config/frv/frv.c (working copy) > > @@ -6482,7 +6482,8 @@ int > > frv_adjust_field_align (tree field, int computed) > > { > > /* Make sure that the bitfield is not wider than the type. */ > > - if (DECL_BIT_FIELD (field) > > + if (field > > + && DECL_BIT_FIELD (field) > > && !DECL_ARTIFICIAL (field)) > > { > > tree parent = DECL_CONTEXT (field); > > Index: gcc/config/frv/frv.h > > =================================================================== > > --- gcc/config/frv/frv.h (revision 245115) > > +++ gcc/config/frv/frv.h (working copy) > > @@ -331,7 +331,7 @@ > > alignment computed in the usual way is COMPUTED. GCC uses this > > value instead of the value in `BIGGEST_ALIGNMENT' or > > `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only. */ > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > frv_adjust_field_align (FIELD, COMPUTED) > > #endif > > > > Index: gcc/config/i386/i386.c > > =================================================================== > > --- gcc/config/i386/i386.c (revision 245115) > > +++ gcc/config/i386/i386.c (working copy) > > @@ -41676,10 +41676,9 @@ x86_file_start (void) > > } > > > > int > > -x86_field_alignment (tree field, int computed) > > +x86_field_alignment (tree type, int computed) > > { > > machine_mode mode; > > - tree type = TREE_TYPE (field); > > > > if (TARGET_64BIT || TARGET_ALIGN_DOUBLE) > > return computed; > > Index: gcc/config/i386/i386.h > > =================================================================== > > --- gcc/config/i386/i386.h (revision 245115) > > +++ gcc/config/i386/i386.h (working copy) > > @@ -847,8 +847,8 @@ extern const char *host_detect_local_cpu > > #define BIGGEST_FIELD_ALIGNMENT 32 > > #endif > > #else > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > > - x86_field_alignment ((FIELD), (COMPUTED)) > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > + x86_field_alignment ((TYPE), (COMPUTED)) > > #endif > > > > /* If defined, a C expression to compute the alignment given to a > > Index: gcc/config/rs6000/aix.h > > =================================================================== > > --- gcc/config/rs6000/aix.h (revision 245115) > > +++ gcc/config/rs6000/aix.h (working copy) > > @@ -218,9 +218,9 @@ > > > > /* This now supports a natural alignment mode. */ > > /* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */ > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > ((TARGET_ALIGN_NATURAL == 0 \ > > - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ > > + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ > > ? MIN ((COMPUTED), 32) \ > > : (COMPUTED)) > > > > Index: gcc/config/rs6000/darwin.h > > =================================================================== > > --- gcc/config/rs6000/darwin.h (revision 245115) > > +++ gcc/config/rs6000/darwin.h (working copy) > > @@ -319,7 +319,7 @@ extern int darwin_emit_branch_islands; > > suppressed for vector and long double items (both 128 in size). > > There is a dummy use of the FIELD argument to avoid an unused variable > > warning (see PR59496). */ > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > ((void) (FIELD), \ > > (TARGET_ALIGN_NATURAL \ > > ? (COMPUTED) \ > > Index: gcc/config/rs6000/freebsd64.h > > =================================================================== > > --- gcc/config/rs6000/freebsd64.h (revision 245115) > > +++ gcc/config/rs6000/freebsd64.h (working copy) > > @@ -365,12 +365,12 @@ extern int dot_symbols; > > > > /* 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)) \ > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ > > ? 128 \ > > : (TARGET_64BIT \ > > && TARGET_ALIGN_NATURAL == 0 \ > > - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ > > + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ > > ? MIN ((COMPUTED), 32) \ > > : (COMPUTED)) > > > > Index: gcc/config/rs6000/linux64.h > > =================================================================== > > --- gcc/config/rs6000/linux64.h (revision 245115) > > +++ gcc/config/rs6000/linux64.h (working copy) > > @@ -292,12 +292,12 @@ extern int dot_symbols; > > > > /* 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)) \ > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ > > ? 128 \ > > : (TARGET_64BIT \ > > && TARGET_ALIGN_NATURAL == 0 \ > > - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ > > + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ > > ? MIN ((COMPUTED), 32) \ > > : (COMPUTED)) > > > > Index: gcc/config/rs6000/rs6000.c > > =================================================================== > > --- gcc/config/rs6000/rs6000.c (revision 245115) > > +++ gcc/config/rs6000/rs6000.c (working copy) > > @@ -7972,9 +7972,9 @@ rs6000_data_alignment (tree type, unsign > > /* Previous GCC releases forced all vector types to have 16-byte alignment. */ > > > > bool > > -rs6000_special_adjust_field_align_p (tree field, unsigned int computed) > > +rs6000_special_adjust_field_align_p (tree type, unsigned int computed) > > { > > - if (TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE) > > + if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE) > > { > > if (computed != 128) > > { > > Index: gcc/config/rs6000/sysv4.h > > =================================================================== > > --- gcc/config/rs6000/sysv4.h (revision 245115) > > +++ gcc/config/rs6000/sysv4.h (working copy) > > @@ -298,8 +298,8 @@ do { \ > > > > /* An expression for the alignment of a structure field FIELD if the > > alignment computed in the usual way is COMPUTED. */ > > -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ > > - (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED)) \ > > +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ > > + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ > > ? 128 : COMPUTED) > > > > #undef BIGGEST_FIELD_ALIGNMENT > > Index: gcc/doc/tm.texi > > =================================================================== > > --- gcc/doc/tm.texi (revision 245115) > > +++ gcc/doc/tm.texi (working copy) > > @@ -1042,13 +1042,15 @@ structure and union fields only, unless > > by the @code{__attribute__ ((aligned (@var{n})))} construct. > > @end defmac > > > > -@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{computed}) > > -An expression for the alignment of a structure field @var{field} if the > > -alignment computed in the usual way (including applying of > > -@code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the > > +@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed}) > > +An expression for the alignment of a structure field @var{field} of > > +type @var{type} if the alignment computed in the usual way (including > > +applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the > > alignment) is @var{computed}. It overrides alignment only if the > > field alignment has not been set by the > > -@code{__attribute__ ((aligned (@var{n})))} construct. > > +@code{__attribute__ ((aligned (@var{n})))} construct. Note that @var{field} > > +may be @code{NULL_TREE} in case we just query for the minimum alignment > > +of a field of type @var{type} in structure context. > > @end defmac > > > > @defmac MAX_STACK_ALIGNMENT > > Index: gcc/doc/tm.texi.in > > =================================================================== > > --- gcc/doc/tm.texi.in (revision 245115) > > +++ gcc/doc/tm.texi.in (working copy) > > @@ -990,13 +990,15 @@ structure and union fields only, unless > > by the @code{__attribute__ ((aligned (@var{n})))} construct. > > @end defmac > > > > -@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{computed}) > > -An expression for the alignment of a structure field @var{field} if the > > -alignment computed in the usual way (including applying of > > -@code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the > > +@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed}) > > +An expression for the alignment of a structure field @var{field} of > > +type @var{type} if the alignment computed in the usual way (including > > +applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the > > alignment) is @var{computed}. It overrides alignment only if the > > field alignment has not been set by the > > -@code{__attribute__ ((aligned (@var{n})))} construct. > > +@code{__attribute__ ((aligned (@var{n})))} construct. Note that @var{field} > > +may be @code{NULL_TREE} in case we just query for the minimum alignment > > +of a field of type @var{type} in structure context. > > @end defmac > > > > @defmac MAX_STACK_ALIGNMENT > > Index: gcc/go/go-backend.c > > =================================================================== > > --- gcc/go/go-backend.c (revision 245115) > > +++ gcc/go/go-backend.c (working copy) > > @@ -71,11 +71,7 @@ go_field_alignment (tree t) > > #endif > > > > #ifdef ADJUST_FIELD_ALIGN > > - { > > - tree field ATTRIBUTE_UNUSED; > > - field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL, t); > > - v = ADJUST_FIELD_ALIGN (field, v); > > - } > > + v = ADJUST_FIELD_ALIGN (NULL_TREE, t, v); > > #endif > > > > return v / BITS_PER_UNIT; > > Index: gcc/stor-layout.c > > =================================================================== > > --- gcc/stor-layout.c (revision 245115) > > +++ gcc/stor-layout.c (working copy) > > @@ -718,7 +718,8 @@ layout_decl (tree decl, unsigned int kno > > (unsigned) BIGGEST_FIELD_ALIGNMENT)); > > #endif > > #ifdef ADJUST_FIELD_ALIGN > > - SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, DECL_ALIGN (decl))); > > + SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, TREE_TYPE (decl), > > + DECL_ALIGN (decl))); > > #endif > > } > > > > @@ -1032,7 +1033,7 @@ update_alignment_for_field (record_layou > > > > #ifdef ADJUST_FIELD_ALIGN > > if (! TYPE_USER_ALIGN (type)) > > - type_align = ADJUST_FIELD_ALIGN (field, type_align); > > + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); > > #endif > > > > /* Targets might chose to handle unnamed and hence possibly > > @@ -1260,7 +1261,7 @@ place_field (record_layout_info rli, tre > > > > #ifdef ADJUST_FIELD_ALIGN > > if (! TYPE_USER_ALIGN (type)) > > - type_align = ADJUST_FIELD_ALIGN (field, type_align); > > + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); > > #endif > > > > /* A bit field may not span more units of alignment of its type > > @@ -1303,7 +1304,7 @@ place_field (record_layout_info rli, tre > > > > #ifdef ADJUST_FIELD_ALIGN > > if (! TYPE_USER_ALIGN (type)) > > - type_align = ADJUST_FIELD_ALIGN (field, type_align); > > + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); > > #endif > > > > if (maximum_field_alignment != 0) > > @@ -2411,9 +2412,7 @@ min_align_of_type (tree type) > > #endif > > unsigned int field_align = align; > > #ifdef ADJUST_FIELD_ALIGN > > - tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, type); > > - field_align = ADJUST_FIELD_ALIGN (field, field_align); > > - ggc_free (field); > > + field_align = ADJUST_FIELD_ALIGN (NULL_TREE, type, field_align); > > #endif > > align = MIN (align, field_align); > > } > > Index: libobjc/encoding.c > > =================================================================== > > --- libobjc/encoding.c (revision 245115) > > +++ libobjc/encoding.c (working copy) > > @@ -1159,7 +1159,7 @@ objc_layout_structure_next_member (struc > > desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT); > > #endif > > #ifdef ADJUST_FIELD_ALIGN > > - desired_align = ADJUST_FIELD_ALIGN (type, desired_align); > > + desired_align = ADJUST_FIELD_ALIGN (type, type, desired_align); > > #endif > > > > /* Record must have at least as much alignment as any field. > >
Index: gcc/builtins.c =================================================================== --- gcc/builtins.c (revision 245115) +++ gcc/builtins.c (working copy) @@ -334,9 +334,11 @@ get_object_alignment_2 (tree exp, unsign Do so only if get_pointer_alignment_1 did not reveal absolute alignment knowledge and if using that alignment would improve the situation. */ + unsigned int talign; if (!addr_p && !known_alignment - && TYPE_ALIGN (TREE_TYPE (exp)) > align) - align = TYPE_ALIGN (TREE_TYPE (exp)); + && (talign = min_align_of_type (TREE_TYPE (exp)) * BITS_PER_UNIT) + && talign > align) + align = talign; else { /* Else adjust bitpos accordingly. */ Index: gcc/config/arc/arc.h =================================================================== --- gcc/config/arc/arc.h (revision 245115) +++ gcc/config/arc/arc.h (working copy) @@ -317,8 +317,8 @@ if (GET_MODE_CLASS (MODE) == MODE_INT \ construct. */ -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ -(TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode \ +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ +(TYPE_MODE (strip_array_types (TYPE)) == DFmode \ ? MIN ((COMPUTED), 32) : (COMPUTED)) Index: gcc/config/epiphany/epiphany.c =================================================================== --- gcc/config/epiphany/epiphany.c (revision 245115) +++ gcc/config/epiphany/epiphany.c (working copy) @@ -2855,12 +2855,12 @@ epiphany_special_round_type_align (tree arrays-at-the-end-of-structs work, like for struct gcov_fn_info in libgcov.c . */ unsigned -epiphany_adjust_field_align (tree field, unsigned computed) +epiphany_adjust_field_align (tree type, unsigned computed) { if (computed == 32 - && TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE) + && TREE_CODE (type) == ARRAY_TYPE) { - tree elmsz = TYPE_SIZE (TREE_TYPE (TREE_TYPE (field))); + tree elmsz = TYPE_SIZE (TREE_TYPE (type)); if (!tree_fits_uhwi_p (elmsz) || tree_to_uhwi (elmsz) >= 32) return 64; Index: gcc/config/epiphany/epiphany.h =================================================================== --- gcc/config/epiphany/epiphany.h (revision 245115) +++ gcc/config/epiphany/epiphany.h (working copy) @@ -187,8 +187,8 @@ along with GCC; see the file COPYING3. (SPECIFIED_ALIGN)) \ : MAX ((MANGLED_ALIGN), (SPECIFIED_ALIGN))) -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ - epiphany_adjust_field_align((FIELD), (COMPUTED)) +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ + epiphany_adjust_field_align((TYPE), (COMPUTED)) /* Layout of source language data types. */ Index: gcc/config/frv/frv.c =================================================================== --- gcc/config/frv/frv.c (revision 245115) +++ gcc/config/frv/frv.c (working copy) @@ -6482,7 +6482,8 @@ int frv_adjust_field_align (tree field, int computed) { /* Make sure that the bitfield is not wider than the type. */ - if (DECL_BIT_FIELD (field) + if (field + && DECL_BIT_FIELD (field) && !DECL_ARTIFICIAL (field)) { tree parent = DECL_CONTEXT (field); Index: gcc/config/frv/frv.h =================================================================== --- gcc/config/frv/frv.h (revision 245115) +++ gcc/config/frv/frv.h (working copy) @@ -331,7 +331,7 @@ alignment computed in the usual way is COMPUTED. GCC uses this value instead of the value in `BIGGEST_ALIGNMENT' or `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only. */ -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ frv_adjust_field_align (FIELD, COMPUTED) #endif Index: gcc/config/i386/i386.c =================================================================== --- gcc/config/i386/i386.c (revision 245115) +++ gcc/config/i386/i386.c (working copy) @@ -41676,10 +41676,9 @@ x86_file_start (void) } int -x86_field_alignment (tree field, int computed) +x86_field_alignment (tree type, int computed) { machine_mode mode; - tree type = TREE_TYPE (field); if (TARGET_64BIT || TARGET_ALIGN_DOUBLE) return computed; Index: gcc/config/i386/i386.h =================================================================== --- gcc/config/i386/i386.h (revision 245115) +++ gcc/config/i386/i386.h (working copy) @@ -847,8 +847,8 @@ extern const char *host_detect_local_cpu #define BIGGEST_FIELD_ALIGNMENT 32 #endif #else -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ - x86_field_alignment ((FIELD), (COMPUTED)) +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ + x86_field_alignment ((TYPE), (COMPUTED)) #endif /* If defined, a C expression to compute the alignment given to a Index: gcc/config/rs6000/aix.h =================================================================== --- gcc/config/rs6000/aix.h (revision 245115) +++ gcc/config/rs6000/aix.h (working copy) @@ -218,9 +218,9 @@ /* This now supports a natural alignment mode. */ /* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */ -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ ((TARGET_ALIGN_NATURAL == 0 \ - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ ? MIN ((COMPUTED), 32) \ : (COMPUTED)) Index: gcc/config/rs6000/darwin.h =================================================================== --- gcc/config/rs6000/darwin.h (revision 245115) +++ gcc/config/rs6000/darwin.h (working copy) @@ -319,7 +319,7 @@ extern int darwin_emit_branch_islands; suppressed for vector and long double items (both 128 in size). There is a dummy use of the FIELD argument to avoid an unused variable warning (see PR59496). */ -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ ((void) (FIELD), \ (TARGET_ALIGN_NATURAL \ ? (COMPUTED) \ Index: gcc/config/rs6000/freebsd64.h =================================================================== --- gcc/config/rs6000/freebsd64.h (revision 245115) +++ gcc/config/rs6000/freebsd64.h (working copy) @@ -365,12 +365,12 @@ extern int dot_symbols; /* 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)) \ +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ ? 128 \ : (TARGET_64BIT \ && TARGET_ALIGN_NATURAL == 0 \ - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ ? MIN ((COMPUTED), 32) \ : (COMPUTED)) Index: gcc/config/rs6000/linux64.h =================================================================== --- gcc/config/rs6000/linux64.h (revision 245115) +++ gcc/config/rs6000/linux64.h (working copy) @@ -292,12 +292,12 @@ extern int dot_symbols; /* 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)) \ +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ ? 128 \ : (TARGET_64BIT \ && TARGET_ALIGN_NATURAL == 0 \ - && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \ + && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \ ? MIN ((COMPUTED), 32) \ : (COMPUTED)) Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 245115) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -7972,9 +7972,9 @@ rs6000_data_alignment (tree type, unsign /* Previous GCC releases forced all vector types to have 16-byte alignment. */ bool -rs6000_special_adjust_field_align_p (tree field, unsigned int computed) +rs6000_special_adjust_field_align_p (tree type, unsigned int computed) { - if (TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE) + if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE) { if (computed != 128) { Index: gcc/config/rs6000/sysv4.h =================================================================== --- gcc/config/rs6000/sysv4.h (revision 245115) +++ gcc/config/rs6000/sysv4.h (working copy) @@ -298,8 +298,8 @@ do { \ /* An expression for the alignment of a structure field FIELD if the alignment computed in the usual way is COMPUTED. */ -#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ - (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED)) \ +#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \ + (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \ ? 128 : COMPUTED) #undef BIGGEST_FIELD_ALIGNMENT Index: gcc/doc/tm.texi =================================================================== --- gcc/doc/tm.texi (revision 245115) +++ gcc/doc/tm.texi (working copy) @@ -1042,13 +1042,15 @@ structure and union fields only, unless by the @code{__attribute__ ((aligned (@var{n})))} construct. @end defmac -@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{computed}) -An expression for the alignment of a structure field @var{field} if the -alignment computed in the usual way (including applying of -@code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the +@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed}) +An expression for the alignment of a structure field @var{field} of +type @var{type} if the alignment computed in the usual way (including +applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the alignment) is @var{computed}. It overrides alignment only if the field alignment has not been set by the -@code{__attribute__ ((aligned (@var{n})))} construct. +@code{__attribute__ ((aligned (@var{n})))} construct. Note that @var{field} +may be @code{NULL_TREE} in case we just query for the minimum alignment +of a field of type @var{type} in structure context. @end defmac @defmac MAX_STACK_ALIGNMENT Index: gcc/doc/tm.texi.in =================================================================== --- gcc/doc/tm.texi.in (revision 245115) +++ gcc/doc/tm.texi.in (working copy) @@ -990,13 +990,15 @@ structure and union fields only, unless by the @code{__attribute__ ((aligned (@var{n})))} construct. @end defmac -@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{computed}) -An expression for the alignment of a structure field @var{field} if the -alignment computed in the usual way (including applying of -@code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the +@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed}) +An expression for the alignment of a structure field @var{field} of +type @var{type} if the alignment computed in the usual way (including +applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the alignment) is @var{computed}. It overrides alignment only if the field alignment has not been set by the -@code{__attribute__ ((aligned (@var{n})))} construct. +@code{__attribute__ ((aligned (@var{n})))} construct. Note that @var{field} +may be @code{NULL_TREE} in case we just query for the minimum alignment +of a field of type @var{type} in structure context. @end defmac @defmac MAX_STACK_ALIGNMENT Index: gcc/go/go-backend.c =================================================================== --- gcc/go/go-backend.c (revision 245115) +++ gcc/go/go-backend.c (working copy) @@ -71,11 +71,7 @@ go_field_alignment (tree t) #endif #ifdef ADJUST_FIELD_ALIGN - { - tree field ATTRIBUTE_UNUSED; - field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL, t); - v = ADJUST_FIELD_ALIGN (field, v); - } + v = ADJUST_FIELD_ALIGN (NULL_TREE, t, v); #endif return v / BITS_PER_UNIT; Index: gcc/stor-layout.c =================================================================== --- gcc/stor-layout.c (revision 245115) +++ gcc/stor-layout.c (working copy) @@ -718,7 +718,8 @@ layout_decl (tree decl, unsigned int kno (unsigned) BIGGEST_FIELD_ALIGNMENT)); #endif #ifdef ADJUST_FIELD_ALIGN - SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, DECL_ALIGN (decl))); + SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, TREE_TYPE (decl), + DECL_ALIGN (decl))); #endif } @@ -1032,7 +1033,7 @@ update_alignment_for_field (record_layou #ifdef ADJUST_FIELD_ALIGN if (! TYPE_USER_ALIGN (type)) - type_align = ADJUST_FIELD_ALIGN (field, type_align); + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); #endif /* Targets might chose to handle unnamed and hence possibly @@ -1260,7 +1261,7 @@ place_field (record_layout_info rli, tre #ifdef ADJUST_FIELD_ALIGN if (! TYPE_USER_ALIGN (type)) - type_align = ADJUST_FIELD_ALIGN (field, type_align); + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); #endif /* A bit field may not span more units of alignment of its type @@ -1303,7 +1304,7 @@ place_field (record_layout_info rli, tre #ifdef ADJUST_FIELD_ALIGN if (! TYPE_USER_ALIGN (type)) - type_align = ADJUST_FIELD_ALIGN (field, type_align); + type_align = ADJUST_FIELD_ALIGN (field, type, type_align); #endif if (maximum_field_alignment != 0) @@ -2411,9 +2412,7 @@ min_align_of_type (tree type) #endif unsigned int field_align = align; #ifdef ADJUST_FIELD_ALIGN - tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, type); - field_align = ADJUST_FIELD_ALIGN (field, field_align); - ggc_free (field); + field_align = ADJUST_FIELD_ALIGN (NULL_TREE, type, field_align); #endif align = MIN (align, field_align); } Index: libobjc/encoding.c =================================================================== --- libobjc/encoding.c (revision 245115) +++ libobjc/encoding.c (working copy) @@ -1159,7 +1159,7 @@ objc_layout_structure_next_member (struc desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT); #endif #ifdef ADJUST_FIELD_ALIGN - desired_align = ADJUST_FIELD_ALIGN (type, desired_align); + desired_align = ADJUST_FIELD_ALIGN (type, type, desired_align); #endif /* Record must have at least as much alignment as any field.