1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-12-24 04:26:28 +02:00

add support for uClibc version 0.9.32 based on git rev a7642511b08b0b8a4012bab67cb8aa554992df6b,

this includes support for nptl which got merged into the uClibc master branch recently

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21856 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
mirko 2010-06-20 22:18:43 +00:00
parent 0345992639
commit b211f2f9da
33 changed files with 4630 additions and 94 deletions

View File

@ -19,9 +19,8 @@ choice
config UCLIBC_VERSION_0_9_31
bool "uClibc 0.9.31"
config UCLIBC_VERSION_NPTL
bool "uClibc NPTL branch"
depends BROKEN
config UCLIBC_VERSION_0_9_32
bool "uClibc 0.9.32 (with nptl support)"
endchoice

View File

@ -5,5 +5,5 @@ config UCLIBC_VERSION
default "0.9.30.2" if UCLIBC_VERSION_0_9_30_2
default "0.9.30.3" if UCLIBC_VERSION_0_9_30_3
default "0.9.31" if UCLIBC_VERSION_0_9_31
default "0.9.30+nptl" if UCLIBC_VERSION_NPTL
default "0.9.32" if UCLIBC_VERSION_0_9_32
default "0.9.30.1"

View File

@ -9,13 +9,13 @@ include $(INCLUDE_DIR)/target.mk
PKG_NAME:=uClibc
PKG_VERSION:=$(call qstrip,$(CONFIG_UCLIBC_VERSION))
ifeq ($(CONFIG_UCLIBC_VERSION_NPTL),y)
ifeq ($(CONFIG_UCLIBC_VERSION_0_9_32),y)
PKG_SOURCE_URL:=git://git.busybox.net/uClibc
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=ef18cfe8ebab25f5ef92e81956f50e2dc57df602
PKG_SOURCE_VERSION:=a7642511b08b0b8a4012bab67cb8aa554992df6b
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
LIBC_SO_VERSION:=0.9.30-git
LIBC_SO_VERSION:=$(PKG_VERSION)-git
else
PKG_SOURCE_URL:=http://www.uclibc.org/downloads
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2

View File

