cpp /usr/include/threads.h fails; modfl segfaults
Corinna Vinschen
corinna-cygwin@cygwin.com
Mon Aug 31 18:45:17 GMT 2020
On Aug 31 09:37, Brian Inglis wrote:
> On 2020-08-31 01:35, Corinna Vinschen wrote:
> > On Aug 30 14:39, Brian Inglis wrote:
> >> On 2020-08-30 07:00, Corinna Vinschen wrote:
> >>> On Aug 29 08:52, airplanemath via Cygwin wrote:
> >>>> I have two reports. A brief description of the system:
> >>>> $ uname -a | sed "s/${HOSTNAME}/\${HOSTNAME}/g"
> >>>> CYGWIN_NT-10.0 ${HOSTNAME} 3.1.7(0.340/5/3) 2020-08-22 17:48 x86_64 Cygwin
> >> ...
> >>>> $ cat test.c
> >>>> #include <math.h>
> >>>> #include <stdio.h>
> >>>> #include <stdlib.h>
> >>>>
> >>>> int main(int argc, char *argv[]) {
> >>>> long double a, b, c;
> >>>> char *num_end = NULL;
> >>>> a = b = c = 0.0L;
> >>>> if (argc != 2) {
> >>>> fprintf(stderr, "Usage: %s NUMBER\n", argv[0]);
> >>>> exit(1);
> >>>> }
> >>>> a = strtold(argv[1], &num_end);
> >>>> b = modfl(a, &c);
> >>>> printf("%Lf %Lf %Lf\n", a, b, c);
> >>>> return 0;
> >>>> }
> >>>
> >>> This is a bug in the assembler code taken from Mingw-w64. The bug has
> >>> been fixed upstream, so I just pulled in the upstream fixes.
> >>
> >> The 64 bit fix doesn't pop eax but *now* flags eax as clobbered, whereas the 32
> >> bit fix both pops and *now* flags eax as clobbered, which it really doesn't need
> >> to do. Is this inconsistent treatment correct?
> >
> > You may be right that this is not necessary on i686, but it doesn't
> > hurt either and I'd like to stick to the upstream code if possible.
>
> The upstream patch changed only amd64/x86_64 code sequences for multiple modules
> including modfl, and left i386/x86 untouched for those modules.
$ git remote -v
origin https://git.code.sourceforge.net/p/mingw-w64/mingw-w64 (fetch)
origin https://git.code.sourceforge.net/p/mingw-w64/mingw-w64 (push)
$ git st
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
$ $ git log --oneline -2 -- mingw-w64-crt/math/modfl.c
fac3a8a6e4ca crt: Add "volatile" to all inline assembly snippets under math
9a2479858b3b mingw-w64-crt/math/modf{,f,l}.c: Fix segment faults in modf(), modff() and modfl().
$ git show 9a2479858b3b
[...]
diff --git a/mingw-w64-crt/math/modfl.c b/mingw-w64-crt/math/modfl.c
index af75a8b8cf60..ef1ab16ce256 100644
--- a/mingw-w64-crt/math/modfl.c
+++ b/mingw-w64-crt/math/modfl.c
@@ -21,7 +21,7 @@ modfl (long double value, long double* iptr)
"fldcw (%%rsp)\n"
"frndint\n"
"fldcw 4(%%rsp)\n"
- "addq $8, %%rsp\n" : "=t" (int_part) : "0" (value)); /* round */
+ "addq $8, %%rsp\n" : "=t" (int_part) : "0" (value) : "eax"); /* round */
#elif defined(_X86_) || defined(__i386__)
asm ("push %%eax\n\tsubl $8, %%esp\n"
"fnstcw 4(%%esp)\n"
@@ -31,7 +31,7 @@ modfl (long double value, long double* iptr)
"fldcw (%%esp)\n"
"frndint\n"
"fldcw 4(%%esp)\n"
- "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value)); /* round */
+ "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value) : "eax"); /* round */
#else
int_part = truncl(value);
#endif
Corinna
--
Corinna Vinschen
Cygwin Maintainer
More information about the Cygwin
mailing list