This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

host support for darwin9


This patch adds some autoconfiscation so that GCC can build on
darwin9.  Of course, there isn't a final darwin9 yet, so there could
still be changes, but I'm fairly sure this is at least in the right
direction.

The changes are all related to better standards conformance on
Darwin:

- there is no longer a 'struct sigaltstack', it's called stack_t, but
  that doesn't exist on earlier Darwin versions; fortunately recent
  (even Panther) headers also prototype the sigaltstack() function, so
  the declaration is no longer necessary;

- fields for a number of structures have grown underscores.
  Apparently you are supposed to just use __r0 in your source.
  I expect this to change once someone realises that __r0 is not a
  very safe name either, so I made provision for that with macros.

I'll call this a bugfix and commit it to the trunk, since it'll be
annoying if 4.2 doesn't build on darwin9; it might be final before 4.3 is.

-- 
- Geoffrey Keating <geoffk@apple.com>

===File ~/patches/gcc-leopardconfig.patch===================
Index: gcc/ChangeLog
2006-06-02  Geoffrey Keating  <geoffk@apple.com>

	* config/rs6000/host-darwin.c (sigaltstack): Protect prototype with
	HAVE_DECL_SIGALTSTACK.
	(MC_FLD): New.
	(segv_handler): Use MC_FLD.
	* configure.ac: Check for a sigaltstack declaration.
	Compute HAS_MCONTEXT_T_UNDERSCORES on Darwin.
	* configure: Regenerate.
	* config.in: Regenerate.

Index: boehm-gc/ChangeLog
2006-06-02  Geoffrey Keating  <geoffk@apple.com>

	* configure.ac: Define HAS_PPC_THREAD_STATE_R0,
	HAS_PPC_THREAD_STATE___R0, HAS_PPC_THREAD_STATE64_R0,
	HAS_PPC_THREAD_STATE64___R0, HAS_I386_THREAD_STATE_EAX,
	HAS_I386_THREAD_STATE___EAX.
	* configure: Regenerate.
	* include/gc_config.h.in: Regenerate.
	* darwin_stop_world.c (PPC_RED_ZONE_SIZE): Use standard Darwin
	macro names to determine value.
	(THREAD_STATE): New.
	(THREAD_FLD): New.
	(GC_push_all_stacks): Use THREAD_STATE and THREAD_FLD in both versions.

Index: gcc/configure.ac
===================================================================
--- gcc/configure.ac	(revision 114258)
+++ gcc/configure.ac	(working copy)
@@ -1154,6 +1154,12 @@
 #endif
 ])
 
