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
[email protected]
https://lists.sourceforge.net/lists/listinfo/cegcc-devel