xscale-elf support
authorAnthony Green <green@redhat.com>
Sat, 9 Feb 2002 00:50:05 +0000 (00:50 +0000)
committerAnthony Green <green@gcc.gnu.org>
Sat, 9 Feb 2002 00:50:05 +0000 (00:50 +0000)
From-SVN: r49626

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

index e167429a413506db68f5430ef20a521ede11d038..2e03111751ea0368bce1395756ca8773b3f4fc7d 100644 (file)
@@ -1,3 +1,14 @@
+2001-02-08  Anthony Green  <green@redhat.com>
+
+       * include/private/gcconfig.h: Add XSCALE NOSYS support for bare
+         board embedded targets.
+       * os_dep.c: Avoid signal handling code for NOSYS/ECOS targets.
+         Use GC_get_stack_base for NOSYS/ECOS targets.  Clean up some
+         redundant uses of ECOS.
+       * misc.c: Use NOSYS where ECOS is being used.
+         Don't define GC_write twice for ECOS systems.
+         (GC_write): New function for NOSYS targets.
+
 2002-02-06  Adam Megacz <adam@xwt.org>
 
         * boehm-gc/include/gc.h: (GC_CreateThread) This function is
index 1c92ee31f2fdfb276aa6c5b7100a10ca26beeb7d..647bd5af3f7c60386e343db722868229fb74e4be 100644 (file)
 # endif
 
 /* Determine the machine type: */
+# if defined(__XSCALE__)
+#    define ARM32
+#    if !defined(LINUX)
+#      define NOSYS
+#      define mach_type_known
+#    endif
+# endif
 # if defined(sun) && defined(mc68000)
 #    define M68K
 #    define SUNOS4
 #     define OS_TYPE "MSWINCE"
 #     define DATAEND /* not needed */
 #   endif
+#   ifdef NOSYS
+      /* __data_start is usually defined in the target linker script.  */
+      extern int __data_start;
+#     define DATASTART (ptr_t)(&__data_start)
+#     define USE_GENERIC_PUSH_REGS
+      /* __stack_base__ is set in newlib/libc/sys/arm/crt0.S  */
+      extern void *__stack_base__;
+#     define STACKBOTTOM ((ptr_t) (__stack_base__))
+#   endif
 #endif
 
 # ifdef SH
index 06d7085d06eff37536bf431371714021425fc986..842d9a669bbceadb4bb15e572d2f92b9e4aaa58a 100644 (file)
@@ -69,7 +69,7 @@
 #   endif
 # endif
 
-#ifdef ECOS
+#if defined(NOSYS) || defined(ECOS)
 #undef STACKBASE
 #endif
 
@@ -744,7 +744,8 @@ int GC_tmp;  /* Should really be local ... */
 # endif
 #endif
 
-#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(OS2) && !defined(MACOS)
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(OS2) \
+    && !defined(MACOS)  && !defined(ECOS) && !defined(NOSYS)
 int GC_write(fd, buf, len)
 int fd;
 GC_CONST char *buf;
@@ -767,7 +768,7 @@ size_t len;
 }
 #endif /* UN*X */
 
-#if defined(ECOS)
+#ifdef ECOS
 int GC_write(fd, buf, len)
 {
   _Jv_diag_write (buf, len);
@@ -775,6 +776,14 @@ int GC_write(fd, buf, len)
 }
 #endif
 
+#ifdef NOSYS
+int GC_write(fd, buf, len)
+{
+  /* No writing.  */
+  return len;
+}
+#endif
+
 
 #if defined(MSWIN32) || defined(MSWINCE)
 #   define WRITE(f, buf, len) GC_write(buf, len)
index cc816dff07f84287b218c27faf31e763754af5c8..a84a80816f4d2d735f24723e43e1ec2759ee14ec 100644 (file)
@@ -333,7 +333,8 @@ void GC_enable_signals(void)
 
 #  if !defined(PCR) && !defined(AMIGA) && !defined(MSWIN32) \
       && !defined(MSWINCE) \
-      && !defined(MACOS) && !defined(DJGPP) && !defined(DOS4GW)
+      && !defined(MACOS) && !defined(DJGPP) && !defined(DOS4GW) \
+      && !defined(NOSYS) && !defined(ECOS)
 
 #   if defined(sigmask) && !defined(UTS4) && !defined(HURD)
        /* Use the traditional BSD interface */
@@ -516,7 +517,7 @@ ptr_t GC_get_stack_base()
 #   undef GC_AMIGA_SB
 # endif /* AMIGA */
 
-# if defined(NEED_FIND_LIMIT) || (defined(UNIX_LIKE) && !defined(ECOS))
+# if defined(NEED_FIND_LIMIT) || defined(UNIX_LIKE)
 
 #   ifdef __STDC__
        typedef void (*handler)(int);
