[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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.