diff options
author | Tom Tromey <tromey@redhat.com> | 2001-08-18 01:04:43 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2001-08-18 01:04:43 +0000 |
commit | 5a2586cf8fcf001cddb47d3f9bf6610975d1564d (patch) | |
tree | 0a038d94cc4acd44c0926f011247f6b7969fa84b /boehm-gc/mach_dep.c | |
parent | eed566698034311c58eea585da1ddb5a6e0807fb (diff) | |
download | gcc-5a2586cf8fcf001cddb47d3f9bf6610975d1564d.zip gcc-5a2586cf8fcf001cddb47d3f9bf6610975d1564d.tar.gz gcc-5a2586cf8fcf001cddb47d3f9bf6610975d1564d.tar.bz2 |
Makefile.am, [...]: Imported GC 6.0 and merged local changes.
* Makefile.am, acinclude.m4, configure.in: Imported GC 6.0 and
merged local changes.
From-SVN: r44994
Diffstat (limited to 'boehm-gc/mach_dep.c')
-rw-r--r-- | boehm-gc/mach_dep.c | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/boehm-gc/mach_dep.c b/boehm-gc/mach_dep.c index 45cae1f..776bf69 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 |