[PATCH/QUESTION] newlib: fenv: AArch64 Cygwin linking fixes
Radek Barton via Cygwin-patches <[email protected]>
| Newsgroups | gmane.os.cygwin.patches,gmane.comp.lib.newlib |
|---|---|
| Message-ID | <DB9PR83MB09238FEE2C43E3FAC44FA5A29245A@DB9PR83MB0923.EURPRD83.prod.outlook.com> |
Hello. Thank you for your insights. The ``` diff --git a/newlib/libm/machine/aarch64/fenv.c b/newlib/libm/machine/aarch64/fenv.c index 3ffe23441..fb6a67dcc 100644 --- a/newlib/libm/machine/aarch64/fenv.c +++ b/newlib/libm/machine/aarch64/fenv.c @@ -27,6 +27,9 @@ * $FreeBSD$ */ +/* Enable all fenv-related functions. */ +#define __BSD_VISIBLE + #define __fenv_static #include <fenv.h> #include <machine/fenv-fp.h> ``` patch has no effect because `__BSD_VISIBLE` is already set to `1` in `newlib/libc/include/sys/features.h`. I don't know what is the semantics of this macro but I added it to my patch just to make the code consistent with `newlib/libc/machine/mips/machine/fenv-fp.h` because it seems that this file is solving the same problem. I've checked that for every object of Cygwin build, only the `newlib/libc/machine/aarch64/sys/fenv.h` gets included and the `newlib/libc/include/sys/fenv.h` header is never included. I am attaching the pre-processed `fenv.c`. Radek
fenv-preprocessed.c
(text/plain, 12.9 KB)
# 0 "../../../code/cygwin/newlib/libm/machine/aarch64/fenv.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "../../../code/cygwin/newlib/libm/machine/aarch64/fenv.c"
# 31 "../../../code/cygwin/newlib/libm/machine/aarch64/fenv.c"
# 1 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/fenv.h" 1 3 4
# 15 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/fenv.h" 3 4
# 1 "/home/blackhex/mingw-woarm64-build/build-aarch64/aarch64-pc-cygwin/newlib/targ-include/sys/fenv.h" 1 3 4
# 32 "/home/blackhex/mingw-woarm64-build/build-aarch64/aarch64-pc-cygwin/newlib/targ-include/sys/fenv.h" 3 4
# 1 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 1 3 4
# 24 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
# 1 "/home/blackhex/cross-aarch64-pc-cygwin-msvcrt/lib/gcc/aarch64-pc-cygwin/15/include/stddef.h" 1 3 4
# 214 "/home/blackhex/cross-aarch64-pc-cygwin-msvcrt/lib/gcc/aarch64-pc-cygwin/15/include/stddef.h" 3 4
# 214 "/home/blackhex/cross-aarch64-pc-cygwin-msvcrt/lib/gcc/aarch64-pc-cygwin/15/include/stddef.h" 3 4
typedef long unsigned int size_t;
# 359 "/home/blackhex/cross-aarch64-pc-cygwin-msvcrt/lib/gcc/aarch64-pc-cygwin/15/include/stddef.h" 3 4
typedef unsigned int wint_t;
# 25 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 2 3 4
# 1 "./newlib.h" 1 3 4
# 10 "./newlib.h" 3 4
# 1 "./_newlib_version.h" 1 3 4
# 11 "./newlib.h" 2 3 4
# 26 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 2 3 4
# 1 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/config.h" 1 3 4
# 1 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/ieeefp.h" 1 3 4
# 5 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/config.h" 2 3 4
# 1 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/features.h" 1 3 4
# 6 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/config.h" 2 3 4
# 238 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/config.h" 3 4
# 1 "/home/blackhex/mingw-woarm64-build/code/cygwin/winsup/cygwin/include/cygwin/config.h" 1 3 4
# 35 "/home/blackhex/mingw-woarm64-build/code/cygwin/winsup/cygwin/include/cygwin/config.h" 3 4
__attribute__((__gnu_inline__))
extern inline struct _reent *__getreent (void)
{
register char *ret;
__asm __volatile__ ("ldr %0, [x18, #0x8]" : "=r" (ret));
return (struct _reent *) (ret - 12800);
}
# 239 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/config.h" 2 3 4
# 27 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 2 3 4
# 1 "/home/blackhex/mingw-woarm64-build/code/cygwin/winsup/cygwin/include/machine/_types.h" 1 3 4
# 1 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 1 3 4
# 41 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
# 55 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef short int __int16_t;
typedef short unsigned int __uint16_t;
# 77 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef int __int32_t;
typedef unsigned int __uint32_t;
# 103 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef long int __int64_t;
typedef long unsigned int __uint64_t;
# 134 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef signed char __int_least8_t;
typedef unsigned char __uint_least8_t;
# 160 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef short int __int_least16_t;
typedef short unsigned int __uint_least16_t;
# 182 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef int __int_least32_t;
typedef unsigned int __uint_least32_t;
# 200 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef long int __int_least64_t;
typedef long unsigned int __uint_least64_t;
# 214 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef long int __intmax_t;
typedef long unsigned int __uintmax_t;
typedef long int __intptr_t;
typedef long unsigned int __uintptr_t;
# 7 "/home/blackhex/mingw-woarm64-build/code/cygwin/winsup/cygwin/include/machine/_types.h" 2 3 4
typedef __int64_t __blkcnt_t;
typedef __int32_t __blksize_t;
typedef __uint32_t __dev_t;
typedef unsigned long __fsblkcnt_t;
typedef unsigned long __fsfilcnt_t;
typedef __uint32_t __uid_t;
typedef __uint32_t __gid_t;
typedef __uint64_t __ino_t;
typedef long long __key_t;
typedef __uint16_t __sa_family_t;
typedef int __socklen_t;
# 28 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 2 3 4
# 46 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef long _off_t;
typedef int __pid_t;
# 67 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef __uint32_t __id_t;
# 90 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef __uint32_t __mode_t;
__extension__ typedef long long _off64_t;
typedef _off_t __off_t;
typedef _off64_t __loff_t;
# 116 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef long _fpos_t;
# 131 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef long unsigned int __size_t;
# 147 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef long signed int _ssize_t;
# 158 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef _ssize_t __ssize_t;
typedef struct
{
int __count;
union
{
wint_t __wch;
unsigned char __wchb[4];
} __value;
} _mbstate_t;
typedef void *_iconv_t;
typedef unsigned long __clock_t;
typedef long __time_t;
typedef unsigned long __clockid_t;
typedef long __daddr_t;
typedef unsigned long __timer_t;
# 212 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef int __nl_item;
typedef unsigned short __nlink_t;
typedef long __suseconds_t;
typedef unsigned long __useconds_t;
typedef __builtin_va_list __va_list;
# 33 "/home/blackhex/mingw-woarm64-build/build-aarch64/aarch64-pc-cygwin/newlib/targ-include/sys/fenv.h" 2 3 4
typedef __uint64_t fenv_t;
typedef __uint64_t fexcept_t;
# 67 "/home/blackhex/mingw-woarm64-build/build-aarch64/aarch64-pc-cygwin/newlib/targ-include/sys/fenv.h" 3 4
extern const fenv_t *_fe_dfl_env;
# 85 "/home/blackhex/mingw-woarm64-build/build-aarch64/aarch64-pc-cygwin/newlib/targ-include/sys/fenv.h" 3 4
static inline int
feenableexcept(int __mask)
{
fenv_t __old_r, __new_r;
__asm __volatile("mrs %0, fpcr" : "=r" (__old_r));
__new_r = __old_r | ((__mask & (0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008)) << 8);
__asm __volatile("msr fpcr, %0" : : "r" (__new_r));
return ((__old_r >> 8) & (0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008));
}
static inline int
fedisableexcept(int __mask)
{
fenv_t __old_r, __new_r;
__asm __volatile("mrs %0, fpcr" : "=r" (__old_r));
__new_r = __old_r & ~((__mask & (0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008)) << 8);
__asm __volatile("msr fpcr, %0" : : "r" (__new_r));
return ((__old_r >> 8) & (0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008));
}
static inline int
fegetexcept(void)
{
fenv_t __r;
__asm __volatile("mrs %0, fpcr" : "=r" (__r));
return ((__r & ((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) << 8)) >> 8);
}
# 16 "/home/blackhex/mingw-woarm64-build/code/cygwin/newlib/libc/include/fenv.h" 2 3 4
int feclearexcept(int excepts);
int fegetexceptflag(fexcept_t *flagp, int excepts);
int feraiseexcept(int excepts);
int fesetexceptflag(const fexcept_t *flagp, int excepts);
int fetestexcept(int excepts);
int fegetround(void);
int fesetround(int rounding_mode);
int fegetenv(fenv_t *envp);
int feholdexcept(fenv_t *envp);
int fesetenv(const fenv_t *envp);
int feupdateenv(const fenv_t *envp);
# 32 "../../../code/cygwin/newlib/libm/machine/aarch64/fenv.c" 2
# 1 "/home/blackhex/mingw-woarm64-build/build-aarch64/aarch64-pc-cygwin/newlib/targ-include/machine/fenv-fp.h" 1 3 4
# 30 "/home/blackhex/mingw-woarm64-build/build-aarch64/aarch64-pc-cygwin/newlib/targ-include/machine/fenv-fp.h" 3 4
__inline int
feclearexcept(int __excepts)
{
fexcept_t __r;
__asm __volatile("mrs %0, fpsr" : "=r" (__r));
__r &= ~__excepts;
__asm __volatile("msr fpsr, %0" : : "r" (__r));
return (0);
}
inline int
fegetexceptflag(fexcept_t *__flagp, int __excepts)
{
fexcept_t __r;
__asm __volatile("mrs %0, fpsr" : "=r" (__r));
*__flagp = __r & __excepts;
return (0);
}
inline int
fesetexceptflag(const fexcept_t *__flagp, int __excepts)
{
fexcept_t __r;
__asm __volatile("mrs %0, fpsr" : "=r" (__r));
__r &= ~__excepts;
__r |= *__flagp & __excepts;
__asm __volatile("msr fpsr, %0" : : "r" (__r));
return (0);
}
inline int
feraiseexcept(int __excepts)
{
fexcept_t __r;
__asm __volatile("mrs %0, fpsr" : "=r" (__r));
__r |= __excepts;
__asm __volatile("msr fpsr, %0" : : "r" (__r));
return (0);
}
inline int
fetestexcept(int __excepts)
{
fexcept_t __r;
__asm __volatile("mrs %0, fpsr" : "=r" (__r));
return (__r & __excepts);
}
inline int
fegetround(void)
{
fenv_t __r;
__asm __volatile("mrs %0, fpcr" : "=r" (__r));
return ((__r >> 22) & (0x0 | 0x2 | 0x1 | 0x3));
}
inline int
fesetround(int __round)
{
fenv_t __r;
if (__round & ~(0x0 | 0x2 | 0x1 | 0x3))
return (-1);
__asm __volatile("mrs %0, fpcr" : "=r" (__r));
__r &= ~((0x0 | 0x2 | 0x1 | 0x3) << 22);
__r |= __round << 22;
__asm __volatile("msr fpcr, %0" : : "r" (__r));
return (0);
}
inline int
fegetenv(fenv_t *__envp)
{
fenv_t __r;
__asm __volatile("mrs %0, fpcr" : "=r" (__r));
*__envp = __r & ((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) << 8);
__asm __volatile("mrs %0, fpsr" : "=r" (__r));
*__envp |= __r & ((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) | ((0x0 | 0x2 | 0x1 | 0x3) << 22));
return (0);
}
inline int
feholdexcept(fenv_t *__envp)
{
fenv_t __r;
__asm __volatile("mrs %0, fpcr" : "=r" (__r));
*__envp = __r & ((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) << 8);
__r &= ~(((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) << 8));
__asm __volatile("msr fpcr, %0" : : "r" (__r));
__asm __volatile("mrs %0, fpsr" : "=r" (__r));
*__envp |= __r & ((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) | ((0x0 | 0x2 | 0x1 | 0x3) << 22));
__r &= ~(((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) << 8));
__asm __volatile("msr fpsr, %0" : : "r" (__r));
return (0);
}
inline int
fesetenv(const fenv_t *__envp)
{
__asm __volatile("msr fpcr, %0" : : "r" ((*__envp) & ((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) << 8)));
__asm __volatile("msr fpsr, %0" : : "r" ((*__envp) & ((0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008) | ((0x0 | 0x2 | 0x1 | 0x3) << 22))));
return (0);
}
inline int
feupdateenv(const fenv_t *__envp)
{
fexcept_t __r;
__asm __volatile("mrs %0, fpsr" : "=r" (__r));
fesetenv(__envp);
feraiseexcept(__r & (0x00000002 | 0x00000010 | 0x00000001 | 0x00000004 | 0x00000008));
return (0);
}
# 33 "../../../code/cygwin/newlib/libm/machine/aarch64/fenv.c" 2
# 44 "../../../code/cygwin/newlib/libm/machine/aarch64/fenv.c"
# 44 "../../../code/cygwin/newlib/libm/machine/aarch64/fenv.c"
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);
extern inline int feenableexcept(int __mask);
extern inline int fedisableexcept(int __mask);
extern inline int fegetexcept(void);