OSDN Git Service

2006-09-21 Sandro Tolaini <tolaini@libero.it>
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Sep 2006 23:47:30 +0000 (23:47 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Sep 2006 23:47:30 +0000 (23:47 +0000)
* os_dep.c: Port to Darwin/i386
* darwin_stop_world.c: Likewise
* include/private/gcconfig.h: Likewise

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117126 138bc75d-0d04-0410-961f-82ee72b054a4

boehm-gc/ChangeLog
boehm-gc/darwin_stop_world.c
boehm-gc/include/private/gcconfig.h
boehm-gc/os_dep.c

index 08b08e8..84d4717 100644 (file)
@@ -1,3 +1,9 @@
+2006-09-21  Sandro Tolaini  <tolaini@libero.it>
+
+       * os_dep.c: Port to Darwin/i386
+       * darwin_stop_world.c: Likewise
+       * include/private/gcconfig.h: Likewise
+       
 2006-06-07  Petr Salinger  <Petr.Salinger@seznam.cz>
 
        * configure.ac: add support for GNU/kFreeBSD, accepted by upstream
index 895fdb6..a89f3f2 100644 (file)
@@ -125,7 +125,18 @@ void GC_push_all_stacks() {
                             (natural_t*)&state,
                             &thread_state_count);
        if(r != KERN_SUCCESS) ABORT("thread_get_state failed");
-       
+
+#if defined(I386)
+       lo = state.esp;
+
+       GC_push_one(state.eax); 
+       GC_push_one(state.ebx); 
+       GC_push_one(state.ecx); 
+       GC_push_one(state.edx); 
+       GC_push_one(state.edi); 
+       GC_push_one(state.esi); 
+       GC_push_one(state.ebp); 
+#elif defined(POWERPC)
        lo = (void*)(state . THREAD_FLD (r1) - PPC_RED_ZONE_SIZE);
         
        GC_push_one(state . THREAD_FLD (r0)); 
@@ -159,6 +170,9 @@ void GC_push_all_stacks() {
        GC_push_one(state . THREAD_FLD (r29)); 
        GC_push_one(state . THREAD_FLD (r30)); 
        GC_push_one(state . THREAD_FLD (r31));
+#else
+# error FIXME for non-x86 || ppc architectures
+#endif
       } /* p != me */
       if(p->flags & MAIN_THREAD)
        hi = GC_stackbottom;
index d7d96b1..26db82e 100644 (file)
 #    define mach_type_known
 #   elif defined(__i386__)
 #    define I386
-     --> Not really supported, but at least we recognize it.
+#    define mach_type_known
 #   endif
 # endif
 # if defined(NeXT) && defined(mc68000)
 /* #     define MPROTECT_VDB  Not quite working yet? */
 #     define DYNAMIC_LOADING
 #   endif
+#   ifdef DARWIN
+#     define OS_TYPE "DARWIN"
+#     define DARWIN_DONT_PARSE_STACK
+#     define DYNAMIC_LOADING
+      /* XXX: see get_end(3), get_etext() and get_end() should not be used.
+        These aren't used when dyld support is enabled (it is by default) */
+#     define DATASTART ((ptr_t) get_etext())
+#     define DATAEND   ((ptr_t) get_end())
+#     define STACKBOTTOM ((ptr_t) 0xc0000000)
+#     define USE_MMAP
+#     define USE_MMAP_ANON
+#     define USE_ASM_PUSH_REGS
+      /* This is potentially buggy. It needs more testing. See the comments in
+        os_dep.c.  It relies on threads to track writes. */
+#     ifdef GC_DARWIN_THREADS
+/* #       define MPROTECT_VDB -- disabled for now.  May work for some apps. */
+#     endif
+#     include <unistd.h>
+#     define GETPAGESIZE() getpagesize()
+      /* There seems to be some issues with trylock hanging on darwin. This
+         should be looked into some more */
+#      define NO_PTHREAD_TRYLOCK
+#   endif /* DARWIN */
 # endif
 
 # ifdef NS32K
index 13692d9..98ab6be 100644 (file)
@@ -3802,6 +3802,10 @@ catch_exception_raise(
         mach_msg_type_number_t exc_state_count = PPC_EXCEPTION_STATE64_COUNT;
         ppc_exception_state64_t exc_state;
 #     endif
+#   elif defined(I386)
+        thread_state_flavor_t flavor = i386_EXCEPTION_STATE;
+        mach_msg_type_number_t exc_state_count = i386_EXCEPTION_STATE_COUNT;
+        i386_exception_state_t exc_state;
 #   else
 #      error FIXME for non-ppc darwin
 #   endif
@@ -3833,7 +3837,13 @@ catch_exception_raise(
     }
     
     /* This is the address that caused the fault */
+#if defined(POWERPC)
     addr = (char*) exc_state.dar;
+#elif defined (I386)
+    addr = (char*) exc_state.faultvaddr;
+#else
+#   error FIXME for non POWERPC/I386
+#endif
         
     if((HDR(addr)) == 0) {
         /* Ugh... just like the SIGBUS problem above, it seems we get a bogus