summaryrefslogtreecommitdiffstats
path: root/boehm-gc/mach_dep.c
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-18 01:04:43 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-18 01:04:43 +0000
commit8fee6c5ba203062646a84ef04770c79ba2be0a6a (patch)
tree0a038d94cc4acd44c0926f011247f6b7969fa84b /boehm-gc/mach_dep.c
parent75ae025532a15d2842c5401959ef6775e3ebe550 (diff)
downloadppe42-gcc-8fee6c5ba203062646a84ef04770c79ba2be0a6a.tar.gz
ppe42-gcc-8fee6c5ba203062646a84ef04770c79ba2be0a6a.zip
* Makefile.am, acinclude.m4, configure.in: Imported GC 6.0 and
merged local changes. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44994 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'boehm-gc/mach_dep.c')
-rw-r--r--boehm-gc/mach_dep.c57
1 files changed, 35 insertions, 22 deletions
diff --git a/boehm-gc/mach_dep.c b/boehm-gc/mach_dep.c
index 45cae1f8c39..776bf6909bc 100644
--- a/boehm-gc/mach_dep.c
+++ b/boehm-gc/mach_dep.c
@@ -228,7 +228,7 @@ void GC_push_regs()
&& !(defined(NETBSD) && defined(__ELF__)) \
&& !(defined(OPENBSD) && defined(__ELF__)) \
&& !(defined(BEOS) && defined(__ELF__)) \
- && !defined(DOS4GW)
+ && !defined(DOS4GW) && !defined(HURD)
/* I386 code, generic code does not appear to work */
/* It does appear to work under OS2, and asms dont */
/* This is used for some 38g UNIX variants and for CYGWIN32 */
@@ -244,7 +244,8 @@ void GC_push_regs()
# if ( defined(I386) && defined(LINUX) && defined(__ELF__) ) \
|| ( defined(I386) && defined(FREEBSD) && defined(__ELF__) ) \
|| ( defined(I386) && defined(NETBSD) && defined(__ELF__) ) \
- || ( defined(I386) && defined(OPENBSD) && defined(__ELF__) )
+ || ( defined(I386) && defined(OPENBSD) && defined(__ELF__) ) \
+ || ( defined(I386) && defined(HURD) && defined(__ELF__) )
/* This is modified for Linux with ELF (Note: _ELF_ only) */
/* This section handles FreeBSD with ELF. */
@@ -391,8 +392,8 @@ void GC_push_regs()
# endif
/* other machines... */
-# if !(defined M68K) && !(defined VAX) && !(defined RT)
-# if !(defined SPARC) && !(defined I386) && !(defined NS32K)
+# if !defined(M68K) && !defined(VAX) && !defined(RT)
+# if !defined(SPARC) && !defined(I386) && !defined(NS32K)
# if !defined(POWERPC) && !defined(UTS4)
# if !defined(PJ) && !(defined(MIPS) && defined(LINUX))
--> bad news <--
@@ -407,27 +408,35 @@ void GC_push_regs()
void GC_generic_push_regs(cold_gc_frame)
ptr_t cold_gc_frame;
{
- /* Generic code */
- /* The idea is due to Parag Patel at HP. */
- /* We're not sure whether he would like */
- /* to be he acknowledged for it or not. */
{
- static jmp_buf regs;
- register word * i = (word *) regs;
- register ptr_t lim = (ptr_t)(regs) + (sizeof regs);
-
- /* Setjmp on Sun 3s doesn't clear all of the buffer. */
- /* That tends to preserve garbage. Clear it. */
+# ifdef HAVE_BUILTIN_UNWIND_INIT
+ /* This was suggested by Richard Henderson as the way to */
+ /* force callee-save registers and register windows onto */
+ /* the stack. */
+ __builtin_unwind_init();
+# else /* !HAVE_BUILTIN_UNWIND_INIT */
+ /* Generic code */
+ /* The idea is due to Parag Patel at HP. */
+ /* We're not sure whether he would like */
+ /* to be he acknowledged for it or not. */
+ jmp_buf regs;
+ register word * i = (word *) regs;
+ register ptr_t lim = (ptr_t)(regs) + (sizeof regs);
+
+ /* Setjmp doesn't always clear all of the buffer. */
+ /* That tends to preserve garbage. Clear it. */
for (; (char *)i < lim; i++) {
*i = 0;
}
-# if defined(POWERPC) || defined(MSWIN32) || defined(MSWINCE) \
- || defined(UTS4) || defined(LINUX)
- (void) setjmp(regs);
-# else
- (void) _setjmp(regs);
-# endif
-# if defined(SPARC) || defined(IA64)
+# if defined(POWERPC) || defined(MSWIN32) || defined(MSWINCE) \
+ || defined(UTS4) || defined(LINUX)
+ (void) setjmp(regs);
+# else
+ (void) _setjmp(regs);
+# endif
+# endif /* !HAVE_BUILTIN_UNWIND_INIT */
+# if (defined(SPARC) && !defined(HAVE_BUILTIN_UNWIND_INIT)) \
+ || defined(IA64)
/* On a register window machine, we need to save register */
/* contents on the stack for this to work. The setjmp */
/* is probably not needed on SPARC, since pointers are */
@@ -438,6 +447,10 @@ ptr_t cold_gc_frame;
word GC_save_regs_in_stack();
GC_save_regs_ret_val = GC_save_regs_in_stack();
+ /* On IA64 gcc, could use __builtin_ia64_flushrs() and */
+ /* __builtin_ia64_flushrs(). The latter will be done */
+ /* implicitly by __builtin_unwind_init() for gcc3.0.1 */
+ /* and later. */
}
# endif
GC_push_current_stack(cold_gc_frame);
@@ -511,7 +524,7 @@ ptr_t cold_gc_frame;
/* returns arg. Stack clearing is crucial on SPARC, so we supply */
/* an assembly version that's more careful. Assumes limit is hotter */
/* than sp, and limit is 8 byte aligned. */
-#if defined(ASM_CLEAR_CODE) && !defined(THREADS)
+#if defined(ASM_CLEAR_CODE)
#ifndef SPARC
--> fix it
#endif
OpenPOWER on IntegriCloud