Patchwork [libobjc] Fix Darwin32 PPC struct size foo.

login
register
mail settings
Submitter IainS
Date Dec. 10, 2010, 6:22 p.m.
Message ID <22676F98-CF2E-4E24-9BB6-46CF40BD1662@sandoe-acoustics.co.uk>
Download mbox | patch
Permalink /patch/75126/
State New
Headers show

Comments

IainS - Dec. 10, 2010, 6:22 p.m.
this reached the top of the TODO...

... It is understood that the scheme in use is non-ideal -
   - but, given that we are not going to change it this side of 4.7 ...

this makes Darwin work with the existing design (so both m32 & m64 are  
OK with GNU runtime).

OK for trunk?
Iain

libobjc:

	* encoding.c (_darwin_rs6000_special_round_type_align): New.
	(darwin_rs6000_special_round_type_align): Adjust to use new routine.

testsuite:

	* objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c: Adjust  
XFAILs.
Nicola Pero - Dec. 10, 2010, 6:57 p.m.
> this makes Darwin work with the existing design (so both m32 & m64 are  
> OK with GNU runtime).
>
> OK for trunk?

OK for the libobjc side - ie, for the unfortunate but inevitable approach
of just hacking in "a fix" using the existing framework for 4.6. ;-)

The actual change is very Darwin-specific, so I think a Darwin maintainer needs
to OK it too.

Thanks

PS: please replace 'stuct' with 'struct' in the following comment before commit ;-) --

+/* On Darwin32, we need to recurse until we find the starting stuct type.  */
Andrew Pinski - Dec. 10, 2010, 7:18 p.m.
On Fri, Dec 10, 2010 at 10:57 AM, Nicola Pero
<nicola.pero@meta-innovation.com> wrote:
>
>> this makes Darwin work with the existing design (so both m32 & m64 are
>> OK with GNU runtime).
>>
>> OK for trunk?
>
> OK for the libobjc side - ie, for the unfortunate but inevitable approach
> of just hacking in "a fix" using the existing framework for 4.6. ;-)

Yes this is just a hack.  I did have a branch (which I have not
updated in awhile) to fix this hackier really.

-- Pinski
IainS - Dec. 10, 2010, 7:52 p.m.
On 10 Dec 2010, at 19:18, Andrew Pinski wrote:

> On Fri, Dec 10, 2010 at 10:57 AM, Nicola Pero
> <nicola.pero@meta-innovation.com> wrote:
>>
>>> this makes Darwin work with the existing design (so both m32 & m64  
>>> are
>>> OK with GNU runtime).
>>>
>>> OK for trunk?
>>
>> OK for the libobjc side - ie, for the unfortunate but inevitable  
>> approach
>> of just hacking in "a fix" using the existing framework for 4.6. ;-)
>
> Yes this is just a hack.  I did have a branch (which I have not
> updated in awhile) to fix this hackier really.


Well, this doesn't increase the hack-factor (it simply makes the  
existing hack work on another target).

we're all agreed on the need for change :-)

AFAIU, we don't think that a new ABI  is feasible within 4.6 - so  
rather than have another broken release, one might as well have a fix.

cheers
Iain
Mike Stump - Dec. 10, 2010, 8:11 p.m.
On Dec 10, 2010, at 10:22 AM, IainS wrote:
> this makes Darwin work with the existing design (so both m32 & m64 are OK with GNU runtime).
> 
> OK for trunk?

Ok.

Patch

Index: libobjc/encoding.c
===================================================================
--- libobjc/encoding.c	(revision 167684)
+++ libobjc/encoding.c	(working copy)
@@ -117,29 +117,56 @@  static int __attribute__ ((__unused__)) not_target
  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 (").  */
 static inline
 const char *
Index: gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c
===================================================================
--- gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c	(revision 167684)
+++ gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c	(working copy)
@@ -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