From 56aa72e88f9f9e598f8557dcecacbba800bf6ccb Mon Sep 17 00:00:00 2001
From: green <green@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sat, 9 Feb 2002 00:50:05 +0000
Subject: [PATCH] xscale-elf support

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49626 138bc75d-0d04-0410-961f-82ee72b054a4
---
 boehm-gc/ChangeLog                  |  11 +++
 boehm-gc/include/private/gcconfig.h |  16 +++++
 boehm-gc/misc.c                     |  15 ++++-
 boehm-gc/os_dep.c                   | 101 ++++++++++++++--------------
 4 files changed, 89 insertions(+), 54 deletions(-)

diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index e167429a4135..2e03111751ea 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -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
diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h
index 1c92ee31f2fd..647bd5af3f7c 100644
--- a/boehm-gc/include/private/gcconfig.h
+++ b/boehm-gc/include/private/gcconfig.h
@@ -39,6 +39,13 @@
 # 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
@@ -1495,6 +1502,15 @@
 #     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
diff --git a/boehm-gc/misc.c b/boehm-gc/misc.c
index 06d7085d06ef..842d9a669bbc 100644
--- a/boehm-gc/misc.c
+++ b/boehm-gc/misc.c
@@ -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)
diff --git a/boehm-gc/os_dep.c b/boehm-gc/os_dep.c
index cc816dff07f8..a84a80816f4d 100644
--- a/boehm-gc/os_dep.c
+++ b/boehm-gc/os_dep.c
@@ -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 */
 
-- 
GitLab