+gcc_AC_CHECK_DECLS(sigaltstack, , ,[
+#include "ansidecl.h"
+#include "system.h"
+#include <signal.h>
+])
+
 # More time-related stuff.
 AC_CACHE_CHECK(for struct tms, ac_cv_struct_tms, [
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
@@ -1337,6 +1343,22 @@
 	fi
 fi
 
+case ${host} in
+  powerpc-*-darwin*)
+    AC_CACHE_CHECK([whether mcontext_t fields have underscores],
+      gcc_cv_mcontext_underscores,
+      AC_COMPILE_IFELSE([
+#include <ucontext.h>
+int main() { mcontext_t m; if (m->ss.srr0) return 0; return 0; }
+],
+	gcc_cv_mcontext_underscores=no, gcc_cv_mcontext_underscores=yes))
+      if test $gcc_cv_mcontext_underscores = yes; then
+        AC_DEFINE(HAS_MCONTEXT_T_UNDERSCORES,,dnl
+          [mcontext_t fields start with __])
+      fi
+    ;;
+esac
+
 # ---------
 # Threading
 # ---------
Index: gcc/config/rs6000/host-darwin.c
===================================================================
--- gcc/config/rs6000/host-darwin.c	(revision 114258)
+++ gcc/config/rs6000/host-darwin.c	(working copy)
@@ -33,10 +33,20 @@
 static void segv_handler (int, siginfo_t *, void *);
 static void darwin_rs6000_extra_signals (void);
 
+#ifndef HAVE_DECL_SIGALTSTACK
 /* This doesn't have a prototype in signal.h in 10.2.x and earlier,
    fixed in later releases.  */
 extern int sigaltstack(const struct sigaltstack *, struct sigaltstack *);
+#endif
 
+/* The fields of the mcontext_t type have acquired underscores in later
+   OS versions.  */
+#ifdef HAS_MCONTEXT_T_UNDERSCORES
+#define MC_FLD(x) __ ## x
+#else
+#define MC_FLD(x) x
+#endif
+
 #undef HOST_HOOKS_EXTRA_SIGNALS
 #define HOST_HOOKS_EXTRA_SIGNALS darwin_rs6000_extra_signals
 
@@ -68,7 +78,7 @@
   sigaddset (&sigset, SIGSEGV);
   sigprocmask (SIG_UNBLOCK, &sigset, NULL);
 
-  faulting_insn = *(unsigned *)uc->uc_mcontext->ss.srr0;
+  faulting_insn = *(unsigned *)uc->uc_mcontext->MC_FLD(ss).MC_FLD(srr0);
 
   /* Note that this only has to work for GCC, so we don't have to deal
      with all the possible cases (GCC has no AltiVec code, for
@@ -117,7 +127,8 @@
     }
 
   fprintf (stderr, "[address=%08lx pc=%08x]\n", 
-	   uc->uc_mcontext->es.dar, uc->uc_mcontext->ss.srr0);
+	   uc->uc_mcontext->MC_FLD(es).MC_FLD(dar),
+	   uc->uc_mcontext->MC_FLD(ss).MC_FLD(srr0));
   internal_error ("Segmentation Fault");
   exit (FATAL_EXIT_CODE);
 }
Index: boehm-gc/darwin_stop_world.c
===================================================================
--- boehm-gc/darwin_stop_world.c	(revision 114258)
+++ boehm-gc/darwin_stop_world.c	(working copy)
@@ -14,12 +14,43 @@
    Page 50: "If a leaf procedure's red zone usage would exceed 224 bytes, then
    it must set up a stack frame just like routines that call other routines."
 */
-#ifdef POWERPC
-# if CPP_WORDSZ == 32
-#   define PPC_RED_ZONE_SIZE 224
-# elif CPP_WORDSZ == 64
-#   define PPC_RED_ZONE_SIZE 320
+#if defined(__ppc__)
+# define PPC_RED_ZONE_SIZE 224
+#elif defined(__ppc64__)
+# define PPC_RED_ZONE_SIZE 320
+#endif
+
+/* Try to work out the right way to access thread state structure members.
+   The structure has changed its definition in different Darwin versions.  */
+#if defined(__ppc__)
+# define THREAD_STATE ppc_thread_state_t
+# if defined (HAS_PPC_THREAD_STATE_R0)
+#  define THREAD_FLD(x) x
+# elif defined (HAS_PPC_THREAD_STATE___R0)
+#  define THREAD_FLD(x) __ ## x
+# else
+#  error can not work out how to access fields of ppc_thread_state_t
 # endif
+#elif defined(__ppc64__)
+# define THREAD_STATE ppc_thread_state64_t
+# if defined (HAS_PPC_THREAD_STATE64_R0)
+#  define THREAD_FLD(x) x
+# elif defined (HAS_PPC_THREAD_STATE64___R0)
+#  define THREAD_FLD(x) __ ## x
+# else
+#  error can not work out how to access fields of ppc_thread_state64_t
+# endif
+#elif defined(__i386__)
+# define THREAD_STATE i386_thread_state_t
+# if defined (HAS_I386_THREAD_STATE_EAX)
+#  define THREAD_FLD(x) x
+# elif defined (HAS_I386_THREAD_STATE___EAX)
+#  define THREAD_FLD(x) __ ## x
+# else
+#  error can not work out how to access fields of i386_thread_state_t
+# endif
+#else
+# error unknown architecture
 #endif
 
 typedef struct StackFrame {
@@ -75,7 +106,7 @@
   GC_thread p;
   pthread_t me;
   ptr_t lo, hi;
-  ppc_thread_state_t state;
+  THREAD_STATE state;
   mach_msg_type_number_t thread_state_count = MACHINE_THREAD_STATE_COUNT;
   
   me = pthread_self();
@@ -95,39 +126,39 @@
 			     &thread_state_count);
 	if(r != KERN_SUCCESS) ABORT("thread_get_state failed");
 	
-	lo = (void*)(state.r1 - PPC_RED_ZONE_SIZE);
+	lo = (void*)(state . THREAD_FLD (r1) - PPC_RED_ZONE_SIZE);
         
-	GC_push_one(state.r0); 
-	GC_push_one(state.r2); 
-	GC_push_one(state.r3); 
-	GC_push_one(state.r4); 
-	GC_push_one(state.r5); 
-	GC_push_one(state.r6); 
-	GC_push_one(state.r7); 
-	GC_push_one(state.r8); 
-	GC_push_one(state.r9); 
-	GC_push_one(state.r10); 
-	GC_push_one(state.r11); 
-	GC_push_one(state.r12); 
-	GC_push_one(state.r13); 
-	GC_push_one(state.r14); 
-	GC_push_one(state.r15); 
-	GC_push_one(state.r16); 
-	GC_push_one(state.r17); 
-	GC_push_one(state.r18); 
-	GC_push_one(state.r19); 
-	GC_push_one(state.r20); 
-	GC_push_one(state.r21); 
-	GC_push_one(state.r22); 
-	GC_push_one(state.r23); 
-	GC_push_one(state.r24); 
-	GC_push_one(state.r25); 
-	GC_push_one(state.r26); 
-	GC_push_one(state.r27); 
-	GC_push_one(state.r28); 
-	GC_push_one(state.r29); 
-	GC_push_one(state.r30); 
-	GC_push_one(state.r31);
+	GC_push_one(state . THREAD_FLD (r0)); 
+	GC_push_one(state . THREAD_FLD (r2)); 
+	GC_push_one(state . THREAD_FLD (r3)); 
+	GC_push_one(state . THREAD_FLD (r4)); 
+	GC_push_one(state . THREAD_FLD (r5)); 
+	GC_push_one(state . THREAD_FLD (r6)); 
+	GC_push_one(state . THREAD_FLD (r7)); 
+	GC_push_one(state . THREAD_FLD (r8)); 
+	GC_push_one(state . THREAD_FLD (r9)); 
+	GC_push_one(state . THREAD_FLD (r10)); 
+	GC_push_one(state . THREAD_FLD (r11)); 
+	GC_push_one(state . THREAD_FLD (r12)); 
+	GC_push_one(state . THREAD_FLD (r13)); 
+	GC_push_one(state . THREAD_FLD (r14)); 
+	GC_push_one(state . THREAD_FLD (r15)); 
+	GC_push_one(state . THREAD_FLD (r16)); 
+	GC_push_one(state . THREAD_FLD (r17)); 
+	GC_push_one(state . THREAD_FLD (r18)); 
+	GC_push_one(state . THREAD_FLD (r19)); 
+	GC_push_one(state . THREAD_FLD (r20)); 
+	GC_push_one(state . THREAD_FLD (r21)); 
+	GC_push_one(state . THREAD_FLD (r22)); 
+	GC_push_one(state . THREAD_FLD (r23)); 
+	GC_push_one(state . THREAD_FLD (r24)); 
+	GC_push_one(state . THREAD_FLD (r25)); 
+	GC_push_one(state . THREAD_FLD (r26)); 
+	GC_push_one(state . THREAD_FLD (r27)); 
+	GC_push_one(state . THREAD_FLD (r28)); 
+	GC_push_one(state . THREAD_FLD (r29)); 
+	GC_push_one(state . THREAD_FLD (r30)); 
+	GC_push_one(state . THREAD_FLD (r31));
       } /* p != me */
       if(p->flags & MAIN_THREAD)
 	hi = GC_stackbottom;
