diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 25dfba48bbc..dec16b59540 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-13 Iain Sandoe + + * objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c: + Adjust XFAILs. + 2010-12-13 Alexandre Oliva PR debug/46576 diff --git a/gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c b/gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c index 3ac4179c047..b75a09d29fb 100644 --- a/gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c +++ b/gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c @@ -221,9 +221,9 @@ switchfiles (int fields) fputs ("failed to create test files\n", stderr); exit (1); } - /* FIXME: these tests should not be xfailed on PowerPC darwin or aix - but they are because libobjc uses GCC's headers for trying to find - the struct layout but it gets it wrong. */ + /* FIXME: these tests should not be xfailed on aix but they are because + libobjc uses GCC's headers for trying to find the struct layout but it + gets it wrong. */ if (filecnt == 2 || filecnt == 3 || filecnt == 4 @@ -236,7 +236,7 @@ switchfiles (int fields) || filecnt == 22) { fprintf (outfile, "\ -/* { dg-do run { xfail { { \"powerpc*-*-darwin*\" && { ! lp64 } } || { \"powerpc*-*-aix*\" } } } } */\n\ +/* { dg-do run { xfail { \"powerpc*-*-aix*\" } } } */\n\ /* { dg-options \"-w -I%s -fgnu-runtime\" } */\n", srcdir); } /* FIXME: these should not be xfailed but they are because diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog index fa609a58f86..81c790fc4cb 100644 --- a/libobjc/ChangeLog +++ b/libobjc/ChangeLog @@ -1,3 +1,8 @@ +2010-12-13 Iain Sandoe + + * encoding.c (_darwin_rs6000_special_round_type_align): New. + (darwin_rs6000_special_round_type_align): Adjust to use new routine. + 2010-12-11 Nicola Pero * sendmsg.c (selector_resolveClassMethod): New. diff --git a/libobjc/encoding.c b/libobjc/encoding.c index 13647d7d47c..92b7305d83e 100644 --- a/libobjc/encoding.c +++ b/libobjc/encoding.c @@ -117,27 +117,55 @@ static int __attribute__ ((__unused__)) not_target_flags = 0; to a static variable, initialized by target overrides. This is reset in linux64.h but not in darwin64.h. The macro is not used by *86*. */ -#if __MACH__ && __LP64__ -# undef TARGET_ALIGN_NATURAL -# define TARGET_ALIGN_NATURAL 1 +#if __MACH__ +# if __LP64__ +# undef TARGET_ALIGN_NATURAL +# define TARGET_ALIGN_NATURAL 1 +# endif + +/* On Darwin32, we need to recurse until we find the starting stuct type. */ +static int +_darwin_rs6000_special_round_type_align (const char *struc, int comp, int spec) +{ + const char *_stp , *_fields = TYPE_FIELDS (struc); + if (!_fields) + return MAX (comp, spec); + _stp = strip_array_types (_fields); + if (TYPE_MODE(_stp) == _C_COMPLEX) + _stp++; + switch (TYPE_MODE(_stp)) + { + case RECORD_TYPE: + case UNION_TYPE: + return MAX (MAX (comp, spec), objc_alignof_type (_stp) * BITS_PER_UNIT); + break; + case DFmode: + case _C_LNG_LNG: + case _C_ULNG_LNG: + return MAX (MAX (comp, spec), 64); + break; + + default: + return MAX (comp, spec); + break; + } +} + +/* See comment below. */ +#define darwin_rs6000_special_round_type_align(S,C,S2) \ + (_darwin_rs6000_special_round_type_align ((char*)(S), (int)(C), (int)(S2))) #endif /* FIXME: while this file has no business including tm.h, this definitely has no business defining this macro but it is only way around without really rewritting this file, - should look after the branch of 3.4 to fix this. - FIXME1: It's also out of date, darwin no longer has the same alignment - 'special' as aix - this is probably the origin of the m32 breakage. */ + should look after the branch of 3.4 to fix this. */ #define rs6000_special_round_type_align(STRUCT, COMPUTED, SPECIFIED) \ ({ const char *_fields = TYPE_FIELDS (STRUCT); \ ((_fields != 0 \ && TYPE_MODE (strip_array_types (TREE_TYPE (_fields))) == DFmode) \ ? MAX (MAX (COMPUTED, SPECIFIED), 64) \ : MAX (COMPUTED, SPECIFIED));}) -/* FIXME: The word 'fixme' is insufficient to explain the wrong-ness - of this next macro definition. */ -#define darwin_rs6000_special_round_type_align(S,C,S2) \ - rs6000_special_round_type_align(S,C,S2) /* Skip a variable name, enclosed in quotes ("). */