aboutsummaryrefslogtreecommitdiff
path: root/math
diff options
context:
space:
mode:
Diffstat (limited to 'math')
-rw-r--r--math/Versions4
-rw-r--r--math/w_exp.c8
-rw-r--r--math/w_exp2.c8
-rw-r--r--math/w_exp2_compat.c20
-rw-r--r--math/w_exp_compat.c21
5 files changed, 54 insertions, 7 deletions
diff --git a/math/Versions b/math/Versions
index b5a2500712..29e02d6654 100644
--- a/math/Versions
+++ b/math/Versions
@@ -575,4 +575,8 @@ libm {
f32xsubf64x; f32xsubf128; f64subf64x; f64subf128;
f64xsubf128;
}
+ GLIBC_2.29 {
+ # No SVID compatible error handling.
+ exp; exp2;
+ }
}
diff --git a/math/w_exp.c b/math/w_exp.c
new file mode 100644
index 0000000000..9a18bd5c12
--- /dev/null
+++ b/math/w_exp.c
@@ -0,0 +1,8 @@
+#include <math-type-macros-double.h>
+#undef __USE_WRAPPER_TEMPLATE
+#define __USE_WRAPPER_TEMPLATE 1
+#undef declare_mgen_alias
+#define declare_mgen_alias(a, b)
+#include <w_exp_template.c>
+versioned_symbol (libm, __exp, exp, GLIBC_2_29);
+libm_alias_double_other (__exp, exp)
diff --git a/math/w_exp2.c b/math/w_exp2.c
new file mode 100644
index 0000000000..6c848715fb
--- /dev/null
+++ b/math/w_exp2.c
@@ -0,0 +1,8 @@
+#include <math-type-macros-double.h>
+#undef __USE_WRAPPER_TEMPLATE
+#define __USE_WRAPPER_TEMPLATE 1
+#undef declare_mgen_alias
+#define declare_mgen_alias(a, b)
+#include <w_exp2_template.c>
+versioned_symbol (libm, __exp2, exp2, GLIBC_2_29);
+libm_alias_double_other (__exp2, exp2)
diff --git a/math/w_exp2_compat.c b/math/w_exp2_compat.c
index 7ab618292f..567383d001 100644
--- a/math/w_exp2_compat.c
+++ b/math/w_exp2_compat.c
@@ -7,9 +7,11 @@
#include <math-svid-compat.h>
#include <libm-alias-double.h>
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && (SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_29) \
+ || defined NO_LONG_DOUBLE \
+ || defined LONG_DOUBLE_COMPAT)
double
-__exp2 (double x)
+__exp2_compat (double x)
{
double z = __ieee754_exp2 (x);
if (__builtin_expect (!isfinite (z) || z == 0, 0)
@@ -19,5 +21,17 @@ __exp2 (double x)
return z;
}
-libm_alias_double (__exp2, exp2)
+# if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_29)
+compat_symbol (libm, __exp2_compat, exp2, GLIBC_2_1);
+# endif
+# ifdef NO_LONG_DOUBLE
+weak_alias (__exp2_compat, exp2l)
+# endif
+# ifdef LONG_DOUBLE_COMPAT
+/* Work around gas bug "multiple versions for symbol". */
+weak_alias (__exp2_compat, __exp2_compat_alias)
+
+LONG_DOUBLE_COMPAT_CHOOSE_libm_exp2l (
+ compat_symbol (libm, __exp2_compat_alias, exp2l, FIRST_VERSION_libm_exp2l), );
+# endif
#endif
diff --git a/math/w_exp_compat.c b/math/w_exp_compat.c
index ccda100075..df0137cb65 100644
--- a/math/w_exp_compat.c
+++ b/math/w_exp_compat.c
@@ -21,10 +21,12 @@
#include <math-svid-compat.h>
#include <libm-alias-double.h>
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && (SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_29) \
+ || defined NO_LONG_DOUBLE \
+ || defined LONG_DOUBLE_COMPAT)
/* wrapper exp */
double
-__exp (double x)
+__exp_compat (double x)
{
double z = __ieee754_exp (x);
if (__builtin_expect (!isfinite (z) || z == 0, 0)
@@ -33,6 +35,17 @@ __exp (double x)
return z;
}
-libm_hidden_def (__exp)
-libm_alias_double (__exp, exp)
+# if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_29)
+compat_symbol (libm, __exp_compat, exp, GLIBC_2_0);
+# endif
+# ifdef NO_LONG_DOUBLE
+weak_alias (__exp_compat, expl)
+# endif
+# ifdef LONG_DOUBLE_COMPAT
+/* Work around gas bug "multiple versions for symbol". */
+weak_alias (__exp_compat, __exp_compat_alias)
+
+LONG_DOUBLE_COMPAT_CHOOSE_libm_expl (
+ compat_symbol (libm, __exp_compat_alias, expl, FIRST_VERSION_libm_expl), );
+# endif
#endif