@@ -166,78 +197,74 @@
 	lo = GC_approx_sp();
 	hi = (ptr_t)FindTopOfStack(0);
       } else {
-#     if defined(POWERPC)
-#      if CPP_WORDSZ == 32
-	ppc_thread_state_t info;
-#      else
-	ppc_thread_state64_t info;
-#      endif
+#     if defined(__ppc__) || defined(__ppc64__)
+	THREAD_STATE info;
 	mach_msg_type_number_t outCount = THREAD_STATE_MAX;
 	r = thread_get_state(thread, MACHINE_THREAD_STATE,
 			     (natural_t *)&info, &outCount);
 	if(r != KERN_SUCCESS) ABORT("task_get_state failed");
 
-	lo = (void*)(info.r1 - PPC_RED_ZONE_SIZE);
-	hi = (ptr_t)FindTopOfStack(info.r1);
+	lo = (void*)(info . THREAD_FLD (r1) - PPC_RED_ZONE_SIZE);
+	hi = (ptr_t)FindTopOfStack(info . THREAD_FLD (r1));
 
-	GC_push_one(info.r0); 
-	GC_push_one(info.r2); 
-	GC_push_one(info.r3); 
-	GC_push_one(info.r4); 
-	GC_push_one(info.r5); 
-	GC_push_one(info.r6); 
-	GC_push_one(info.r7); 
-	GC_push_one(info.r8); 
-	GC_push_one(info.r9); 
-	GC_push_one(info.r10); 
-	GC_push_one(info.r11); 
-	GC_push_one(info.r12); 
-	GC_push_one(info.r13); 
-	GC_push_one(info.r14); 
-	GC_push_one(info.r15); 
-	GC_push_one(info.r16); 
-	GC_push_one(info.r17); 
-	GC_push_one(info.r18); 
-	GC_push_one(info.r19); 
-	GC_push_one(info.r20); 
-	GC_push_one(info.r21); 
-	GC_push_one(info.r22); 
-	GC_push_one(info.r23); 
-	GC_push_one(info.r24); 
-	GC_push_one(info.r25); 
-	GC_push_one(info.r26); 
-	GC_push_one(info.r27); 
-	GC_push_one(info.r28); 
-	GC_push_one(info.r29); 
-	GC_push_one(info.r30); 
-	GC_push_one(info.r31);
+	GC_push_one(info . THREAD_FLD (r0)); 
+	GC_push_one(info . THREAD_FLD (r2)); 
+	GC_push_one(info . THREAD_FLD (r3)); 
+	GC_push_one(info . THREAD_FLD (r4)); 
+	GC_push_one(info . THREAD_FLD (r5)); 
+	GC_push_one(info . THREAD_FLD (r6)); 
+	GC_push_one(info . THREAD_FLD (r7)); 
+	GC_push_one(info . THREAD_FLD (r8)); 
+	GC_push_one(info . THREAD_FLD (r9)); 
+	GC_push_one(info . THREAD_FLD (r10)); 
+	GC_push_one(info . THREAD_FLD (r11)); 
+	GC_push_one(info . THREAD_FLD (r12)); 
+	GC_push_one(info . THREAD_FLD (r13)); 
+	GC_push_one(info . THREAD_FLD (r14)); 
+	GC_push_one(info . THREAD_FLD (r15)); 
+	GC_push_one(info . THREAD_FLD (r16)); 
+	GC_push_one(info . THREAD_FLD (r17)); 
+	GC_push_one(info . THREAD_FLD (r18)); 
+	GC_push_one(info . THREAD_FLD (r19)); 
+	GC_push_one(info . THREAD_FLD (r20)); 
+	GC_push_one(info . THREAD_FLD (r21)); 
+	GC_push_one(info . THREAD_FLD (r22)); 
+	GC_push_one(info . THREAD_FLD (r23)); 
+	GC_push_one(info . THREAD_FLD (r24)); 
+	GC_push_one(info . THREAD_FLD (r25)); 
+	GC_push_one(info . THREAD_FLD (r26)); 
+	GC_push_one(info . THREAD_FLD (r27)); 
+	GC_push_one(info . THREAD_FLD (r28)); 
+	GC_push_one(info . THREAD_FLD (r29)); 
+	GC_push_one(info . THREAD_FLD (r30)); 
+	GC_push_one(info . THREAD_FLD (r31));
 #      else
 	/* FIXME: Remove after testing:	*/
 	WARN("This is completely untested and likely will not work\n", 0);
-	i386_thread_state_t info;
+	THREAD_STATE info;
 	mach_msg_type_number_t outCount = THREAD_STATE_MAX;
 	r = thread_get_state(thread, MACHINE_THREAD_STATE,
 			     (natural_t *)&info, &outCount);
 	if(r != KERN_SUCCESS) ABORT("task_get_state failed");
 
-	lo = (void*)info.esp;
-	hi = (ptr_t)FindTopOfStack(info.esp);
+	lo = (void*)info . THREAD_FLD (esp);
+	hi = (ptr_t)FindTopOfStack(info . THREAD_FLD (esp));
 
-	GC_push_one(info.eax); 
-	GC_push_one(info.ebx); 
-	GC_push_one(info.ecx); 
-	GC_push_one(info.edx); 
-	GC_push_one(info.edi); 
-	GC_push_one(info.esi); 
-	/* GC_push_one(info.ebp);  */
-	/* GC_push_one(info.esp);  */
-	GC_push_one(info.ss); 
-	GC_push_one(info.eip); 
-	GC_push_one(info.cs); 
-	GC_push_one(info.ds); 
-	GC_push_one(info.es); 
-	GC_push_one(info.fs); 
-	GC_push_one(info.gs); 
+	GC_push_one(info . THREAD_FLD (eax)); 
+	GC_push_one(info . THREAD_FLD (ebx)); 
+	GC_push_one(info . THREAD_FLD (ecx)); 
+	GC_push_one(info . THREAD_FLD (edx)); 
+	GC_push_one(info . THREAD_FLD (edi)); 
+	GC_push_one(info . THREAD_FLD (esi)); 
+	/* GC_push_one(info . THREAD_FLD (ebp));  */
+	/* GC_push_one(info . THREAD_FLD (esp));  */
+	GC_push_one(info . THREAD_FLD (ss)); 
+	GC_push_one(info . THREAD_FLD (eip)); 
+	GC_push_one(info . THREAD_FLD (cs)); 
+	GC_push_one(info . THREAD_FLD (ds)); 
+	GC_push_one(info . THREAD_FLD (es)); 
+	GC_push_one(info . THREAD_FLD (fs)); 
+	GC_push_one(info . THREAD_FLD (gs)); 
 #      endif /* !POWERPC */
       }
 #     if DEBUG_THREADS
