diff --git a/ports/ChangeLog.alpha b/ports/ChangeLog.alpha index 719fc6a9bf..45061b23d6 100644 --- a/ports/ChangeLog.alpha +++ b/ports/ChangeLog.alpha @@ -1,5 +1,10 @@ 2012-08-08 Richard Henderson + * sysdeps/unix/sysv/linux/alpha/kernel-features.h + (__ASSUME_IEEE_RAISE_EXCEPTION): Remove. + * sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S: New file. + * sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c: Remove. + * sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S: Use dwarf2 cfi markup for unwind. Adjust stack early so that the normal syscall error path can be used. diff --git a/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S b/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S new file mode 100644 index 0000000000..6e770ad66c --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S @@ -0,0 +1,56 @@ +/* Copyright (C) 2004-2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include "kernel_sysinfo.h" + + + .text + +ENTRY(__feraiseexcept) + cfi_startproc + PSEUDO_PROLOGUE + + lda sp, -16(sp) + cfi_adjust_cfa_offset(16) + + ldi v0, __NR_osf_setsysinfo + stq a0, 0(sp) + mov sp, a1 + ldi a0, SSI_IEEE_RAISE_EXCEPTION + call_pal PAL_callsys + + lda sp, 16(sp) + cfi_adjust_cfa_offset(-16) + + /* Here in libm we can't use SYSCALL_ERROR_LABEL. Nor is it clear + that we'd want to set errno anyway. All we're required to do is + return non-zero on error. Which is exactly A3. */ + mov a3, v0 + ret + +END(__feraiseexcept) + cfi_endproc + +#include +#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2) +strong_alias (__feraiseexcept, __old_feraiseexcept) +compat_symbol (libm, __old_feraiseexcept, feraiseexcept, GLIBC_2_1); +#endif + +libm_hidden_ver (__feraiseexcept, feraiseexcept) +versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2); diff --git a/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c b/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c deleted file mode 100644 index a01b2cf11a..0000000000 --- a/ports/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (C) 2004,2006 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include -#include -#include "kernel_sysinfo.h" - - -int -__feraiseexcept (int excepts) -{ - INTERNAL_SYSCALL_DECL (err); - unsigned long t = excepts; - long r; - - r = INTERNAL_SYSCALL (osf_setsysinfo, err, 2, SSI_IEEE_RAISE_EXCEPTION, &t); - -#ifndef __ASSUME_IEEE_RAISE_EXCEPTION - if (!INTERNAL_SYSCALL_ERROR_P (r, err)) - return 0; - - double d; - - /* If we got an error from SSI_IEEE_RAISE_EXCEPTION, assume it means that - the system call isn't actually implemented. Do the best we can. */ - - /* Invalid implemented with 0 / 0 -> NaN. */ - if (excepts & FE_INVALID) - __asm__ __volatile__ ("divs/su $f31,$f31,%0; trapb" : "=f"(d) : ); - - /* Division By Zero implemented with 1 / 0 -> NaN. */ - if (excepts & FE_DIVBYZERO) - __asm__ __volatile__ ("divs/su %1,$f31,%0; trapb" : "=&f"(d) : "f"(1.0f)); - - /* Overflow and underflow cannot be had all by themselves. We can - generate them with arithmetic, but we always get INEXACT raised - at the same time. Prepare to undo. */ - if ((excepts & (FE_OVERFLOW | FE_UNDERFLOW)) && !(excepts & FE_INEXACT)) - INTERNAL_SYSCALL (osf_getsysinfo, err, 2, GSI_IEEE_FP_CONTROL, &t); - - /* Overflow implemented with FLT_MAX + FLT_MAX -> Inf. */ - if (excepts & FE_OVERFLOW) - __asm__ __volatile__ ("adds/sui %1,%1,%0; trapb" - : "=&f"(d) : "f"(FLT_MAX)); - - /* Underflow implemented with FLT_MIN * FLT_MIN -> 0. */ - if (excepts & FE_UNDERFLOW) - __asm__ __volatile__ ("muls/sui %1,%1,%0; trapb" - : "=&f"(d) : "f"(FLT_MIN)); - - /* Inexact implemented with (long)0.5 -> 0. */ - if ((excepts & (FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)) == FE_INEXACT) - __asm__ __volatile__ ("cvttq/svi %1,%0; trapb" : "=&f"(d) : "f"(0.5f)); - - /* If we raised inexact when not asked, and inexact was not previously - raised, then clear that exception. */ - if ((excepts & (FE_OVERFLOW | FE_UNDERFLOW)) - && !((excepts | t) & FE_INEXACT)) - { - t |= excepts & SWCR_STATUS_MASK; - INTERNAL_SYSCALL (osf_setsysinfo, err, 2, SSI_IEEE_FP_CONTROL, &t); - } -#endif /* !__ASSUME_IEEE_RAISE_EXCEPTION */ - - return 0; -} - -#include -#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2) -strong_alias (__feraiseexcept, __old_feraiseexcept) -compat_symbol (libm, __old_feraiseexcept, feraiseexcept, GLIBC_2_1); -#endif - -libm_hidden_ver (__feraiseexcept, feraiseexcept) -versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2); diff --git a/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h index 53c282daf7..a4e8de9d9a 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h @@ -25,9 +25,6 @@ #define __ASSUME_UTIMES 1 -/* Starting with version 2.6.9, SSI_IEEE_RAISE_EXCEPTION exists. */ -#define __ASSUME_IEEE_RAISE_EXCEPTION 1 - /* Support for the O_CLOEXEC flag was added for alpha in 2.6.23. */ #if __LINUX_KERNEL_VERSION >= 0x020617 # define __ASSUME_O_CLOEXEC 1