diff options
author | das <das@FreeBSD.org> | 2011-10-10 15:43:09 +0000 |
---|---|---|
committer | das <das@FreeBSD.org> | 2011-10-10 15:43:09 +0000 |
commit | a38603b0b57960e07b576fdc7c8ed64d919770d0 (patch) | |
tree | a50d2b89f2f16772503039f06c8507b9292a1daa /lib/msun/i387 | |
parent | 768c3db25c16c726fe7df21f139f54cd6342dfbf (diff) | |
download | FreeBSD-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/i387')
-rw-r--r-- | lib/msun/i387/Symbol.map | 2 | ||||
-rw-r--r-- | lib/msun/i387/fenv.c | 20 | ||||
-rw-r--r-- | lib/msun/i387/fenv.h | 19 |
3 files changed, 28 insertions, 13 deletions
diff --git a/lib/msun/i387/Symbol.map b/lib/msun/i387/Symbol.map index aa81690..35e6e18 100644 --- a/lib/msun/i387/Symbol.map +++ b/lib/msun/i387/Symbol.map @@ -9,8 +9,6 @@ FBSD_1.0 { fegetenv; feholdexcept; feupdateenv; - __feenableexcept; - __fedisableexcept; feenableexcept; fedisableexcept; }; diff --git a/lib/msun/i387/fenv.c b/lib/msun/i387/fenv.c index 5c996b3..326f7f7 100644 --- a/lib/msun/i387/fenv.c +++ b/lib/msun/i387/fenv.c @@ -29,7 +29,13 @@ #include <sys/cdefs.h> #include <sys/types.h> #include <machine/npx.h> -#include "fenv.h" + +#define __fenv_static +#include <fenv.h> + +#ifdef __GNUC_GNU_INLINE__ +#error "This file must be compiled with C99 'inline' semantics" +#endif const fenv_t __fe_dfl_env = { __INITIAL_NPXCW__, @@ -83,6 +89,9 @@ __test_sse(void) return (0); } +extern inline int feclearexcept(int __excepts); +extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts); + int fesetexceptflag(const fexcept_t *flagp, int excepts) { @@ -114,6 +123,10 @@ feraiseexcept(int excepts) return (0); } +extern inline int fetestexcept(int __excepts); +extern inline int fegetround(void); +extern inline int fesetround(int __round); + int fegetenv(fenv_t *envp) { @@ -149,6 +162,8 @@ feholdexcept(fenv_t *envp) return (0); } +extern inline int fesetenv(const fenv_t *__envp); + int feupdateenv(const fenv_t *envp) { @@ -208,6 +223,3 @@ __fedisableexcept(int mask) } return (~omask); } - -__weak_reference(__feenableexcept, feenableexcept); -__weak_reference(__fedisableexcept, fedisableexcept); diff --git a/lib/msun/i387/fenv.h b/lib/msun/i387/fenv.h index cc58a92..329dfe1 100644 --- a/lib/msun/i387/fenv.h +++ b/lib/msun/i387/fenv.h @@ -32,6 +32,10 @@ #include <sys/cdefs.h> #include <sys/_types.h> +#ifndef __fenv_static +#define __fenv_static static +#endif + /* * To preserve binary compatibility with FreeBSD 5.3, we pack the * mxcsr into some reserved fields, rather than changing sizeof(fenv_t). @@ -110,7 +114,7 @@ extern const fenv_t __fe_dfl_env; #define __ldmxcsr(__csr) __asm __volatile("ldmxcsr %0" : : "m" (__csr)) #define __stmxcsr(__csr) __asm __volatile("stmxcsr %0" : "=m" (*(__csr))) -static __inline int +__fenv_static inline int feclearexcept(int __excepts) { fenv_t __env; @@ -131,7 +135,7 @@ feclearexcept(int __excepts) return (0); } -static __inline int +__fenv_static inline int fegetexceptflag(fexcept_t *__flagp, int __excepts) { __uint32_t __mxcsr; @@ -149,7 +153,7 @@ fegetexceptflag(fexcept_t *__flagp, int __excepts) int fesetexceptflag(const fexcept_t *__flagp, int __excepts); int feraiseexcept(int __excepts); -static __inline int +__fenv_static inline int fetestexcept(int __excepts) { __uint32_t __mxcsr; @@ -163,7 +167,7 @@ fetestexcept(int __excepts) return ((__status | __mxcsr) & __excepts); } -static __inline int +__fenv_static inline int fegetround(void) { __uint16_t __control; @@ -178,7 +182,7 @@ fegetround(void) return (__control & _ROUND_MASK); } -static __inline int +__fenv_static inline int fesetround(int __round) { __uint32_t __mxcsr; @@ -205,7 +209,7 @@ fesetround(int __round) int fegetenv(fenv_t *__envp); int feholdexcept(fenv_t *__envp); -static __inline int +__fenv_static inline int fesetenv(const fenv_t *__envp) { fenv_t __env = *__envp; @@ -234,7 +238,8 @@ int feupdateenv(const fenv_t *__envp); int feenableexcept(int __mask); int fedisableexcept(int __mask); -static __inline int +/* We currently provide no external definition of fegetexcept(). */ +static inline int fegetexcept(void) { __uint16_t __control; |