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.
Thanks,
Richard.
2017-02-02 Richard Biener <[email protected]>
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.