@@ -540,8 +541,7 @@ ptr_t GC_get_stack_base()
       handler h;
 #   endif
     {
-# ifndef ECOS
-#      if defined(SUNOS5SIGS) || defined(IRIX5)  \
+#     if defined(SUNOS5SIGS) || defined(IRIX5)  \
         || defined(OSF1) || defined(HURD)
          struct sigaction      act;
 
@@ -579,7 +579,6 @@ ptr_t GC_get_stack_base()
            old_bus_handler = signal(SIGBUS, h);
 #        endif
 #      endif
-# endif /* ECOS */
     }
 # endif /* NEED_FIND_LIMIT || UNIX_LIKE */
 
@@ -602,21 +601,19 @@ ptr_t GC_get_stack_base()
     
     void GC_reset_fault_handler()
     {
-# ifndef ECOS
-#       if defined(SUNOS5SIGS) || defined(IRIX5) \
-          || defined(OSF1) || defined(HURD)
-         (void) sigaction(SIGSEGV, &old_segv_act, 0);
-#        if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \
-            || defined(HPUX) || defined(HURD)
-             (void) sigaction(SIGBUS, &old_bus_act, 0);
-#        endif
-#       else
-         (void) signal(SIGSEGV, old_segv_handler);
-#        ifdef SIGBUS
-           (void) signal(SIGBUS, old_bus_handler);
-#        endif
-#       endif
-# endif /* ECOS */
+#     if defined(SUNOS5SIGS) || defined(IRIX5) \
+        || defined(OSF1) || defined(HURD)
+       (void) sigaction(SIGSEGV, &old_segv_act, 0);
+#      if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \
+          || defined(HPUX) || defined(HURD)
+           (void) sigaction(SIGBUS, &old_bus_act, 0);
+#      endif
+#      else
+       (void) signal(SIGSEGV, old_segv_handler);
+#      ifdef SIGBUS
+         (void) signal(SIGBUS, old_bus_handler);
+#      endif
+#     endif
     }
 
     /* Return the first nonaddressible location > p (up) or    */
@@ -625,39 +622,41 @@ ptr_t GC_get_stack_base()
     ptr_t p;
     GC_bool up;
     {
-# ifndef ECOS
-        static VOLATILE ptr_t result;
-               /* Needs to be static, since otherwise it may not be    */
-               /* preserved across the longjmp.  Can safely be         */
-               /* static since it's only called once, with the         */
-               /* allocation lock held.                                */
-
-
-       GC_setup_temporary_fault_handler();
-       if (setjmp(GC_jmp_buf) == 0) {
-           result = (ptr_t)(((word)(p))
-                             & ~(MIN_PAGE_SIZE-1));
-           for (;;) {
-               if (up) {
-                   result += MIN_PAGE_SIZE;
-               } else {
-                   result -= MIN_PAGE_SIZE;
-               }
-               GC_noop1((word)(*result));
-           }
-       }
-       GC_reset_fault_handler();
-       if (!up) {
+      static VOLATILE ptr_t result;
+               /* Needs to be static, since otherwise it may not be    */
+               /* preserved across the longjmp.  Can safely be         */
+               /* static since it's only called once, with the         */
+               /* allocation lock held.                                */
+
+
+      GC_setup_temporary_fault_handler();
+      if (setjmp(GC_jmp_buf) == 0) {
+       result = (ptr_t)(((word)(p))
+                        & ~(MIN_PAGE_SIZE-1));
+       for (;;) {
+         if (up) {
            result += MIN_PAGE_SIZE;
-       }
-       return(result);
-# else /* ECOS */
-       abort();
-# endif /* ECOS */
+         } else {
+           result -= MIN_PAGE_SIZE;
+         }
+         GC_noop1((word)(*result));
+       }
+      }
+      GC_reset_fault_handler();
+      if (!up) {
+       result += MIN_PAGE_SIZE;
+      }
+      return(result);
     }
 # endif
 
-# ifndef ECOS
+# if defined(ECOS) || defined(NOSYS)
+ptr_t GC_get_stack_base()
+{
+  return STACKBOTTOM;
+}
+
+#else
 
 #ifdef LINUX_STACKBOTTOM
 
@@ -761,7 +760,7 @@ ptr_t GC_get_stack_base()
 #endif /* FREEBSD_STACKBOTTOM */
 
 #if !defined(BEOS) && !defined(AMIGA) && !defined(MSWIN32) \
-    && !defined(MSWINCE) && !defined(OS2) && !defined(ECOS)
+    && !defined(MSWINCE) && !defined(OS2)
 
 ptr_t GC_get_stack_base()
 {
@@ -815,7 +814,7 @@ ptr_t GC_get_stack_base()
        return(result);
 #   endif /* STACKBOTTOM */
 }
-# endif /* ECOS */
+# endif /* NOSYS ECOS */
 
 # endif /* ! AMIGA, !OS 2, ! MS Windows, !BEOS */