@ -21,7 +21,7 @@ DO_C99_MATH=y
# EXTRA_WARNINGS is not set
FORCE_OPTIONS_FOR_ARCH=y
# FORCE_SHAREABLE_TEXT_SEGMENTS is not set
HARDWIRED_ABSPATH=y
# HARDWIRED_ABSPATH is not set
# HAS_NO_THREADS is not set
HAVE_DOT_CONFIG=y
# HAVE_NO_PIC is not set
@ -33,17 +33,19 @@ LDSO_CACHE_SUPPORT=y
# LDSO_GNU_HASH_SUPPORT is not set
LDSO_LDD_SUPPORT=y
# LDSO_PRELOAD_FILE_SUPPORT is not set
# LDSO_PRELOAD_ENV_SUPPORT is not set
LDSO_RUNPATH=y
LDSO_SEARCH_INTERP_PATH=y
# LDSO_SEARCH_INTERP_PATH is not set
# LINUXTHREADS_NEW is not set
# LINUXTHREADS_OLD is not set
UCLIBC_HAS_THREADS_NATIVE=y
# MALLOC is not set
MALLOC_GLIBC_COMPAT=y
# MALLOC_SIMPLE is not set
MALLOC_STANDARD=y
MULTILIB_DIR="lib"
# PTHREADS_DEBUG_SUPPORT is not set
RUNTIME_PREFIX="/"
SHARED_LIB_LOADER_PREFIX="/lib"
# SUPPORT_LD_DEBUG is not set
# SUPPORT_LD_DEBUG_EARLY is not set
TARGET_SUBARCH=""
@ -68,6 +70,7 @@ TARGET_SUBARCH=""
# TARGET_sh is not set
# TARGET_sh64 is not set
# TARGET_sparc is not set
# TARGET_ubicom32 is not set
# TARGET_v850 is not set
# TARGET_vax is not set
# TARGET_x86_64 is not set
@ -85,7 +88,7 @@ UCLIBC_HAS_ADVANCED_REALTIME=y
# UCLIBC_HAS_ARC4RANDOM is not set
UCLIBC_HAS_BSD_ERR=y
UCLIBC_HAS_BSD_RES_CLOSE=y
UCLIBC_HAS_COMPAT_RES_STATE=y
# UCLIBC_HAS_COMPAT_RES_STATE is not set
UCLIBC_HAS_CRYPT=y
UCLIBC_HAS_CRYPT_IMPL=y
UCLIBC_HAS_CTYPE_CHECKED=y
@ -122,7 +125,7 @@ UCLIBC_HAS_LIBRESOLV_STUB=y
UCLIBC_HAS_LIBUTIL=y
# UCLIBC_HAS_LOCALE is not set
UCLIBC_HAS_NETWORK_SUPPORT=y
# UCLIBC_HAS_NFTW is not set
UCLIBC_HAS_NFTW=y
# UCLIBC_HAS_OBSOLETE_BSD_SIGNAL is not set
# UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL is not set
UCLIBC_HAS_PRINTF_M_SPEC=y
@ -151,7 +154,6 @@ UCLIBC_HAS_STDIO_BUFSIZ_4096=y
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y
UCLIBC_HAS_STDIO_FUTEXES=y
UCLIBC_HAS_STDIO_GETC_MACRO=y
UCLIBC_HAS_STDIO_PUTC_MACRO=y
# UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT is not set
@ -162,8 +164,6 @@ UCLIBC_HAS_SYSLOG=y
# UCLIBC_HAS_SYS_ERRLIST is not set
# UCLIBC_HAS_SYS_SIGLIST is not set
UCLIBC_HAS_THREADS=y
UCLIBC_HAS_THREADS_NATIVE=y
UCLIBC_HAS_TLS=y
UCLIBC_HAS_TM_EXTENSIONS=y
UCLIBC_HAS_TZ_CACHING=y
UCLIBC_HAS_TZ_FILE=y
@ -180,12 +180,13 @@ UCLIBC_LINUX_SPECIFIC=y
UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
UCLIBC_PWD_BUFFER_SIZE=256
# UCLIBC_STATIC_LDCONFIG is not set
# UCLIBC_SUPPORT_AI_ADDRCONFIG is not set
UCLIBC_SUPPORT_AI_ADDRCONFIG=y
UCLIBC_SUSV3_LEGACY=y
UCLIBC_SUSV3_LEGACY_MACROS=y
UCLIBC_SUSV4_LEGACY=y
# UCLIBC_SV4_DEPRECATED is not set
UCLIBC_TZ_FILE_PATH="/etc/TZ"
# UCLIBC_FALLBACK_TO_ETC_LOCALTIME is not set
UCLIBC_USE_NETLINK=y
# UNIX98PTY_ONLY is not set
USE_BX=y

View File

@ -16,8 +16,6 @@ CONFIG_486=y
# CONFIG_PENTIUMIII is not set
# CONFIG_WINCHIP2 is not set
# CONFIG_WINCHIPC6 is not set
LINUXTHREADS_NEW=y
# LINUXTHREADS_OLD is not set
TARGET_ARCH="i386"
TARGET_i386=y
UCLIBC_HAS_FPU=y

View File

@ -16,8 +16,6 @@ CONFIG_686=y
# CONFIG_PENTIUMIII is not set
# CONFIG_WINCHIP2 is not set
# CONFIG_WINCHIPC6 is not set
LINUXTHREADS_NEW=y
# LINUXTHREADS_OLD is not set
TARGET_ARCH="i386"
TARGET_i386=y
UCLIBC_HAS_FPU=y

View File

@ -0,0 +1,17 @@
ARCH_ANY_ENDIAN=y
ARCH_CFLAGS="-mno-split-addresses"
ARCH_LITTLE_ENDIAN=y
ARCH_WANTS_LITTLE_ENDIAN=y
# CONFIG_MIPS_ISA_1 is not set
# CONFIG_MIPS_ISA_2 is not set
CONFIG_MIPS_ISA_3=y
# CONFIG_MIPS_ISA_4 is not set
# CONFIG_MIPS_ISA_MIPS32 is not set
# CONFIG_MIPS_ISA_MIPS32R2 is not set
# CONFIG_MIPS_ISA_MIPS64 is not set
# CONFIG_MIPS_N32_ABI is not set
# CONFIG_MIPS_N64_ABI is not set
CONFIG_MIPS_O32_ABI=y
TARGET_ARCH="mips"
TARGET_mips=y
UCLIBC_HAS_FPU=y

