Make ldexpF generic.

Message ID 9186f43a-2749-70e9-809c-400137f35d57@linux.vnet.ibm.com
State Superseded
Delegated to: Joseph Myers
Headers

Commit Message

Paul E. Murphy Sept. 14, 2016, 4:31 p.m. UTC
  On 09/13/2016 05:56 PM, Joseph Myers wrote:
> On Tue, 13 Sep 2016, Paul E. Murphy wrote:
> 
>> This one is a little more tricky since it is built both for
>> libm and libc, and exports multiple aliases.
>>
>> To simplify aliasing, a new macro is introduced which handles
>> aliasing to two symbols.  By default, it just applies
>> declare_mgen_alias to both target symbols.
>>
>> Likewise, the makefile is tweaked a little to generate
>> templates for shared files too, and a new rule is added
>> to build m_*.c objects from the objpfx directory.
> 
> Could you describe the testing done, in particular the configurations for 
> which you've confirmed unchanged code generation for the relevant objects?

I'd manually checked the symbols and text sections.  Which, as usual,
turns out to be error prone.  I put this against the same set of 
automated tests as the other generated patches (including both m_*
and s_* objects). This is missing the second alias for scalbn on
NO_LONG_DOUBLE machines.

Likewise, I used the s_catan* objects to verify removing the
redundant macro definition does not alter generation.

Attached is an updated patch.  The only substantial change is adding
an extra weak alias for to2 for the new macro when building on a
NO_LONG_DOUBLE machine.  It has been verified on multiple platforms
as described in the amended log.
  

Comments

Joseph Myers Sept. 16, 2016, 11:12 p.m. UTC | #1
On Wed, 14 Sep 2016, Paul E. Murphy wrote:

> Attached is an updated patch.  The only substantial change is adding
> an extra weak alias for to2 for the new macro when building on a
> NO_LONG_DOUBLE machine.  It has been verified on multiple platforms
> as described in the amended log.

OK.
  

Patch

From db3629188e4292fe1e259109a3264d3eb738dbe5 Mon Sep 17 00:00:00 2001
From: "Paul E. Murphy" <murphyp@linux.vnet.ibm.com>
Date: Thu, 8 Sep 2016 08:48:08 -0500
Subject: [PATCH] Make ldexpF generic.

This one is a little more tricky since it is built both for
libm and libc, and exports multiple aliases.

To simplify aliasing, a new macro is introduced which handles
aliasing to two symbols.  By default, it just applies
declare_mgen_alias to both target symbols.

Likewise, the makefile is tweaked a little to generate
templates for shared files too, and a new rule is added
to build m_*.c objects from the objpfx directory.

Verified there are no symbol or code changes using a script
to diff the *_ldexp* object files on s390x, aarch64, arm,
x86_64, and ppc64.

	* math/Makefile (gen-all-calls): New variable.
	(generated): Replace gen-libm-calls with gen-all-calls.
	(gen-libm-templates.stmp): Likewise, and add dependency
	on output directory generation.
	(calls): Move s_ldexpF into gen-calls.
	(gen-calls): New variable.

	* math/s_ldexpf.c: Removed.
	* math/s_ldexpl.c: Removed.
	* math/s_ldexp.c: Refactored into ...
	* math/s_ldexp_template.c: New file.

	* sysdeps/generic/math-type-macros-double.h: Remove
	redundant fall-through definition of declare_mgen_alias.
	(declare_mgen_alias_2): New macro.

	* sysdeps/generc/math-type-macros.h (declare_mgen_alias_2):
	New macro for function aliased to two exported symbols.

	* sysdeps/ieee754/ldbl-opt/s_ldexp.c: Update to use
	new template file.
	sysdeps/ieee754/ldbl-opt/s_ldexpl.c: Likewise.

fixup ldexpF
---
 math/Makefile                             | 19 ++++++++++++-----
 math/s_ldexp.c                            | 34 -------------------------------
 math/s_ldexp_template.c                   | 32 +++++++++++++++++++++++++++++
 math/s_ldexpf.c                           | 32 -----------------------------
 math/s_ldexpl.c                           | 33 ------------------------------
 sysdeps/generic/math-type-macros-double.h | 10 ++++++---
 sysdeps/generic/math-type-macros.h        | 12 +++++++++++
 sysdeps/ieee754/ldbl-opt/s_ldexp.c        | 25 +++++++++++++++++++++--
 sysdeps/ieee754/ldbl-opt/s_ldexpl.c       | 27 ++++++++++++++++++++----
 9 files changed, 111 insertions(+), 113 deletions(-)
 delete mode 100644 math/s_ldexp.c
 create mode 100644 math/s_ldexp_template.c
 delete mode 100644 math/s_ldexpf.c
 delete mode 100644 math/s_ldexpl.c

