From 97f6ae6dc70d325762bfb84c3a1770fe2ea74022 Mon Sep 17 00:00:00 2001 From: Stelios Koroneos Date: Mon, 12 Mar 2007 12:50:09 +0000 Subject: packages/glibc/glibc_2.5.bb: The following set of patches adds support for soft-float to powerpc targets without fpu for gcc 4.1.1/glibc 2.5 --- packages/glibc/files/ppc-ld-nofpu-20070104.patch | 190 +++++++++++++ .../glibc/files/ppc-ports-ld-nofpu-20070114.patch | 38 +++ packages/glibc/files/ppc-sfp-machine.patch | 297 +++++++++++++++++++++ packages/glibc/files/ppc-soft-fp-20070115.patch | 182 +++++++++++++ packages/glibc/glibc_2.5.bb | 9 +- 5 files changed, 714 insertions(+), 2 deletions(-) create mode 100644 packages/glibc/files/ppc-ld-nofpu-20070104.patch create mode 100644 packages/glibc/files/ppc-ports-ld-nofpu-20070114.patch create mode 100644 packages/glibc/files/ppc-sfp-machine.patch create mode 100644 packages/glibc/files/ppc-soft-fp-20070115.patch (limited to 'packages/glibc') diff --git a/packages/glibc/files/ppc-ld-nofpu-20070104.patch b/packages/glibc/files/ppc-ld-nofpu-20070104.patch new file mode 100644 index 0000000000..d5b1d31774 --- /dev/null +++ b/packages/glibc/files/ppc-ld-nofpu-20070104.patch @@ -0,0 +1,190 @@ +2007-01-12 Steven Munroe + Joe Kerian + + [BZ #2749] + * sysdeps/ieee754/ldbl-128ibm/s_copysignl.c: + Include . + Remove weak_alias. Use long_double_symbol macro. + (__copysignl): Use signbit() for comparison. + * sysdeps/ieee754/ldbl-128ibm/s_fabsl.c: Correct parms for + SET_LDOUBLE_WORDS64. + + [BZ #2423, #2749] + * sysdeps/ieee754/ldbl-128ibm/s_ceill.c: Don't include . + (__ceill): Remove calls to fegetround(), fesetround(). + * sysdeps/ieee754/ldbl-128ibm/s_floorl.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_roundl.c: Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_truncl.c: Likewise. + +diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_ceill.c libc24/sysdeps/ieee754/ldbl-128ibm/s_ceill.c +--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_ceill.c 2006-03-16 05:46:37.000000000 -0600 ++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_ceill.c 2007-01-11 10:30:12.856890432 -0600 +@@ -19,7 +19,6 @@ + 02111-1307 USA. */ + + #include +-#include + #include + #include + #include +@@ -44,11 +43,9 @@ + __builtin_inf ()), 1)) + { + double orig_xh; +- int save_round = fegetround (); + + /* Long double arithmetic, including the canonicalisation below, + only works in round-to-nearest mode. */ +- fesetround (FE_TONEAREST); + + /* Convert the high double to integer. */ + orig_xh = xh; +@@ -81,8 +78,6 @@ + /* Ensure we return -0 rather than +0 when appropriate. */ + if (orig_xh < 0.0) + xh = -__builtin_fabs (xh); +- +- fesetround (save_round); + } + + return ldbl_pack (xh, xl); +diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c +--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c 2006-01-27 18:07:25.000000000 -0600 ++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_copysignl.c 2007-01-11 10:30:12.857890280 -0600 +@@ -25,6 +25,7 @@ + + #include "math.h" + #include "math_private.h" ++#include + + #ifdef __STDC__ + long double __copysignl(long double x, long double y) +@@ -33,13 +34,13 @@ + long double x,y; + #endif + { +- if (y < 0.0) +- { +- if (x >= 0.0) +- x = -x; +- } +- else if (x < 0.0) ++ if( signbit(x) != signbit(y) ) + x = -x; + return x; + } +-weak_alias (__copysignl, copysignl) ++ ++#ifdef IS_IN_libm ++long_double_symbol (libm, __copysignl, copysignl); ++#else ++long_double_symbol (libc, __copysignl, copysignl); ++#endif +diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c +--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c 2006-01-27 18:07:25.000000000 -0600 ++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c 2007-01-11 10:30:12.857890280 -0600 +@@ -37,7 +37,7 @@ + GET_LDOUBLE_WORDS64(hx,lx,x); + lx = lx ^ ( hx & 0x8000000000000000LL ); + hx = hx & 0x7fffffffffffffffLL; +- SET_LDOUBLE_WORDS64(hx,lx,x); ++ SET_LDOUBLE_WORDS64(x,hx,lx); + return x; + } + long_double_symbol (libm, __fabsl, fabsl); +diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_floorl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_floorl.c +--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_floorl.c 2006-03-16 05:46:37.000000000 -0600 ++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_floorl.c 2007-01-11 10:30:12.858890128 -0600 +@@ -19,7 +19,6 @@ + 02111-1307 USA. */ + + #include +-#include + #include + #include + #include +@@ -43,11 +42,8 @@ + && __builtin_isless (__builtin_fabs (xh), + __builtin_inf ()), 1)) + { +- int save_round = fegetround (); +- + /* Long double arithmetic, including the canonicalisation below, + only works in round-to-nearest mode. */ +- fesetround (FE_TONEAREST); + + /* Convert the high double to integer. */ + hi = ldbl_nearbyint (xh); +@@ -75,8 +71,6 @@ + xh = hi; + xl = lo; + ldbl_canonicalize (&xh, &xl); +- +- fesetround (save_round); + } + + return ldbl_pack (xh, xl); +diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_roundl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_roundl.c +--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_roundl.c 2006-03-16 05:46:37.000000000 -0600 ++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_roundl.c 2007-01-11 10:30:12.859889976 -0600 +@@ -22,7 +22,6 @@ + when it's coded in C. */ + + #include +-#include + #include + #include + #include +@@ -47,11 +46,9 @@ + __builtin_inf ()), 1)) + { + double orig_xh; +- int save_round = fegetround (); + + /* Long double arithmetic, including the canonicalisation below, + only works in round-to-nearest mode. */ +- fesetround (FE_TONEAREST); + + /* Convert the high double to integer. */ + orig_xh = xh; +@@ -88,8 +85,6 @@ + xh = hi; + xl = lo; + ldbl_canonicalize (&xh, &xl); +- +- fesetround (save_round); + } + + return ldbl_pack (xh, xl); +diff -urN libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_truncl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_truncl.c +--- libc25-cvstip-20070104/sysdeps/ieee754/ldbl-128ibm/s_truncl.c 2006-03-16 05:46:37.000000000 -0600 ++++ libc24/sysdeps/ieee754/ldbl-128ibm/s_truncl.c 2007-01-11 10:30:12.860889824 -0600 +@@ -22,7 +22,6 @@ + when it's coded in C. */ + + #include +-#include + #include + #include + #include +@@ -47,11 +46,9 @@ + __builtin_inf ()), 1)) + { + double orig_xh; +- int save_round = fegetround (); + + /* Long double arithmetic, including the canonicalisation below, + only works in round-to-nearest mode. */ +- fesetround (FE_TONEAREST); + + /* Convert the high double to integer. */ + orig_xh = xh; +@@ -92,8 +89,6 @@ + /* Ensure we return -0 rather than +0 when appropriate. */ + if (orig_xh < 0.0) + xh = -__builtin_fabs (xh); +- +- fesetround (save_round); + } + + return ldbl_pack (xh, xl); diff --git a/packages/glibc/files/ppc-ports-ld-nofpu-20070114.patch b/packages/glibc/files/ppc-ports-ld-nofpu-20070114.patch new file mode 100644 index 0000000000..b4d99592f6 --- /dev/null +++ b/packages/glibc/files/ppc-ports-ld-nofpu-20070114.patch @@ -0,0 +1,38 @@ +2007-01-14 Steven Munroe + + [BZ #2749] + * sysdeps/powerpc/nofpu/fenv_libc.h: New file. + +diff -urN dummy-libc/ports-cvstip-20070104/sysdeps/powerpc/nofpu/fenv_libc.h libc25/ports/sysdeps/powerpc/nofpu/fenv_libc.h +--- dummy-libc/ports-cvstip-20070104/sysdeps/powerpc/nofpu/fenv_libc.h Wed Dec 31 18:00:00 1969 ++++ libc25/ports/sysdeps/powerpc/nofpu/fenv_libc.h Thu Jan 11 11:00:53 2007 +@@ -0,0 +1,29 @@ ++/* Internal libc stuff for floating point environment routines. ++ Copyright (C) 2007 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#ifndef _FENV_LIBC_H ++#define _FENV_LIBC_H 1 ++ ++/* fenv_libc.h is used in libm implementations of ldbl-128ibm. So we ++ need this version in the soft-fp to at minimum include fenv.h to ++ get the fegetround definition. */ ++ ++#include ++ ++#endif /* fenv_libc.h */ diff --git a/packages/glibc/files/ppc-sfp-machine.patch b/packages/glibc/files/ppc-sfp-machine.patch new file mode 100644 index 0000000000..6171a03411 --- /dev/null +++ b/packages/glibc/files/ppc-sfp-machine.patch @@ -0,0 +1,297 @@ +This patch combined with the other patches from Bugzilla #2749 allows +powerpc32 to build. The Subdirs pulls in the soft-fp directory from +libc, The Implies pulls in the ports powerpc/soft-fp directory which +includes sfp-machine.h + +The get/set/swapcontext changes overide the common implimentation in +libc to avoid using hardware FP instructions. + + + +2006-06-01 Steven Munroe + + [BZ #2749] + * sysdeps/powerpc/soft-fp/Subdirs: New file. + * sysdeps/powerpc/soft-fp/sfp-machine.h: New file. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies: New file. + + * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S: + New file. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S: + New file. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S: + New file. + +diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/powerpc/soft-fp/Subdirs +libc24/ports/sysdeps/powerpc/soft-fp/Subdirs +--- dummy-libc/ports-cvstip-20060512/sysdeps/powerpc/soft-fp/Subdirs Wed Dec 31 18:00:00 1969 ++++ libc24/ports/sysdeps/powerpc/soft-fp/Subdirs Wed May 31 16:58:44 2006 +@@ -0,0 +1,1 @@ ++soft-fp +diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/powerpc/soft-fp/sfp-machine.h +libc24/ports/sysdeps/powerpc/soft-fp/sfp-machine.h +--- dummy-libc/ports-cvstip-20060512/sysdeps/powerpc/soft-fp/sfp-machine.h Wed Dec 31 18:00:00 1969 ++++ libc24/ports/sysdeps/powerpc/soft-fp/sfp-machine.h Wed May 31 13:57:07 2006 +@@ -0,0 +1,63 @@ ++#define _FP_W_TYPE_SIZE 32 ++#define _FP_W_TYPE unsigned long ++#define _FP_WS_TYPE signed long ++#define _FP_I_TYPE long ++ ++#define _FP_MUL_MEAT_S(R,X,Y) \ ++ _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm) ++#define _FP_MUL_MEAT_D(R,X,Y) \ ++ _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) ++#define _FP_MUL_MEAT_Q(R,X,Y) \ ++ _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) ++ ++#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_loop(S,R,X,Y) ++#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y) ++#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y) ++ ++#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1) ++#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1 ++#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1 ++#define _FP_NANSIGN_S 0 ++#define _FP_NANSIGN_D 0 ++#define _FP_NANSIGN_Q 0 ++ ++#define _FP_KEEPNANFRACP 1 ++ ++/* Someone please check this. */ ++#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ ++ do { \ ++ if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \ ++ && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \ ++ { \ ++ R##_s = Y##_s; \ ++ _FP_FRAC_COPY_##wc(R,Y); \ ++ } \ ++ else \ ++ { \ ++ R##_s = X##_s; \ ++ _FP_FRAC_COPY_##wc(R,X); \ ++ } \ ++ R##_c = FP_CLS_NAN; \ ++ } while (0) ++ ++/* Exception flags. We use the bit positions of the appropriate bits ++ in the FPSCR, which also correspond to the FE_* bits. This makes ++ everything easier ;-). */ ++#define FP_EX_INVALID (1 << (31 - 2)) ++#define FP_EX_OVERFLOW (1 << (31 - 3)) ++#define FP_EX_UNDERFLOW (1 << (31 - 4)) ++#define FP_EX_DENORM FP_EX_UNDERFLOW ++#define FP_EX_DIVZERO (1 << (31 - 5)) ++#define FP_EX_INEXACT (1 << (31 - 6)) ++ ++#define FP_HANDLE_EXCEPTIONS __simulate_exceptions (_fex) ++#define FP_ROUNDMODE __sim_round_mode ++ ++extern int __sim_exceptions; ++libc_hidden_proto (__sim_exceptions); ++extern int __sim_disabled_exceptions; ++libc_hidden_proto (__sim_disabled_exceptions); ++extern int __sim_round_mode; ++libc_hidden_proto (__sim_round_mode); ++ ++extern void __simulate_exceptions (int x) attribute_hidden; +diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies +libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies +--- dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies Wed Dec 31 18:00:00 1969 ++++ libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/Implies Wed May 31 15:46:44 2006 +@@ -0,0 +1,1 @@ ++powerpc/soft-fp +diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S +libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S +--- dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S Wed Dec 31 18:00:00 1969 ++++ libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S Thu Jun 01 15:31:03 2006 +@@ -0,0 +1,59 @@ ++/* Save current context. ++ Copyright (C) 2002, 2004, 2005 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++ ++#define __ASSEMBLY__ ++#include ++#include "ucontext_i.h" ++ ++#define __CONTEXT_FUNC_NAME __getcontext ++#undef __CONTEXT_ENABLE_FPRS ++#undef __CONTEXT_ENABLE_VRS ++ ++#include "getcontext-common.S" ++ ++versioned_symbol (libc, __getcontext, getcontext, GLIBC_2_3_4) ++ ++#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4) ++ ++/* For the nofpu case the old/new versions are the same function. */ ++strong_alias (__getcontext, __novec_getcontext) ++ ++compat_symbol (libc, __novec_getcontext, getcontext, GLIBC_2_3_3) ++ ++#endif ++ ++#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_3_3) ++ ++#define _ERRNO_H 1 ++#include ++ ++ compat_text_section ++ENTRY (__getcontext_stub) ++ li r3,ENOSYS ++ b __syscall_error@local ++END (__getcontext_stub) ++ .previous ++ ++compat_symbol (libc, __getcontext_stub, getcontext, GLIBC_2_1) ++ ++#endif +diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S +libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S +--- dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S Wed Dec 31 18:00:00 1969 ++++ libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S Thu Jun 01 15:31:03 2006 +@@ -0,0 +1,59 @@ ++/* Jump to a new context. ++ Copyright (C) 2002, 2004, 2005 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++ ++#define __ASSEMBLY__ ++#include ++#include "ucontext_i.h" ++ ++#define __CONTEXT_FUNC_NAME __setcontext ++#undef __CONTEXT_ENABLE_FPRS ++#undef __CONTEXT_ENABLE_VRS ++ ++#include "setcontext-common.S" ++ ++versioned_symbol (libc, __setcontext, setcontext, GLIBC_2_3_4) ++ ++#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4) ++ ++/* For the nofpu case the old/new versions are the same function. */ ++strong_alias (__setcontext, __novec_setcontext) ++ ++compat_symbol (libc, __novec_setcontext, setcontext, GLIBC_2_3_3) ++ ++#endif ++ ++#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_3) ++ ++#define _ERRNO_H 1 ++#include ++ ++ compat_text_section ++ENTRY (__setcontext_stub) ++ li r3,ENOSYS ++ b __syscall_error@local ++END (__setcontext_stub) ++ .previous ++ ++compat_symbol (libc, __setcontext_stub, setcontext, GLIBC_2_0) ++ ++#endif +diff -urN dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S +libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S +--- dummy-libc/ports-cvstip-20060512/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S Wed Dec 31 18:00:00 1969 ++++ libc24/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S Thu Jun 01 15:31:03 2006 +@@ -0,0 +1,59 @@ ++/* Save current context and jump to a new context. ++ Copyright (C) 2002, 2004, 2005 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++ ++#define __ASSEMBLY__ ++#include ++#include "ucontext_i.h" ++ ++#define __CONTEXT_FUNC_NAME __swapcontext ++#undef __CONTEXT_ENABLE_FPRS ++#undef __CONTEXT_ENABLE_VRS ++ ++# include "swapcontext-common.S" ++ ++versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_3_4) ++ ++#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4) ++ ++/* For the nofpu case the old/new versions are the same function. */ ++strong_alias (__swapcontext, __novec_swapcontext) ++ ++compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3_3) ++ ++#endif ++ ++#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_3_3) ++ ++#define _ERRNO_H 1 ++#include ++ ++ compat_text_section ++ENTRY (__swapcontext_stub) ++ li r3,ENOSYS ++ b __syscall_error@local ++END (__swapcontext_stub) ++ .previous ++ ++compat_symbol (libc, __swapcontext_stub, swapcontext, GLIBC_2_1) ++ ++#endif + diff --git a/packages/glibc/files/ppc-soft-fp-20070115.patch b/packages/glibc/files/ppc-soft-fp-20070115.patch new file mode 100644 index 0000000000..a84bc2f7cb --- /dev/null +++ b/packages/glibc/files/ppc-soft-fp-20070115.patch @@ -0,0 +1,182 @@ +2007-01-14 Steven Munroe + Joe Kerian + + [BZ #2749] + * soft-fp/op-4.h (__FP_FRAC_SUB_3, __FP_FRAC_SUB_4): Correct borrow + handling for high words. + * soft-fp/op-common.h (_FP_OVERFLOW_SEMIRAW): Always set inexact + and overflow for infinity. + (_FP_PACK_SEMIRAW): Update comment. Do not round if NaN or Inf. + + * math/basic-test.c (truncdfsf_test): New function. + [!NO_LONG_DOUBLE] (trunctfsf_test): New function. + [!NO_LONG_DOUBLE] (trunctfdf_test): New function. + Change main() to do_test. Define TEST_FUNCTION. Include test-skeleton.c. + (do_test): Run new tests. + +2007-01-15 Jakub Jelinek + + * soft-fp/op-common.h (FP_TRUNC): When truncating a NaN, clear + workbits in semi-raw fraction. + + +diff -urN libc25-cvstip-20070104/math/basic-test.c libc24/math/basic-test.c +--- libc25-cvstip-20070104/math/basic-test.c 2001-07-05 23:55:35.000000000 -0500 ++++ libc24/math/basic-test.c 2007-01-15 11:41:17.260963824 -0600 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1999, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 1999. + +@@ -107,17 +107,90 @@ + TEST_FUNC (double_test, double, nan, DBL_EPSILON, HUGE_VAL) + #ifndef NO_LONG_DOUBLE + TEST_FUNC (ldouble_test, long double, nanl, LDBL_EPSILON, HUGE_VALL) ++ ++void ++trunctfsf_test(void) ++{ ++ volatile long double Inf_var, NaN_var, zero_var, one_var; ++ float x1, x2; ++ ++ zero_var = 0.0; ++ one_var = 1.0; ++ NaN_var = zero_var/zero_var; ++ Inf_var = one_var / zero_var; ++ ++ (void) &zero_var; ++ (void) &one_var; ++ (void) &NaN_var; ++ (void) &Inf_var; ++ ++ x1 = (float)NaN_var; ++ check (" float x = (float)((long double)NaN))", isnan (x1) != 0); ++ x2 = (float)Inf_var; ++ check (" float x = (float)((long double)Inf))", isinf (x2) != 0); ++} ++ ++void ++trunctfdf_test(void) ++{ ++ volatile long double Inf_var, NaN_var, zero_var, one_var; ++ double x1, x2; ++ ++ zero_var = 0.0; ++ one_var = 1.0; ++ NaN_var = zero_var/zero_var; ++ Inf_var = one_var / zero_var; ++ ++ (void) &zero_var; ++ (void) &one_var; ++ (void) &NaN_var; ++ (void) &Inf_var; ++ ++ x1 = (double)NaN_var; ++ check (" double x = (double)((long double)NaN))", isnan (x1) != 0); ++ x2 = (double)Inf_var; ++ check (" double x = (double)((long double)Inf))", isinf (x2) != 0); ++} ++ + #endif + ++void ++truncdfsf_test(void) ++{ ++ volatile double Inf_var, NaN_var, zero_var, one_var; ++ float x1, x2; ++ ++ zero_var = 0.0; ++ one_var = 1.0; ++ NaN_var = zero_var/zero_var; ++ Inf_var = one_var / zero_var; ++ ++ (void) &zero_var; ++ (void) &one_var; ++ (void) &NaN_var; ++ (void) &Inf_var; ++ ++ x1 = (float)NaN_var; ++ check (" float x = (float)((double)NaN))", isnan (x1) != 0); ++ x2 = (float)Inf_var; ++ check (" float x = (float)((double)Inf))", isinf (x2) != 0); ++} ++ + int +-main (void) ++do_test (void) + { + float_test (); + double_test (); ++ truncdfsf_test(); + + #ifndef NO_LONG_DOUBLE + ldouble_test (); ++ trunctfsf_test(); ++ trunctfdf_test(); + #endif + + return errors != 0; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff -urN libc25-cvstip-20070104/soft-fp/op-4.h libc24/soft-fp/op-4.h +--- libc25-cvstip-20070104/soft-fp/op-4.h 2006-04-04 03:24:47.000000000 -0500 ++++ libc24/soft-fp/op-4.h 2007-01-11 11:00:53.000000000 -0600 +@@ -564,7 +564,7 @@ + r1 = x1 - y1; \ + _c2 = r1 > x1; \ + r1 -= _c1; \ +- _c2 |= r1 > _c1; \ ++ _c2 |= _c1 && (y1 == x1); \ + r2 = x2 - y2 - _c2; \ + } while (0) + #endif +@@ -578,11 +578,11 @@ + r1 = x1 - y1; \ + _c2 = r1 > x1; \ + r1 -= _c1; \ +- _c2 |= r1 > _c1; \ ++ _c2 |= _c1 && (y1 == x1); \ + r2 = x2 - y2; \ + _c3 = r2 > x2; \ + r2 -= _c2; \ +- _c3 |= r2 > _c2; \ ++ _c3 |= _c2 && (y2 == x2); \ + r3 = x3 - y3 - _c3; \ + } while (0) + #endif +diff -urN libc25-cvstip-20070104/soft-fp/op-common.h libc24/soft-fp/op-common.h +--- libc25-cvstip-20070104/soft-fp/op-common.h 2006-04-04 03:24:47.000000000 -0500 ++++ libc24/soft-fp/op-common.h 2007-01-15 11:46:17.290882288 -0600 +@@ -1,5 +1,5 @@ + /* Software floating-point emulation. Common operations. +- Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc. ++ Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com), + Jakub Jelinek (jj@ultra.linux.cz), +@@ -99,10 +99,10 @@ + else \ + { \ + X##_e = _FP_EXPMAX_##fs - 1; \ +- FP_SET_EXCEPTION(FP_EX_OVERFLOW); \ +- FP_SET_EXCEPTION(FP_EX_INEXACT); \ + _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc); \ + } \ ++ FP_SET_EXCEPTION(FP_EX_INEXACT); \ ++ FP_SET_EXCEPTION(FP_EX_OVERFLOW); \ + } while (0) + + /* Check for a semi-raw value being a signaling NaN and raise the +@@ -1252,6 +1252,9 @@ + _FP_FRAC_SRL_##swc(S, (_FP_WFRACBITS_##sfs \ + - _FP_WFRACBITS_##dfs)); \ + _FP_FRAC_COPY_##dwc##_##swc(D, S); \ ++ /* Semi-raw NaN must have all workbits cleared. */ \ ++ _FP_FRAC_LOW_##dwc(D) \ ++ &= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1); \ + _FP_FRAC_HIGH_##dfs(D) |= _FP_QNANBIT_SH_##dfs; \ + } \ + } \ diff --git a/packages/glibc/glibc_2.5.bb b/packages/glibc/glibc_2.5.bb index f9f24bbe7f..e34bf99a59 100644 --- a/packages/glibc/glibc_2.5.bb +++ b/packages/glibc/glibc_2.5.bb @@ -5,7 +5,7 @@ ARM_INSTRUCTION_SET = "arm" PACKAGES_DYNAMIC = "libc6*" RPROVIDES_${PN}-dev = "libc6-dev" -PR = "r4" +PR = "r5" # the -isystem in bitbake.conf screws up glibc do_stage BUILD_CPPFLAGS = "-I${STAGING_DIR}/${BUILD_SYS}/include" @@ -74,7 +74,12 @@ SRC_URI = "ftp://ftp.gnu.org/pub/gnu/glibc/glibc-${PV}.tar.bz2 \ SRC_URI_append_sh3 = " file://no-z-defs.patch;patch=1" SRC_URI_append_sh4 = " file://no-z-defs.patch;patch=1" -SRC_URI_append_powerpc = " file://powerpc-sqrt-hack.diff;patch=1" +#powerpc patches to add support for soft-float +SRC_URI_append_powerpc= " file://ppc-sfp-machine.patch;patch=1 \ + file://ppc-soft-fp-20070115.patch;patch=1 \ + file://ppc-ld-nofpu-20070104.patch;patch=1 \ + file://ppc-ports-ld-nofpu-20070114.patch;patch=1 \ + file://powerpc-sqrt-hack.diff;patch=1"" S = "${WORKDIR}/glibc-${PV}" B = "${WORKDIR}/build-${TARGET_SYS}" -- cgit v1.2.3