aboutsummaryrefslogtreecommitdiff
path: root/boehm-gc
diff options
context:
space:
mode:
authorAnthony Green <green@redhat.com>2002-02-09 00:50:05 +0000
committerAnthony Green <green@redhat.com>2002-02-09 00:50:05 +0000
commit1c46420fdb3c2ecdb59bd1560903330295a6858e (patch)
treec68d180cfc2d82b626c6a1cf2c655d6cf7a53e32 /boehm-gc
parent920034b23cc116902036dd20df9289b4cbc98202 (diff)
xscale-elf support
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@49626 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'boehm-gc')
-rw-r--r--boehm-gc/ChangeLog11
-rw-r--r--boehm-gc/include/private/gcconfig.h16
-rw-r--r--boehm-gc/misc.c15
-rw-r--r--boehm-gc/os_dep.c101
4 files changed, 89 insertions, 54 deletions
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index e167429a413..2e03111751e 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 1c92ee31f2f..647bd5af3f7 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 06d7085d06e..842d9a669bb 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 cc816dff07f..a84a80816f4 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 */