Index: boehm-gc/configure.ac
===================================================================
--- boehm-gc/configure.ac	(revision 114258)
+++ boehm-gc/configure.ac	(working copy)
@@ -232,6 +232,39 @@
 esac
 AM_CONDITIONAL(POWERPC_DARWIN,test x$powerpc_darwin = xtrue)
 
+# Darwin needs a few extra special tests to deal with variation in the
+# system headers.
+case "$host" in
+  powerpc*-*-darwin*)
+    AC_CHECK_MEMBER(ppc_thread_state_t.r0,
+      AC_DEFINE(HAS_PPC_THREAD_STATE_R0,,[ppc_thread_state_t has field r0]),,
+      [#include <mach/thread_status.h>])
+    AC_CHECK_MEMBER(ppc_thread_state_t.__r0,
+      AC_DEFINE(HAS_PPC_THREAD_STATE___R0,,dnl
+        [ppc_thread_state_t has field __r0]),,
+      [#include <mach/thread_status.h>])
+    AC_CHECK_MEMBER(ppc_thread_state64_t.r0,
+      AC_DEFINE(HAS_PPC_THREAD_STATE64_R0,,dnl
+        [ppc_thread_state64_t has field r0]),,
+      [#include <mach/thread_status.h>])
+    AC_CHECK_MEMBER(ppc_thread_state64_t.__r0,
+      AC_DEFINE(HAS_PPC_THREAD_STATE64___R0,,dnl
+        [ppc_thread_state64_t has field __r0]),,
+      [#include <mach/thread_status.h>])
+    ;;
+  i?86*-*-darwin*)
+    AC_CHECK_MEMBER(i386_thread_state_t.eax,
+      AC_DEFINE(HAS_I386_THREAD_STATE_EAX,,dnl
+        [i386_thread_state_t has field eax]),,
+      [#include <mach/thread_status.h>])
+    AC_CHECK_MEMBER(i386_thread_state_t.__eax,
+      AC_DEFINE(HAS_I386_THREAD_STATE___EAX,,dnl
+        [i386_thread_state_t has field __eax]),,
+      [#include <mach/thread_status.h>])
+    ;;
+  *) ;;
+esac
+
 # We never want libdl on darwin. It is a fake libdl that just ends up making
 # dyld calls anyway
 case "$host" in
============================================================


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]