git: 3a01e1e1a50c - main - msun/aarch64: convert fenv functions to proper linkage

From: Dima Panov <fluffy_at_FreeBSD.org>
Date: Mon, 06 Apr 2026 15:56:36 UTC
Hello!

This breaks most of libm consumers

llvm/flang:
===============
FAILED: [code=1] bin/flang-20
: && /usr/local/libexec/ccache/c++ -O2 -pipe -fstack-protector-strong -isystem /usr/local/include -fno-strict-aliasing -isystem /usr/local/include -fPIC -fno-semantic-interposition -fvisibility-inline
s-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-s
emi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupport
ed -fdiagnostics-color -ffunction-sections -fdata-sections -Wno-deprecated-copy -Wno-string-conversion -Wno-ctad-maybe-unsupported -Wno-unused-command-line-argument -Wstring-conversion -Wcover
ed-switch-default -Wno-nested-anon-types -O2 -pipe -fstack-protector-strong -isystem /usr/local/include -fno-strict-aliasing -isystem /usr/local/include -DNDEBUG -Wl,--color-diagnostics -Wl,--expor
t-dynamic -Wl,-z,origin -Wl,--gc-sections -Xlinker --dependency-file=tools/flang/tools/flang-driver/CMakeFiles/flang.dir/link.d tools/flang/tools/flang-driver/CMakeFiles/flang.dir/driver.cpp.o tools/
flang/tools/flang-driver/CMakeFiles/flang.dir/fc1_main.cpp.o -o bin/flang-20 -L/wrkdirs/usr/ports/devel/llvm20/work-default/.build/./lib -Wl,-rpath,"\$ORIGIN/../lib:/wrkdirs/usr/ports/devel/llvm20/work-
default/.build/./lib:/wrkdirs/usr/ports/devel/llvm20/work-default/.build/lib:" -lpthread lib/libflangFrontend.a lib/libflangFrontendTool.a lib/libFortranLower.a lib/libFortranSemantics.a lib/libFo
rtranSupport.a lib/libflangPasses.a lib/libHLFIRTransforms.a lib/libFIRTransforms.a lib/libFIROpenACCSupport.a lib/libFlangOpenMPTransforms.a lib/libFIRCodeGen.a lib/libFIRAnalysis.a lib/libFIRB
uilder.a lib/libCUFDialect.a lib/libFortranEvaluate.a lib/libFortranParser.a lib/libFortranCommon.a lib/libFortranDecimal.a lib/libFIRSupport.a lib/libHLFIRDialect.a lib/libFIRDialect.a lib/lib
FIRDialectSupport.a lib/libCUFAttrs.a lib/libclang-cpp.so.20.1 lib/libMLIR.so.20.1 lib/libLLVM.so.20.1 && :
ld: error: undefined symbol: feholdexcept
> > > referenced by host.cpp
> > > host.cpp.o:(Fortran::evaluate::host::HostFloatingPointEnvironment::SetUpHostFloatingPointEnvironment(Fortran::evaluate::FoldingContext&)) in archive lib/libFortranEvaluate.a

ld: error: undefined symbol: fegetenv
> > > referenced by host.cpp
> > > host.cpp.o:(Fortran::evaluate::host::HostFloatingPointEnvironment::SetUpHostFloatingPointEnvironment(Fortran::evaluate::FoldingContext&)) in archive lib/libFortranEvaluate.a
> > > did you mean: fesetenv
> > > defined in: /usr/lib/libm.so
c++: error: linker command failed with exit code 1 (use -v to see invocation)
===============

