I always say it sucks to reply to myself but I keep doing it. These lines are from src/mingw/mingwex/pformat.c : #ifdef _WIN32 /* TODO: make this unconditional in final release... * (see note at head of associated `#else' block. */ #include "gdtoa.h"
static char *__pformat_cvt( int mode, __pformat_fpreg_t x, int nd, int *dp, int *sign ) Changing the #ifdef so the "other" implementation is picked makes the example program work. This looks like an upstream mingw bug to me. Danny On Wed, 2009-05-13 at 21:04 +0200, Danny Backx wrote: > Help ! :-) > > I'm not convinced that alignment by the compiler is the issue. Test > program attached. This produces output such as this : > Addr of __local_argv is 2613F9C4 > 2613F9B0 DC 12 01 00 44 90 01 00 00 00 00 00 FB FF FF FF > 2613F9C0 FF 00 00 00 30 00 14 26 C0 F9 13 26 0C 00 00 00 > 2613F9D0 14 FA 13 26 F0 F9 13 26 AC 10 01 00 D4 10 01 00 > 2613F9E0 00 90 01 00 EF BE AD DE 18 2D 44 54 FB 21 09 40 > 2613F9F0 44 00 00 00 90 00 14 00 01 00 00 00 18 2D 44 54 > __local_argv is 26140030 > 26140020 00 00 00 00 5C E4 C0 83 00 00 00 00 00 00 00 00 > 26140030 38 01 14 26 30 00 14 26 A0 0F 00 00 78 01 14 26 > 26140040 00 00 14 26 00 00 00 00 00 00 00 00 00 00 00 00 > 26140050 00 00 00 00 00 00 00 00 10 00 00 00 30 00 14 26 > Foo DEADBEEF 0.000000 68 > > Note that 0xdeadbeef is at 0x2613f9e4, the float value is right behind > it. I've assigned M_PI to it so it comes out as garbage above, when > assigning 0.0 you can observe all 00 bytes on addresses 0x2613f9e8..ef. > > This is nicely aligned on an 8 byte boundary, as it should. > > I think the debug session below proves that the value of M_PI still > shows up in __pformat_float, but not in __pformat_cvt . > > Does anyone have a clue ? > > Danny > > > > > > pavilion: {472} arm-mingw32ce-gdb stack.exe > GNU gdb 6.8 > Copyright (C) 2008 Free Software Foundation, Inc. > License GPLv3+: GNU GPL version 3 or later > <http://gnu.org/licenses/gpl.html> > This is free software: you are free to change and redistribute it. > There is NO WARRANTY, to the extent permitted by law. Type "show > copying" > and "show warranty" for details. > This GDB was configured as "--host=i686-pc-linux-gnu > --target=arm-mingw32ce"... > (gdb) target remote ipaq:9999 > Remote debugging using ipaq:9999 > [New Thread -470998174] > Error while mapping shared library sections: > coredll.dll.0409.mui: No such file or directory. > Error while mapping shared library sections: > coredll.dll: No such file or directory. > Symbol file not found for coredll.dll.0409.mui > Symbol file not found for coredll.dll > WinMainCRTStartup (hInst=0xe7c8cdc6, hPrevInst=0x0, > lpCmdLine=0x2613fed8, nCmdShow=5) > > at /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/crt3.c:35 > 35 { > (gdb) l __mingw_pformat > 1787 } > 1788 } > 1789 } > 1790 > 1791 int __pformat( int flags, void *dest, int max, const char *fmt, > va_list argv ) > 1792 { > 1793 int c; > 1794 > 1795 __pformat_t stream = > 1796 { > (gdb) break 2085 > Breakpoint 1 at 0x12e80: > file > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c, > line 2085. > (gdb) c > Continuing. > > Breakpoint 1, __mingw_pformat (flags=<value optimized out>, dest=<value > optimized out>, > max=<value optimized out>, fmt=0x1900b " %d\n", argv=<value > optimized out>) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c:2089 > 2089 __pformat_float( va_arg( argv, long double ), > &stream ); > (gdb) p stream.flags > $1 = 12320 > (gdb) p argv > $2 = <value optimized out> > (gdb) p stream > $3 = {dest = 0x140100, flags = 12320, width = -1, precision = -1, count > = 13, quota = 0, > expmin = 3} > (gdb) s > __pformat_float (x=3.1415926535897931, stream=0x2613f950) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c:1232 > 1232 if( stream->precision < 0 ) > (gdb) l > 1227 int sign, intlen; char *value; > 1228 > 1229 /* Establish the precision for the displayed value, defaulting > to six > 1230 * digits following the decimal point, if not explicitly > specified. > 1231 */ > 1232 if( stream->precision < 0 ) > 1233 stream->precision = 6; > 1234 > 1235 /* Encode the input value as ASCII, for display... > 1236 */ > (gdb) s > 1220 { > (gdb) s > 1232 if( stream->precision < 0 ) > (gdb) s > 1233 stream->precision = 6; > (gdb) s > 808 return __pformat_cvt( 3, z, precision, dp, sign ); > (gdb) p z > No symbol "z" in current context. > (gdb) bt > #0 __pformat_float (x=3.1415926535897931, stream=0x2613f950) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c:808 > #1 0x00012e8c in __mingw_pformat (flags=<value optimized out>, > dest=<value optimized out>, > max=<value optimized out>, fmt=0x1900b " %d\n", argv=<value > optimized out>) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c:2089 > #2 0x00011864 in __mingw_vprintf (fmt=0x19000 "Foo %08X %f %d\n", > argv=0x2613f9e4) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/vprintf.c:61 > #3 0x000112a8 in my_printf (__format=0x44 <Address 0x44 out of bounds>) > at stack.c:41 > #4 0x000110ac in main (argc=1, argv=0x140090) at stack.c:51 > (gdb) s > 807 __pformat_fpreg_t z; z.__pformat_fpreg_ldouble_t = x; > (gdb) s > 1220 { > (gdb) s > 808 return __pformat_cvt( 3, z, precision, dp, sign ); > (gdb) p z > No symbol "z" in current context. > (gdb) s > __pformat_cvt (mode=3, x= > {__pformat_fpreg_double_t = 1.3047604810952043e-313, > __pformat_fpreg_ldouble_t = 1.3047604810952043e-313, > {__pformat_fpreg_mantissa = 26408646140, __pformat_fpreg_exponent = > -1736}, __pformat_fpreg_bitmap = {62972, 9747, 6, 0, 63800}, > __pformat_fpreg_bits = 638842364}, nd=1413754136, > dp=0x400921fb, sign=0x50001) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c:740 > 740 { > (gdb) s > 750 if( (k = __fpclassifyl( x.__pformat_fpreg_ldouble_t )) & > FP_NAN ) > (gdb) bt > #0 __pformat_cvt (mode=3, x= > {__pformat_fpreg_double_t = 1.3047604810952043e-313, > __pformat_fpreg_ldouble_t = 1.3047604810952043e-313, > {__pformat_fpreg_mantissa = 26408646140, __pformat_fpreg_exponent = > -1736}, __pformat_fpreg_bitmap = {62972, 9747, 6, 0, 63800}, > __pformat_fpreg_bits = 638842364}, nd=1413754136, > dp=0x400921fb, sign=0x50001) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c:750 > #1 0x00012210 in __pformat_float (x=<value optimized out>, > stream=0x2613f950) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c:808 > #2 0x00012e8c in __mingw_pformat (flags=<value optimized out>, > dest=<value optimized out>, > max=<value optimized out>, fmt=0x1900b " %d\n", argv=<value > optimized out>) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/pformat.c:2089 > #3 0x00011864 in __mingw_vprintf (fmt=0x19000 "Foo %08X %f %d\n", > argv=0x2613f9e4) > > at > /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/mingwex/stdio/vprintf.c:61 > #4 0x000112a8 in my_printf (__format=0x44 <Address 0x44 out of bounds>) > at stack.c:41 > #5 0x000110ac in main (argc=1, argv=0x140090) at stack.c:51 > (gdb) > > > On Tue, 2009-04-21 at 21:31 +0200, Danny Backx wrote: > > I don't think it's a printf issue. > > > > The statement > > fprintf(f, "foo %d %f %d\n", 34, 12.0, 67); > > > > prints > > foo 34 0.000000 1076363264 > > > > so I'm inclined to think that the varargs handling is off after a %f. > > Don't know what could cause this though. > > > > Does anyone have a clue ? > > > > Danny > > > > > > > > On Mon, 2009-04-20 at 22:54 +0000, Pierre Ynard wrote: > > > > > > > > > > But it works well if you leave out the -D__USE_MINGW_ANSI_STDIO=1 flag. > > > > > > > > So why are you trying to do this ? > > > > > > Without this flag, this program is dynamically linked against MSVCRT > > > *printf > > > functions, and those present a number of bugs, shortcomings (like, no > > > support > > > of %z modifiers) and weird, non-compliant behaviors (wrong return value, > > > etc...), > > > that we cannot fix. So the %f may work then, but a lot of other things > > > (not > > > shown in this test program) break. > > > > > > We tried patching the format string on the fly, but that's too much of a > > > mess, > > > or reimplementing compliant *printf functions, but mingw does just that > > > for us. > > > There is just this %f bug on WinCE. > > > -- Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info ------------------------------------------------------------------------------ The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your production scanning environment may not be a perfect world - but thanks to Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700 Series Scanner you'll get full speed at 300 dpi even with all image processing features enabled. http://p.sf.net/sfu/kodak-com _______________________________________________ Cegcc-devel mailing list Cegcc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/cegcc-devel