diff --git a/math/Makefile b/math/Makefile
index fc48960..0c59616 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -120,7 +120,8 @@  libm-routines = $(strip $(libm-support) $(libm-compat-calls)		\
 # In libm-calls (above), list m_foo in place of s_foo for any
 # routine that should be compiled separately for its libc and libm versions.
 calls = s_isinfF s_isnanF s_finiteF s_copysignF s_modfF s_scalbnF s_frexpF \
-	s_ldexpF s_signbitF
+	s_signbitF $(gen-calls)
+gen-calls = s_ldexpF
 generated += $(foreach s,.c .S,$(call type-foreach, $(calls:s_%=m_%$(s))))
 routines = $(call type-foreach, $(calls))
 
@@ -272,12 +273,14 @@  extra-objs += libieee.a ieee-math.o
 
 include ../Rules
 
-generated += $(addsuffix .c,$(call type-foreach,$(gen-libm-calls))) \
+gen-all-calls = $(gen-libm-calls) $(gen-calls)
+
+generated += $(addsuffix .c,$(call type-foreach,$(gen-all-calls))) \
 	     gen-libm-templates.stmp
 
 # Create wrappers in the math build directory.
-$(objpfx)gen-libm-templates.stmp:
-	for gcall in $(gen-libm-calls); do                                \
+$(objpfx)gen-libm-templates.stmp: $(objpfx)
+	for gcall in $(gen-all-calls); do                                 \
 	  func=$${gcall%F*}$${gcall#*F};                                  \
 	  for type in $(foreach t,$(types),$(t)__$(type-$(t)-suffix)); do \
 	    suff=$${type#*__};                                            \
@@ -292,7 +295,7 @@  $(objpfx)gen-libm-templates.stmp:
 	echo > $(@)
 
 # Add dependency to ensure the generator runs prior.
-$(foreach t, $(call type-foreach, $(gen-libm-calls)), \
+$(foreach t, $(call type-foreach, $(gen-all-calls)), \
              $(objpfx)$(t).c): $(objpfx)gen-libm-templates.stmp
 
 ifneq (no,$(PERL))
@@ -334,6 +337,12 @@  endef
 object-suffixes-left := $(all-object-suffixes)
 include $(o-iterator)
 
+# Likewise, for those generated files shared with libc.
+define o-iterator-doit
+$(objpfx)m_%$o: $(objpfx)s_%.c $(before-compile); $$(compile-command.c)
+endef
+object-suffixes-left := $(all-object-suffixes)
+include $(o-iterator)
 
 # This file defines the default _LIB_VERSION variable that controls
 # the error return conventions for the math functions.
diff --git a/math/s_ldexp.c b/math/s_ldexp.c
deleted file mode 100644
index ee53695..0000000
--- a/math/s_ldexp.c
+++ /dev/null
@@ -1,34 +0,0 @@ 
-/* @(#)s_ldexp.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: s_ldexp.c,v 1.6 1995/05/10 20:47:40 jtc Exp $";
-#endif
-
-#include <math.h>
-#include <math_private.h>
-#include <errno.h>
-
-double __ldexp(double value, int exp)
-{
-	if(!isfinite(value)||value==0.0) return value + value;
-	value = __scalbn(value,exp);
-	if(!isfinite(value)||value==0.0) __set_errno (ERANGE);
-	return value;
-}
-weak_alias (__ldexp, ldexp)
-weak_alias (__ldexp, scalbn)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__ldexp, __ldexpl)
-weak_alias (__ldexp, ldexpl)
-weak_alias (__ldexp, scalbnl)
-#endif
diff --git a/math/s_ldexp_template.c b/math/s_ldexp_template.c
new file mode 100644
index 0000000..42a8333
--- /dev/null
+++ b/math/s_ldexp_template.c
@@ -0,0 +1,32 @@ 
+/* @(#)s_ldexp.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] = "$NetBSD: s_ldexp.c,v 1.6 1995/05/10 20:47:40 jtc Exp $";
+#endif
+
+#include <math.h>
+#include <math_private.h>
+#include <errno.h>
+
+FLOAT
+M_SUF (__ldexp) (FLOAT value, int exp)
+{
+	if(!isfinite(value)||value==0) return value + value;
+	value = M_SCALBN(value,exp);
+	if(!isfinite(value)||value==0) __set_errno (ERANGE);
+	return value;
+}
+
+declare_mgen_alias_2 (__ldexp, ldexp, scalbn);
+
+/* Note, versioning issues are punted to ldbl-opt in this case.  */
diff --git a/math/s_ldexpf.c b/math/s_ldexpf.c
deleted file mode 100644
index b83062f..0000000
--- a/math/s_ldexpf.c
+++ /dev/null
@@ -1,32 +0,0 @@ 
-/* s_ldexpf.c -- float version of s_ldexp.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@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.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: s_ldexpf.c,v 1.3 1995/05/10 20:47:42 jtc Exp $";
-#endif
-
-#include <math.h>
-#include <math_private.h>
-#include <errno.h>
-
-float __ldexpf(float value, int exp)
-{
-	if(!isfinite(value)||value==(float)0.0) return value + value;
-	value = __scalbnf(value,exp);
-	if(!isfinite(value)||value==(float)0.0) __set_errno (ERANGE);
-	return value;
-}
-weak_alias (__ldexpf, ldexpf)
-weak_alias (__ldexpf, scalbnf)
diff --git a/math/s_ldexpl.c b/math/s_ldexpl.c
deleted file mode 100644
index 52fb093..0000000
--- a/math/s_ldexpl.c
+++ /dev/null
@@ -1,33 +0,0 @@ 
-/* s_ldexpl.c -- long double version of s_ldexp.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.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: $";
-#endif
-
-#include <math.h>
-#include <math_private.h>
-#include <errno.h>
-
-long double __ldexpl(long double value, int exp)
-{
-	if(!isfinite(value)||value==0.0) return value + value;
-	value = __scalbnl(value,exp);
-	if(!isfinite(value)||value==0.0) __set_errno (ERANGE);
-	return value;
-}
-weak_alias (__ldexpl, ldexpl)
-weak_alias (__ldexpl, scalbnl)
diff --git a/sysdeps/generic/math-type-macros-double.h b/sysdeps/generic/math-type-macros-double.h
index 154f416..284a6a4 100644
--- a/sysdeps/generic/math-type-macros-double.h
+++ b/sysdeps/generic/math-type-macros-double.h
@@ -34,9 +34,13 @@ 
    weak_alias (from, to)		    \
    strong_alias (from, from ## l)	    \
    weak_alias (from, to ## l)
-#elif !defined declare_mgen_alias
-# define declare_mgen_alias(from, to)	    \
-   weak_alias (M_SUF (from), M_SUF (to))
+#endif
+
+#if defined NO_LONG_DOUBLE && !defined declare_mgen_alias_2
+# define declare_mgen_alias_2(from, to, to2) \
+   declare_mgen_alias (from, to)	     \
+   weak_alias (from, to2)		     \
+   weak_alias (from, to2 ## l)
 #endif
 
 /* Supply the generic macros.  */
diff --git a/sysdeps/generic/math-type-macros.h b/sysdeps/generic/math-type-macros.h
index 259cb94..bd9e25a 100644
--- a/sysdeps/generic/math-type-macros.h
+++ b/sysdeps/generic/math-type-macros.h
@@ -38,6 +38,11 @@ 
       This exposes the appropriate symbol(s) for a
       function f of type FLOAT.
 
+  declare_mgen_alias_2(from,to,to2)
+      This exposes the appropriate symbol(s) for a
+      function f of type FLOAT when it is aliased
+      to two symbols.
+
   M_LIBM_NEED_COMPAT(func)
       This is utilized in macro context to indicate
       whether func should declare compat symbols.
@@ -112,6 +117,13 @@ 
 # define declare_mgen_alias(from, to) weak_alias (M_SUF (from), M_SUF (to))
 #endif
 
+/* Likewise, if two aliases are derived from the same symbol.  */
+#ifndef declare_mgen_alias_2
+# define declare_mgen_alias_2(from, to, to2)  \
+ declare_mgen_alias (from, to)		      \
+ declare_mgen_alias (from, to2)
+#endif
+
 /* Do not generate anything for compat symbols by default.  */
 #ifndef M_LIBM_NEED_COMPAT
 # define M_LIBM_NEED_COMPAT(func) 0
diff --git a/sysdeps/ieee754/ldbl-opt/s_ldexp.c b/sysdeps/ieee754/ldbl-opt/s_ldexp.c
index 20e107b..65f96e0 100644
--- a/sysdeps/ieee754/ldbl-opt/s_ldexp.c
+++ b/sysdeps/ieee754/ldbl-opt/s_ldexp.c
@@ -1,5 +1,26 @@ 
-#include <math_ldbl_opt.h>
-#include <math/s_ldexp.c>
+/* ldexp alias overrides for platforms where long double
+   was previously not unique.
+   Copyright (C) 2016 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
+   <http://www.gnu.org/licenses/>.  */
+
+#define M_LIBM_NEED_COMPAT(f) 0
+#include <math-type-macros-double.h>
+#include <s_ldexp_template.c>
+
 #if IS_IN (libm)
 # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
 compat_symbol (libm, __ldexp, ldexpl, GLIBC_2_0);
diff --git a/sysdeps/ieee754/ldbl-opt/s_ldexpl.c b/sysdeps/ieee754/ldbl-opt/s_ldexpl.c
index ed87a92..7a26437 100644
--- a/sysdeps/ieee754/ldbl-opt/s_ldexpl.c
+++ b/sysdeps/ieee754/ldbl-opt/s_ldexpl.c
@@ -1,7 +1,26 @@ 
-#include <math_ldbl_opt.h>
-#undef weak_alias
-#define weak_alias(n,a)
-#include <math/s_ldexpl.c>
+/* ldexpl alias overrides for platforms where long double
+   was previously not unique.
+   Copyright (C) 2016 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
+   <http://www.gnu.org/licenses/>.  */
+
+#define declare_mgen_alias(f,t)
+#include <math-type-macros-ldouble.h>
+#include <s_ldexp_template.c>
+
 strong_alias (__ldexpl, __ldexpl_2)
 #if IS_IN (libm)
 long_double_symbol (libm, __ldexpl, ldexpl);
-- 
2.7.4