All of math/py-numpy1 consumers (math/Imath for example):
===============
-- Configuring imathnumpy module
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/numpy/core/__init__.py", line 24, in <module>
from . import multiarray
File "/usr/local/lib/python3.11/site-packages/numpy/core/multiarray.py", line 10, in <module>
from . import overrides
File "/usr/local/lib/python3.11/site-packages/numpy/core/overrides.py", line 8, in <module>
from numpy.core._multiarray_umath import (
ImportError: /usr/local/lib/python3.11/site-packages/numpy/core/_multiarray_umath.cpython-311.so: Undefined symbol "feraiseexcept"

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/numpy/__init__.py", line 130, in <module>
from numpy.__config__ import show as show_config
File "/usr/local/lib/python3.11/site-packages/numpy/__config__.py", line 4, in <module>
from numpy.core._multiarray_umath import (
File "/usr/local/lib/python3.11/site-packages/numpy/core/__init__.py", line 50, in <module>
raise ImportError(msg)
ImportError:
===============

On 30.03.2026 20:15, Konstantin Belousov wrote:
> The branch main has been updated by kib:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=3a01e1e1a50cb9a9594aac2148dc920a6b295428
>
> commit 3a01e1e1a50cb9a9594aac2148dc920a6b295428
> Author: Konstantin Belousov <kib@FreeBSD.org>
> AuthorDate: 2026-03-28 23:13:44 +0000
> Commit: Konstantin Belousov <kib@FreeBSD.org>
> CommitDate: 2026-03-30 16:57:00 +0000
>
> msun/aarch64: convert fenv functions to proper linkage
>
> namely
> fegetexceptflag(3)
> fesetexceptflag(3)
> feraiseexcept(3)
> fetestexcept(3)
> fegetround(3)
> fesetround(3)
> fegetenv(3)
> feholdexcept(3)
> fesetenv(3)
> feupdateenv(3)
> feenableexcept(3)
> fedisableexcept(3)
> fegetexcept(3)
>
> PR: 277958
> Reviewed by: dim
> Sponsored by: The FreeBSD Foundation
> MFC after: 1 week
> Differential revision: https://reviews.freebsd.org/D56139
> ---
> lib/msun/aarch64/fenv.c | 72 ++++++++++++++++++++++++++++++++++++++++---------
> lib/msun/aarch64/fenv.h | 41 +++++++++++++++++++++-------
> 2 files changed, 90 insertions(+), 23 deletions(-)
>
> diff --git a/lib/msun/aarch64/fenv.c b/lib/msun/aarch64/fenv.c
> index 4c54656be7d3..5d626f66516f 100644
> --- a/lib/msun/aarch64/fenv.c
> +++ b/lib/msun/aarch64/fenv.c
> @@ -44,16 +44,62 @@ int
> return (__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);
> -extern inline int feenableexcept(int __mask);
> -extern inline int fedisableexcept(int __mask);
> -extern inline int fegetexcept(void);
> +int
> +(fegetexceptflag)(fexcept_t *flagp, int excepts)
> +{
> + return (__fegetexceptflag_int(flagp, excepts));
> +}
> +
> +int
> +(fesetexceptflag)(const fexcept_t *flagp, int excepts)
> +{
> + return (__fesetexceptflag_int(flagp, excepts));
> +}
> +
> +int
> +(feraiseexcept)(int excepts)
> +{
> + return (__feraiseexcept_int(excepts));
> +}
> +
> +int
> +(fetestexcept)(int excepts)
> +{
> + return (__fetestexcept_int(excepts));
> +}
> +
> +int
> +(fegetround)(void)
> +{
> + return (__fegetround_int());
> +}
> +
> +int
> +(fesetround)(int round)
> +{
> + return (__fesetround_int(round));
> +}
> +
> +int
> +(fegetenv)(fenv_t *envp)
> +{
> + return (__fegetenv_int(envp));
> +}
> +
> +int
> +(feholdexcept)(fenv_t *envp)
> +{
> + return (__feholdexcept_int(envp));
> +}
> +
> +int
> +(fesetenv)(const fenv_t *envp)
> +{
> + return (__fesetenv_int(envp));
> +}
> +
> +int
> +(feupdateenv)(const fenv_t *envp)
> +{
> + return (__feupdateenv_int(envp));
> +}
> diff --git a/lib/msun/aarch64/fenv.h b/lib/msun/aarch64/fenv.h
> index d125978b887b..32a03ee1eb49 100644
> --- a/lib/msun/aarch64/fenv.h
> +++ b/lib/msun/aarch64/fenv.h
> @@ -82,7 +82,28 @@ extern const fenv_t __fe_dfl_env;
> #define __msr_fpsr(__r) __asm __volatile("msr fpsr, %0" : : "r" (__r))
>
> int feclearexcept(int);
> +int fegetexceptflag(fexcept_t *, int);
> +int fesetexceptflag(const fexcept_t *, int);
> +int feraiseexcept(int);
> +int fetestexcept(int);
> +int fegetround(void);
> +int fesetround(int);
> +int fegetenv(fenv_t *);
> +int feholdexcept(fenv_t *);
> +int fesetenv(const fenv_t *);
> +int feupdateenv(const fenv_t *);
> +
> #define feclearexcept(a) __feclearexcept_int(a)
> +#define fegetexceptflag(e, a) __fegetexceptflag_int(e, a)
> +#define fesetexceptflag(e, a) __fesetexceptflag_int(e, a)
> +#define feraiseexcept(a) __feraiseexcept_int(a)
> +#define fetestexcept(a) __fetestexcept_int(a)
> +#define fegetround() __fegetround_int()
> +#define fesetround(a) __fesetround_int(a)
> +#define fegetenv(e) __fegetenv_int(e)
> +#define feholdexcept(e) __feholdexcept_int(e)
> +#define fesetenv(e) __fesetenv_int(e)
> +#define feupdateenv(e) __feupdateenv_int(e)
>
> __fenv_static inline int
> __feclearexcept_int(int __excepts)
> @@ -96,7 +117,7 @@ __feclearexcept_int(int __excepts)
> }
>
> __fenv_static inline int
> -fegetexceptflag(fexcept_t *__flagp, int __excepts)
> +__fegetexceptflag_int(fexcept_t *__flagp, int __excepts)
> {
> fexcept_t __r;
>
> @@ -106,7 +127,7 @@ fegetexceptflag(fexcept_t *__flagp, int __excepts)
> }
>
> __fenv_static inline int
> -fesetexceptflag(const fexcept_t *__flagp, int __excepts)
> +__fesetexceptflag_int(const fexcept_t *__flagp, int __excepts)
> {
> fexcept_t __r;
>
> @@ -118,7 +139,7 @@ fesetexceptflag(const fexcept_t *__flagp, int __excepts)
> }
>
> __fenv_static inline int
> -feraiseexcept(int __excepts)
> +__feraiseexcept_int(int __excepts)
> {
> fexcept_t __r;
>
> @@ -129,7 +150,7 @@ feraiseexcept(int __excepts)
> }
>
> __fenv_static inline int
> -fetestexcept(int __excepts)
> +__fetestexcept_int(int __excepts)
> {
> fexcept_t __r;
>
> @@ -138,7 +159,7 @@ fetestexcept(int __excepts)
> }
>
> __fenv_static inline int
> -fegetround(void)
> +__fegetround_int(void)
> {
> fenv_t __r;
>
> @@ -147,7 +168,7 @@ fegetround(void)
> }
>
> __fenv_static inline int
> -fesetround(int __round)
> +__fesetround_int(int __round)
> {
> fenv_t __r;
>
> @@ -161,7 +182,7 @@ fesetround(int __round)
> }
>
> __fenv_static inline int
> -fegetenv(fenv_t *__envp)
> +__fegetenv_int(fenv_t *__envp)
> {
> __uint64_t fpcr;
> __uint64_t fpsr;
> @@ -174,7 +195,7 @@ fegetenv(fenv_t *__envp)
> }
>
> __fenv_static inline int
> -feholdexcept(fenv_t *__envp)
> +__feholdexcept_int(fenv_t *__envp)
> {
> fenv_t __r;
>
> @@ -191,7 +212,7 @@ feholdexcept(fenv_t *__envp)
> }
>
> __fenv_static inline int
> -fesetenv(const fenv_t *__envp)
> +__fesetenv_int(const fenv_t *__envp)
> {
>
> __msr_fpcr((*__envp) >> 32);
> @@ -200,7 +221,7 @@ fesetenv(const fenv_t *__envp)
> }
>
> __fenv_static inline int
> -feupdateenv(const fenv_t *__envp)
> +__feupdateenv_int(const fenv_t *__envp)
> {
> fexcept_t __r;
>
>

--
Sincerely,
Dima (fluffy@FreeBSD.org, https://t.me/FluffyBSD, @fluffy:matrix-dev.freebsd.org)
(desktop, kde, x11, office, ports-secteam)@FreeBSD team