View File

@ -0,0 +1,34 @@
ARCH_BIG_ENDIAN=y
ARCH_HAS_NO_MMU=y
COMPAT_ATEXIT=y
# CONFIG_UC_UBICOM32_V3 is not set
CONFIG_UC_UBICOM32_V4=y
# DOSTRIP is not set
EXCLUDE_BRK=y
FORCE_SHAREABLE_TEXT_SEGMENTS=y
LDSO_PRELOAD_FILE_SUPPORT=y
MALLOC=y
# MALLOC_STANDARD is not set
PTHREADS_DEBUG_SUPPORT=y
SUPPORT_LD_DEBUG=y
TARGET_ARCH="ubicom32"
TARGET_ubicom32=y
# UCLIBC_FORMAT_ELF is not set
UCLIBC_FORMAT_FDPIC_ELF=y
# UCLIBC_FORMAT_FLAT is not set
# UCLIBC_FORMAT_FLAT_SEP_DATA is not set
# UCLIBC_FORMAT_SHARED_FLAT is not set
UCLIBC_HAS_FOPEN_LARGEFILE_MODE=y
UCLIBC_HAS_FPU=y
# UCLIBC_HAS_GETPT is not set
UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y
UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL=y
UCLIBC_HAS_PROFILING=y
UCLIBC_HAS_REENTRANT_RPC=y
UCLIBC_HAS_STUBS=y
UCLIBC_HAS_XATTR=y
UCLIBC_NTP_LEGACY=y
UCLIBC_STATIC_LDCONFIG=y
UCLIBC_SV4_DEPRECATED=y
UCLIBC_UCLINUX_BROKEN_MUNMAP=y
UNIX98PTY_ONLY=y

View File

