These macros are to be used with `fesetenv()`, so they belong there.
Having these `selectany` variables in 'fenv.h' causes them to be defined with external linkage in every source file which includes 'fenv.h'. They can also be exported inappropriately from a DLL, which either is built with `--export-all-symbols`, or does not contain explicit `dllexport` and is not built with a DEF file. Signed-off-by: LIU Hao <lh_mo...@126.com> --- mingw-w64-crt/misc/fesetenv.c | 16 ++++++++++++++++ mingw-w64-headers/crt/fenv.h | 6 +++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/mingw-w64-crt/misc/fesetenv.c b/mingw-w64-crt/misc/fesetenv.c index 5a4426a30..432192763 100644 --- a/mingw-w64-crt/misc/fesetenv.c +++ b/mingw-w64-crt/misc/fesetenv.c @@ -6,6 +6,22 @@ #include <internal.h> +/* The FE_DFL_ENV macro is required by standard. + fesetenv will use the environment set at app startup.*/ +const fenv_t __mingw_fe_dfl_env = { 0, 0 }; + +/* The C99 standard (7.6.9) allows us to define implementation-specific macros for + different fp environments */ +#if defined(__i386__) || defined(__x86_64__) + +/* The default Intel x87 floating point environment (64-bit mantissa) */ +const fenv_t __mingw_fe_pc64_env = { 0x3f3f003f, 0 }; + +/* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ +const fenv_t __mingw_fe_pc53_env = { 0x3f3f103f, 0 }; + +#endif + /* 7.6.4.3 The fesetenv function establishes the floating-point environment represented by the object pointed to by envp. The argument envp diff --git a/mingw-w64-headers/crt/fenv.h b/mingw-w64-headers/crt/fenv.h index 7d441c287..b4ab0718c 100644 --- a/mingw-w64-headers/crt/fenv.h +++ b/mingw-w64-headers/crt/fenv.h @@ -61,7 +61,7 @@ extern "C" { /* The FE_DFL_ENV macro is required by standard. fesetenv will use the environment set at app startup.*/ -extern const __MINGW_SELECTANY fenv_t __mingw_fe_dfl_env = { 0, 0 }; +extern const fenv_t __mingw_fe_dfl_env; #define FE_DFL_ENV (&__mingw_fe_dfl_env) /* The C99 standard (7.6.9) allows us to define implementation-specific macros for @@ -69,11 +69,11 @@ extern const __MINGW_SELECTANY fenv_t __mingw_fe_dfl_env = { 0, 0 }; #if defined(__i386__) || defined(__x86_64__) /* The default Intel x87 floating point environment (64-bit mantissa) */ -extern const __MINGW_SELECTANY fenv_t __mingw_fe_pc64_env = { 0x3f3f003f, 0 }; +extern const fenv_t __mingw_fe_pc64_env; #define FE_PC64_ENV (&__mingw_fe_pc64_env) /* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ -extern const __MINGW_SELECTANY fenv_t __mingw_fe_pc53_env = { 0x3f3f103f, 0 }; +extern const fenv_t __mingw_fe_pc53_env; #define FE_PC53_ENV (&__mingw_fe_pc53_env) #endif -- 2.49.0
From ad085051572238ffdc0562565162a32da5b440f2 Mon Sep 17 00:00:00 2001 From: LIU Hao <lh_mo...@126.com> Date: Mon, 31 Mar 2025 21:11:55 +0800 Subject: [PATCH] crt: Move definitions of `__mingw_fe_dfl_env` to 'fesetenv.c' These macros are to be used with `fesetenv()`, so they belong there. Having these `selectany` variables in 'fenv.h' causes them to be defined with external linkage in every source file which includes 'fenv.h'. They can also be exported inappropriately from a DLL, which either is built with `--export-all-symbols`, or does not contain explicit `dllexport` and is not built with a DEF file. Signed-off-by: LIU Hao <lh_mo...@126.com> --- mingw-w64-crt/misc/fesetenv.c | 16 ++++++++++++++++ mingw-w64-headers/crt/fenv.h | 6 +++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/mingw-w64-crt/misc/fesetenv.c b/mingw-w64-crt/misc/fesetenv.c index 5a4426a30..432192763 100644 --- a/mingw-w64-crt/misc/fesetenv.c +++ b/mingw-w64-crt/misc/fesetenv.c @@ -6,6 +6,22 @@ #include <internal.h> +/* The FE_DFL_ENV macro is required by standard. + fesetenv will use the environment set at app startup.*/ +const fenv_t __mingw_fe_dfl_env = { 0, 0 }; + +/* The C99 standard (7.6.9) allows us to define implementation-specific macros for + different fp environments */ +#if defined(__i386__) || defined(__x86_64__) + +/* The default Intel x87 floating point environment (64-bit mantissa) */ +const fenv_t __mingw_fe_pc64_env = { 0x3f3f003f, 0 }; + +/* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ +const fenv_t __mingw_fe_pc53_env = { 0x3f3f103f, 0 }; + +#endif + /* 7.6.4.3 The fesetenv function establishes the floating-point environment represented by the object pointed to by envp. The argument envp diff --git a/mingw-w64-headers/crt/fenv.h b/mingw-w64-headers/crt/fenv.h index 7d441c287..b4ab0718c 100644 --- a/mingw-w64-headers/crt/fenv.h +++ b/mingw-w64-headers/crt/fenv.h @@ -61,7 +61,7 @@ extern "C" { /* The FE_DFL_ENV macro is required by standard. fesetenv will use the environment set at app startup.*/ -extern const __MINGW_SELECTANY fenv_t __mingw_fe_dfl_env = { 0, 0 }; +extern const fenv_t __mingw_fe_dfl_env; #define FE_DFL_ENV (&__mingw_fe_dfl_env) /* The C99 standard (7.6.9) allows us to define implementation-specific macros for @@ -69,11 +69,11 @@ extern const __MINGW_SELECTANY fenv_t __mingw_fe_dfl_env = { 0, 0 }; #if defined(__i386__) || defined(__x86_64__) /* The default Intel x87 floating point environment (64-bit mantissa) */ -extern const __MINGW_SELECTANY fenv_t __mingw_fe_pc64_env = { 0x3f3f003f, 0 }; +extern const fenv_t __mingw_fe_pc64_env; #define FE_PC64_ENV (&__mingw_fe_pc64_env) /* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ -extern const __MINGW_SELECTANY fenv_t __mingw_fe_pc53_env = { 0x3f3f103f, 0 }; +extern const fenv_t __mingw_fe_pc53_env; #define FE_PC53_ENV (&__mingw_fe_pc53_env) #endif -- 2.49.0
OpenPGP_signature.asc
Description: OpenPGP digital signature
_______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public