summaryrefslogtreecommitdiffstats
path: root/lib/msun/sparc64
diff options
context:
space:
mode:
authordas <das@FreeBSD.org>2011-10-10 15:43:09 +0000
committerdas <das@FreeBSD.org>2011-10-10 15:43:09 +0000
commita38603b0b57960e07b576fdc7c8ed64d919770d0 (patch)
treea50d2b89f2f16772503039f06c8507b9292a1daa /lib/msun/sparc64
parent768c3db25c16c726fe7df21f139f54cd6342dfbf (diff)
downloadFreeBSD-src-a38603b0b57960e07b576fdc7c8ed64d919770d0.zip
FreeBSD-src-a38603b0b57960e07b576fdc7c8ed64d919770d0.tar.gz
Provide external definitions of all of the standardized functions in
fenv.h that are currently inlined. The definitions are provided in fenv.c via 'extern inline' declaractions. This assumes the compiler handles 'extern inline' as specified in C99, which has been true under FreeBSD since 8.0. The goal is to eventually remove the 'static' keyword from the inline definitions in fenv.h, so that non-inlined references all wind up pointing to the same external definition like they're supposed to. I am deferring the second step to provide a window where newly-compiled apps will still link against old math libraries. (This isn't supported, but there's no need to cause undue breakage.) Reviewed by: stefanf, bde
Diffstat (limited to 'lib/msun/sparc64')
-rw-r--r--lib/msun/sparc64/Symbol.map8
-rw-r--r--lib/msun/sparc64/fenv.c17
-rw-r--r--lib/msun/sparc64/fenv.h34
3 files changed, 45 insertions, 14 deletions
diff --git a/lib/msun/sparc64/Symbol.map b/lib/msun/sparc64/Symbol.map
index 3121177..971112e 100644
--- a/lib/msun/sparc64/Symbol.map
+++ b/lib/msun/sparc64/Symbol.map
@@ -3,3 +3,11 @@
*/
FBSD_1.0 {
};
+
+FBSD_1.3 {
+ fesetexceptflag;
+ feraiseexcept;
+ fegetenv;
+ feholdexcept;
+ feupdateenv;
+};
diff --git a/lib/msun/sparc64/fenv.c b/lib/msun/sparc64/fenv.c
index 6e8220f..a1db64e 100644
--- a/lib/msun/sparc64/fenv.c
+++ b/lib/msun/sparc64/fenv.c
@@ -26,11 +26,28 @@
* $FreeBSD$
*/
+#define __fenv_static
#include <fenv.h>
+#ifdef __GNUC_GNU_INLINE__
+#error "This file must be compiled with C99 'inline' semantics"
+#endif
+
/*
* The FSR_version field may be different on different
* implementations, but it is immutable and opaque to the
* application. Thus, 0 is valid as the default environment.
*/
const fenv_t __fe_dfl_env = 0;
+
+extern inline int feclearexcept(int __excepts);
+extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts);
+extern inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts);
+extern inline int feraiseexcept(int __excepts);
+extern inline int fetestexcept(int __excepts);
+extern inline int fegetround(void);
+extern inline int fesetround(int __round);
+extern inline int fegetenv(fenv_t *__envp);
+extern inline int feholdexcept(fenv_t *__envp);
+extern inline int fesetenv(const fenv_t *__envp);
+extern inline int feupdateenv(const fenv_t *__envp);
diff --git a/lib/msun/sparc64/fenv.h b/lib/msun/sparc64/fenv.h
index 8273299..d17361f 100644
--- a/lib/msun/sparc64/fenv.h
+++ b/lib/msun/sparc64/fenv.h
@@ -31,6 +31,10 @@
#include <sys/_types.h>
+#ifndef __fenv_static
+#define __fenv_static static
+#endif
+
typedef __uint64_t fenv_t;
typedef __uint64_t fexcept_t;
@@ -70,7 +74,7 @@ extern const fenv_t __fe_dfl_env;
#define __ldxfsr(__r) __asm __volatile("ldx %0, %%fsr" : : "m" (__r))
#define __stxfsr(__r) __asm __volatile("stx %%fsr, %0" : "=m" (*(__r)))
-static __inline int
+__fenv_static __inline int
feclearexcept(int __excepts)
{
fexcept_t __r;
@@ -81,7 +85,7 @@ feclearexcept(int __excepts)
return (0);
}
-static __inline int
+__fenv_static inline int
fegetexceptflag(fexcept_t *__flagp, int __excepts)
{
fexcept_t __r;
@@ -91,7 +95,7 @@ fegetexceptflag(fexcept_t *__flagp, int __excepts)
return (0);
}
-static __inline int
+__fenv_static inline int
fesetexceptflag(const fexcept_t *__flagp, int __excepts)
{
fexcept_t __r;
@@ -108,7 +112,7 @@ fesetexceptflag(const fexcept_t *__flagp, int __excepts)
* inline this function on sparc64 even when the arguments are not
* compile-time constants. Perhaps this depends on the register window.
*/
-static __inline int
+__fenv_static inline int
feraiseexcept(int __excepts)
{
volatile double d;
@@ -143,7 +147,7 @@ feraiseexcept(int __excepts)
return (0);
}
-static __inline int
+__fenv_static inline int
fetestexcept(int __excepts)
{
fexcept_t __r;
@@ -152,7 +156,7 @@ fetestexcept(int __excepts)
return (__r & __excepts);
}
-static __inline int
+__fenv_static inline int
fegetround(void)
{
fenv_t __r;
@@ -161,7 +165,7 @@ fegetround(void)
return ((__r >> _ROUND_SHIFT) & _ROUND_MASK);
}
-static __inline int
+__fenv_static inline int
fesetround(int __round)
{
fenv_t __r;
@@ -175,7 +179,7 @@ fesetround(int __round)
return (0);
}
-static __inline int
+__fenv_static inline int
fegetenv(fenv_t *__envp)
{
@@ -183,7 +187,7 @@ fegetenv(fenv_t *__envp)
return (0);
}
-static __inline int
+__fenv_static inline int
feholdexcept(fenv_t *__envp)
{
fenv_t __r;
@@ -195,7 +199,7 @@ feholdexcept(fenv_t *__envp)
return (0);
}
-static __inline int
+__fenv_static inline int
fesetenv(const fenv_t *__envp)
{
@@ -203,7 +207,7 @@ fesetenv(const fenv_t *__envp)
return (0);
}
-static __inline int
+__fenv_static inline int
feupdateenv(const fenv_t *__envp)
{
fexcept_t __r;
@@ -216,7 +220,9 @@ feupdateenv(const fenv_t *__envp)
#if __BSD_VISIBLE
-static __inline int
+/* We currently provide no external definitions of the functions below. */
+
+static inline int
feenableexcept(int __mask)
{
fenv_t __old_r, __new_r;
@@ -227,7 +233,7 @@ feenableexcept(int __mask)
return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT);
}
-static __inline int
+static inline int
fedisableexcept(int __mask)
{
fenv_t __old_r, __new_r;
@@ -238,7 +244,7 @@ fedisableexcept(int __mask)
return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT);
}
-static __inline int
+static inline int
fegetexcept(void)
{
fenv_t __r;
OpenPOWER on IntegriCloud