@ -1,36 +0,0 @@
--- a/librt/mq_receive.c
+++ b/librt/mq_receive.c
@@ -6,7 +6,8 @@
#include <stddef.h>
#include <sys/syscall.h>
#include <mqueue.h>
-#warning FIXME: hard dependency on ADVANCED REALTIME feature
+
+#ifdef __UCLIBC_HAS_ADVANCED_REALTIME__
librt_hidden_proto(mq_timedreceive)
@@ -44,3 +45,5 @@ ssize_t mq_receive(mqd_t mqdes, char *ms
{
return mq_timedreceive(mqdes, msg_ptr, msg_len, msg_prio, NULL);
}
+
+#endif /* __UCLIBC_HAS_ADVANCED_REALTIME__ */
--- a/librt/mq_send.c
+++ b/librt/mq_send.c
@@ -6,7 +6,8 @@
#include <stddef.h>
#include <sys/syscall.h>
#include <mqueue.h>
-#warning FIXME: hard dependency on ADVANCED REALTIME feature
+
+#ifdef __UCLIBC_HAS_ADVANCED_REALTIME__
librt_hidden_proto(mq_timedsend)
@@ -43,3 +44,5 @@ int mq_send(mqd_t mqdes, const char *msg
{
return mq_timedsend(mqdes, msg_ptr, msg_len, msg_prio, NULL);
}
+
+#endif /* __UCLIBC_HAS_ADVANCED_REALTIME__ */

View File

@ -1,33 +0,0 @@
--- a/libpthread/nptl/Makefile.in
+++ b/libpthread/nptl/Makefile.in
@@ -174,7 +174,7 @@
CFLAGS-pthread_barrierattr_setpshared.c = -D_GNU_SOURCE
CFLAGS-sem_open.c = -D_GNU_SOURCE
-CFLAGS-nptl = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 $(SSP_ALL_CFLAGS)
+CFLAGS-nptl = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 -std=gnu99 $(SSP_ALL_CFLAGS)
CFLAGS-OMIT-alloca_cutoff.c = -DNOT_IN_libc=1 -DIS_IN_libpthread=1
CFLAGS-OMIT-forward.c = -DNOT_IN_libc=1 -DIS_IN_libpthread=1
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/Makefile.in
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/Makefile.in
@@ -82,7 +82,7 @@
CFLAGS-timer_routines.c = -I$(top_srcdir)librt -DIS_IN_librt=1
CFLAGS-timer_settime.c = -I$(top_srcdir)librt -DIS_IN_librt=1
-CFLAGS-linux = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 $(SSP_ALL_CFLAGS)
+CFLAGS-linux = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 -std=gnu99 $(SSP_ALL_CFLAGS)
#CFLAGS:=$(CFLAGS:-O1=-O2)
CFLAGS-OMIT-libc_pthread_init.c = -DNOT_IN_libc=1 -DIS_IN_libpthread=1
--- a/ldso/ldso/Makefile.in
+++ b/ldso/ldso/Makefile.in
@@ -13,7 +13,7 @@
CFLAGS-ldso += -fno-omit-frame-pointer
CFLAGS-ldso += -I$(top_srcdir)ldso/ldso/$(TARGET_ARCH) -I$(top_srcdir)ldso/include -I$(top_srcdir)ldso/ldso
-CFLAGS-ldso += -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" -DUCLIBC_LDSO=\"$(UCLIBC_LDSO)\"
+CFLAGS-ldso += -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" -DUCLIBC_LDSO=\"$(UCLIBC_LDSO)\" -std=gnu99
ifeq ($(DODEBUG),y)
# Not really much point in including debugging info, since gdb

View File

@ -0,0 +1,78 @@
diff -ruN uClibc-0.9.32/libpthread/nptl/allocatestack.c uClibc-0.9.32/libpthread/nptl.new/allocatestack.c
--- uClibc-0.9.32/libpthread/nptl/allocatestack.c 2010-06-19 20:50:30.000000000 +0200
+++ uClibc-0.9.32/libpthread/nptl.new/allocatestack.c 2010-06-19 16:06:32.000000000 +0200
@@ -844,7 +844,8 @@
curp->specific_used = false;
- for (size_t cnt = 1; cnt < PTHREAD_KEY_1STLEVEL_SIZE; ++cnt)
+ size_t cnt;
+ for (cnt = 1; cnt < PTHREAD_KEY_1STLEVEL_SIZE; ++cnt)
if (curp->specific[cnt] != NULL)
{
memset (curp->specific[cnt], '\0',
diff -ruN uClibc-0.9.32/libpthread/nptl/pthread_key_create.c uClibc-0.9.32/libpthread/nptl.new/pthread_key_create.c
--- uClibc-0.9.32/libpthread/nptl/pthread_key_create.c 2010-06-19 20:50:30.000000000 +0200
+++ uClibc-0.9.32/libpthread/nptl.new/pthread_key_create.c 2010-06-19 16:06:59.000000000 +0200
@@ -29,7 +29,8 @@
void (*destr) (void *))
{
/* Find a slot in __pthread_kyes which is unused. */
- for (size_t cnt = 0; cnt < PTHREAD_KEYS_MAX; ++cnt)
+ size_t cnt;
+ for (cnt = 0; cnt < PTHREAD_KEYS_MAX; ++cnt)
{
uintptr_t seq = __pthread_keys[cnt].seq;
diff -ruN uClibc-0.9.32/libpthread/nptl/sysdeps/generic/dl-tls.c uClibc-0.9.32/libpthread/nptl.new/sysdeps/generic/dl-tls.c
--- uClibc-0.9.32/libpthread/nptl/sysdeps/generic/dl-tls.c 2010-06-19 20:50:30.000000000 +0200
+++ uClibc-0.9.32/libpthread/nptl.new/sysdeps/generic/dl-tls.c 2010-06-19 16:06:04.000000000 +0200
@@ -258,7 +258,8 @@
/* We simply start with zero. */
size_t offset = 0;
- for (size_t cnt = 0; slotinfo[cnt].map != NULL; ++cnt)
+ size_t cnt;
+ for (cnt = 0; slotinfo[cnt].map != NULL; ++cnt)
{
assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
diff -ruN uClibc-0.9.32/libpthread/nptl/sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c uClibc-0.9.32/libpthread/nptl.new/sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c
--- uClibc-0.9.32/libpthread/nptl/sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c 2010-06-19 20:50:30.000000000 +0200
+++ uClibc-0.9.32/libpthread/nptl.new/sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c 2010-06-19 16:05:38.000000000 +0200
@@ -38,7 +38,8 @@
{
/* Check whether there are any bits set beyond the limits
the user requested. */
- for (size_t cnt = cpusetsize; cnt < iattr->cpusetsize; ++cnt)
+ size_t cnt;
+ for (cnt = cpusetsize; cnt < iattr->cpusetsize; ++cnt)
if (((char *) iattr->cpuset)[cnt] != 0)
return EINVAL;
diff -ruN uClibc-0.9.32/libpthread/nptl/sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c uClibc-0.9.32/libpthread/nptl.new/sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c
--- uClibc-0.9.32/libpthread/nptl/sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c 2010-06-19 20:50:30.000000000 +0200
+++ uClibc-0.9.32/libpthread/nptl.new/sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c 2010-06-19 16:04:46.000000000 +0200
@@ -57,7 +57,8 @@
/* Check whether the new bitmask has any bit set beyond the
last one the kernel accepts. */
- for (size_t cnt = __kernel_cpumask_size; cnt < cpusetsize; ++cnt)
+ size_t cnt;
+ for (cnt = __kernel_cpumask_size; cnt < cpusetsize; ++cnt)
if (((char *) cpuset)[cnt] != '\0')
/* Found a nonzero byte. This means the user request cannot be
fulfilled. */
diff -ruN uClibc-0.9.32/libpthread/nptl/sysdeps/unix/sysv/linux/pthread_setaffinity.c uClibc-0.9.32/libpthread/nptl.new/sysdeps/unix/sysv/linux/pthread_setaffinity.c
--- uClibc-0.9.32/libpthread/nptl/sysdeps/unix/sysv/linux/pthread_setaffinity.c 2010-06-19 20:50:30.000000000 +0200
+++ uClibc-0.9.32/libpthread/nptl.new/sysdeps/unix/sysv/linux/pthread_setaffinity.c 2010-06-19 16:05:15.000000000 +0200
@@ -71,7 +71,8 @@
/* We now know the size of the kernel cpumask_t. Make sure the user
does not request to set a bit beyond that. */
- for (size_t cnt = __kernel_cpumask_size; cnt < cpusetsize; ++cnt)
+ size_t cnt;
+ for (cnt = __kernel_cpumask_size; cnt < cpusetsize; ++cnt)
if (((char *) cpuset)[cnt] != '\0')
/* Found a nonzero byte. This means the user request cannot be
fulfilled. */

View File

@ -1,6 +1,6 @@
--- ./include/string.h.orig 2008-06-08 22:38:53.000000000 +0200
+++ ./include/string.h 2009-01-02 16:09:03.000000000 +0100
@@ -355,18 +355,40 @@
--- a/include/string.h
+++ b/include/string.h
@@ -357,18 +357,40 @@ extern char *index (__const char *__s, i
/* Find the last occurrence of C in S (same as strrchr). */
extern char *rindex (__const char *__s, int __c)
__THROW __attribute_pure__ __nonnull ((1));

View File

@ -0,0 +1,14 @@
--- a/include/sys/timex.h
+++ b/include/sys/timex.h
@@ -116,9 +116,8 @@ struct timex
__BEGIN_DECLS
-#if 0
-extern int __adjtimex (struct timex *__ntx) __THROW;
-#endif
+#undef __adjtimex
+#define __adjtimex adjtimex
extern int adjtimex (struct timex *__ntx) __THROW;
libc_hidden_proto(adjtimex)

View File

@ -0,0 +1,12 @@
--- a/libc/sysdeps/linux/common/bits/mathcalls.h
+++ b/libc/sysdeps/linux/common/bits/mathcalls.h
@@ -237,8 +237,7 @@ __END_NAMESPACE_C99
/* Return nonzero if VALUE is not a number. */
-/* DELETE? __MATHDECL_PRIV adds another "__": so this is "____isnan"???! */
-/*__MATHDECL_PRIV (int,__isnan,, (_Mdouble_ __value), (__const__))*/
+__MATHDECL_PRIV (int,isnan,, (_Mdouble_ __value), (__const__));
#if defined __USE_MISC || defined __USE_XOPEN
/* Return nonzero if VALUE is not a number. */

View File

@ -1,6 +1,6 @@
--- a/include/math.h
+++ b/include/math.h
@@ -179,7 +179,7 @@
@@ -198,7 +198,7 @@ libm_hidden_proto(signgam)
/* ISO C99 defines some generic macros which work on any data type. */
@ -9,7 +9,7 @@
/* Get the architecture specific values describing the floating-point
evaluation. The following symbols will get defined:
@@ -299,6 +299,11 @@
@@ -318,6 +318,11 @@ enum
#endif /* Use ISO C99. */

View File

@ -0,0 +1,11 @@
--- a/libc/stdio/_stdio.c
+++ b/libc/stdio/_stdio.c
@@ -119,7 +119,7 @@ static FILE _stdio_streams[] = {
__FLAG_NBF|__FLAG_WRITEONLY, \
2, \
NULL, \
- NULL, \
+ 0, \
0 )
};

View File

@ -0,0 +1,103 @@
--- a/libc/sysdeps/linux/powerpc/Makefile.arch
+++ b/libc/sysdeps/linux/powerpc/Makefile.arch
@@ -5,7 +5,7 @@
# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
#
-CSRC := __syscall_error.c pread_write.c ioctl.c
+CSRC := __syscall_error.c pread_write.c ioctl.c copysignl.c
ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),y)
CSRC += posix_fadvise.c posix_fadvise64.c
--- /dev/null
+++ b/libc/sysdeps/linux/powerpc/copysignl.c
@@ -0,0 +1,89 @@
+/* s_copysignl.c -- long double version of s_copysign.c.
+ * Conversion to long double by Ulrich Drepper,
+ * Cygnus Support, drepper@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * copysignl(long double x, long double y)
+ * copysignl(x,y) returns a value with the magnitude of x and
+ * with the sign bit of y.
+ */
+
+#include <endian.h>
+#include <stdint.h>
+
+#if __FLOAT_WORD_ORDER == BIG_ENDIAN
+
+typedef union
+{
+ long double value;
+ struct
+ {
+ int sign_exponent:16;
+ unsigned int empty:16;
+ uint32_t msw;
+ uint32_t lsw;
+ } parts;
+} ieee_long_double_shape_type;
+
+#endif
+
+#if __FLOAT_WORD_ORDER == LITTLE_ENDIAN
+
+typedef union
+{
+ long double value;
+ struct
+ {
+ uint32_t lsw;
+ uint32_t msw;
+ int sign_exponent:16;
+ unsigned int empty:16;
+ } parts;
+} ieee_long_double_shape_type;
+
+#endif
+
+/* Get int from the exponent of a long double. */
+
+#define GET_LDOUBLE_EXP(exp,d) \
+do { \
+ ieee_long_double_shape_type ge_u; \
+ ge_u.value = (d); \
+ (exp) = ge_u.parts.sign_exponent; \
+} while (0)
+
+/* Set exponent of a long double from an int. */
+
+#define SET_LDOUBLE_EXP(d,exp) \
+do { \
+ ieee_long_double_shape_type se_u; \
+ se_u.value = (d); \
+ se_u.parts.sign_exponent = (exp); \
+ (d) = se_u.value; \
+} while (0)
+
+long double copysignl(long double x, long double y);
+libc_hidden_proto(copysignl);
+
+long double copysignl(long double x, long double y)
+{
+ uint32_t es1,es2;
+ GET_LDOUBLE_EXP(es1,x);
+ GET_LDOUBLE_EXP(es2,y);
+ SET_LDOUBLE_EXP(x,(es1&0x7fff)|(es2&0x8000));
+ return x;
+}
+
+libc_hidden_def(copysignl);

File diff suppressed because it is too large Load Diff