Re: final i386.floating.record.patch

paawan oza
2009-08-17T16:10:51Z

Hi Hui,

I test the same and it seems working fine. Another thing I observe is, vertual memory is low problem and may be gdb's virtual address space gets exhausted or any other limit! highly unlikely though.

please see the atached log.

linux-p94d:/home/oza/mk_patch/take_diff/gdb_current/gdb-6.8.50.20090803/gdb # ./gdb ./test_floats
GNU gdb (GDB) 6.8.50.20090803
Copyright (C) 2009 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 "i686-pc-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Setting up the environment for debugging gdb.
Function "internal_error" not defined.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
Function "info_command" not defined.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
/home/oza/mk_patch/take_diff/gdb_current/gdb-6.8.50.20090803/gdb/.gdbinit:8: Error in sourced command file:
No breakpoint number 0.
(gdb) start
Temporary breakpoint 1 at 0x8048c94: file ./test_floats.c, line 196.
Starting program: /home/oza/mk_patch/take_diff/gdb_current/gdb-6.8.50.20090803/gdb/test_floats

Temporary breakpoint 1, main () at ./test_floats.c:196
196 init_floats();
(gdb) record
(gdb) c
Continuing.
result is 369.438751
result is 10.320001
result is 23.008301
result is 0.000000
result is 10.450000
result is 10.776012
result is 495830.968750
result is -181.778748
result is 12.525923
result is 2.195619
result is 5.055601
result is inf
result is inf
result is -0.988032
result is 0.154251
result is -6.405331
result is 1.537475
The next instruction is syscall exit_group. It will make the program exit. Do you want to stop the program?([y] or n) y
Process record: inferior program stopped.

Program received signal SIGTRAP, Trace/breakpoint trap.
0xffffe405 in __kernel_vsyscall ()
(gdb)

Regards,
Oza.

--- On Mon, 8/17/09, Hui Zhu <teawater@gmail.com> wrote:

> From: Hui Zhu <teawater@gmail.com>
> Subject: Re: final i386.floating.record.patch
> To: "Michael Snyder" <msnyder@vmware.com>
> Cc: "paawan oza" <paawan1982@yahoo.com>, "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>, "Mark Kettenis" <mark.kettenis@xs4all.nl>
> Date: Monday, August 17, 2009, 12:06 PM
> Get some error with this patch.
> cat fp.c
> #include <stdio.h>
> #include <math.h>
> #include <stdlib.h>
>
> /* the test intends to test following insns.
> flds faddp fstps fstpl fldl fxch fabs fdivrp fmulp fsubrp
> fucomp fnstsw fsqrt
> fchs f2xm1 fyl2x fxtract fprem1 fld fdecstp fld1 fldl2t
> fldl2e FLDPI
> FLDLG2 FLDLN2
> FLDZ fincstp ffree fptan fpatan fincstp fsincos frndint
> fscale fsin fcos fcmovb
> fcmovbe fcmove fcmovu fcmovnb fcmovnbe fsave frstor fstsw
> */
>
> float no1,no2,no3,no4,no5,no6,no7;
> double x = 100.345, y = 25.7789;
> long double ldx = 88888888888888888888.88, ldy =
> 9999999999999999999.99;
> float result,resultd,resultld;
> float *float_memory;
>
> /* initialization of floats */
> void init_floats()
> {
> no1 = 10.45;
> no2 = 20.77;
> no3 = 156.89874646;
> no4 = 14.56;
> no5 = 11.11;
> no6 = 66.77;
> no7 = 88.88;
> float_memory = malloc(sizeof(float) * 4);
> *float_memory = 256.256;
> *(float_memory + 1) = 356.356;
> *(float_memory + 2) = 456.456;
> *(float_memory + 3) = 556.556;
> }
>
> /* marks FPU stack as empty */
> void empty_fpu_stack()
> {
> asm ("ffree %st(1) \n\t"
>       "ffree %st(2) \n\t"
>       "ffree %st(3) \n\t"
>       "ffree %st(4) \n\t"
>       "ffree %st(5) \n\t"
>       "ffree %st(6) \n\t"
>       "ffree %st(7)");
> }
>
> /* tests floating point arithmatic */
> void test_arith_floats()
> {
> result = no1 + no2 + no3 + no4 + no5 + no6 + no7;
> printf("result is %f\n",result);
>
> result = fmodf(no2,no1);
> printf("result is %f\n",result);
>
> resultd = fmod(x,y);
> printf("result is %f\n",resultd);
>
> resultld = fmodl(ldy,ldy);
> printf("result is %f\n",resultld);
>
> result = fabsf(no1);
> printf("result is %f\n",result);
>
> result = no3 / no4;
> printf("result is %f\n",result);
>
> result = no1 * no2 * no3 * no4;
> printf("result is %f\n",result);
>
> result = no1 - no2 - no3 - no4;
> printf("result is %f\n",result);
>
>
> asm ("fld %0" : :"m"(*float_memory));
> asm ("fchs");
>
> /* test for f2xm1 */
> asm ("fld %0" : :"m"(*float_memory));
> asm ("f2xm1");
>
> asm ("fyl2x");
>
> asm ("fld %0" : :"m"(*float_memory));
> asm ("fxtract");
>
> asm ("fld %0" : :"m"(*float_memory));
> asm ("fprem1");
>
> /* decrement fpu stack pointer only status register should
> get affected */
> asm ("fld %0" : :"m"(*float_memory));
>
> empty_fpu_stack();
>
> asm ("fld1");
> asm ("fldl2t");
> asm ("fldl2e");
> asm ("fldpi");
> asm ("fldlg2");
> asm ("fldln2");
> asm ("fldz");
>
> empty_fpu_stack();
> /* finishing emptying the stack */
>
> result = sqrt(no3);
> printf("result is %f\n",result);
> }
>
> void test_log_exp_floats()
> {
> result = log10(no3);
> printf("result is %f\n",result);
>
> result = log(no3);
> printf("result is %f\n",result);
>
> result = exp10(no3);
> printf("result is %f\n",result);
>
> result = exp(no3);
> printf("result is %f\n",result);
> }
>
> void test_trigo_floats()
> {
> result = sin(30);
> printf("result is %f\n",result);
>
> result = cos(30);
> printf("result is %f\n",result);
>
> result = tan(30);
> printf("result is %f\n",result);
>
> result = atan(30);
> printf("result is %f\n",result);
>
> asm ("fld %0" : :"m"(*float_memory));
> asm ("fptan");
>
> /* changes st1 and popping register stack */
> asm ("fpatan");
>
> asm("fincstp");
> asm ("fld %0" : :"m"(float_memory));
> asm ("fsincos");
>
> asm ("fld %0" : :"m"(*float_memory));
> asm ("frndint");
>
> asm ("fld %0" : :"m"(*float_memory));
> asm ("fld %0" : :"m"(*(float_memory+1)));
> asm ("fscale");
>
> empty_fpu_stack();
>
> asm ("fld %0" : :"m"(*float_memory));
> asm ("fsin");
> asm ("fcos");
>
> /* currently we assume condition likely and always record
> the registers
> code could be optimized only if the flag is set then
> record */
> asm ("fld %0" : :"m"(*float_memory));
> asm ("fld %0" : :"m"(*(float_memory+1)));
> asm ("fcmovb %st(1), %st");
> asm ("fcmovbe %st(1), %st");
> asm ("fcmove %st(1), %st");
> asm ("fcmovu %st(1), %st");
> asm ("fcmovnb %st(1), %st");
> asm ("fcmovnbe %st(1), %st");
>
> empty_fpu_stack();
> /* finished emtyping the stack */
> }
>
> void test_compare_floats()
> {
>    ldy = 88888888888888888888.88;
>    if (ldx == ldy)
>      ldy =
> 7777777777777777777777777777.777;
>    else
>      ldy =
> 666666666666666666666666666.666;
> }
>
> /* test loading and saving of FPU environment */
> void test_fpu_env()
> {
> asm ("fsave %0" : "=m"(*float_memory) : );
> asm ("frstor %0" : : "m"(*float_memory));
> asm ("fstsw %ax");
> }
>
> int main()
> {
>    init_floats();
>    test_arith_floats();
>    test_log_exp_floats();
>    test_trigo_floats();
>    test_compare_floats();
>    test_fpu_env();
> }
>
>
>
> ./gdb ./a.out
> GNU gdb (GDB) 6.8.50.20090817-cvs
> Copyright (C) 2009 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 "i686-pc-linux-gnu".
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>...
> Setting up the environment for debugging gdb.
> Function "internal_error" not defined.
> Make breakpoint pending on future shared library load? (y
> or [n])
> [answered N; input not from terminal]
> Function "info_command" not defined.
> Make breakpoint pending on future shared library load? (y
> or [n])
> [answered N; input not from terminal]
> /home/teawater/gdb/bgdbno/gdb/.gdbinit:8: Error in sourced
> command file:
> No breakpoint number 0.
> (gdb) start
> During symbol reading, DW_AT_name missing from
> DW_TAG_base_type.
> Temporary breakpoint 1 at 0x8048c74: file fp.c, line 196.
> Starting program: /home/teawater/gdb/bgdbno/gdb/a.out
>
> Temporary breakpoint 1, main () at fp.c:196
> 196       init_floats();
> (gdb) record
> (gdb) c
> Continuing.
> ../../src/gdb/utils.c:1200: internal-error: virtual memory
> exhausted.
> A problem internal to GDB has been detected,
> further debugging may prove unreliable.
> Quit this debugging session? (y or n) n
> ../../src/gdb/utils.c:1200: internal-error: virtual memory
> exhausted.
> A problem internal to GDB has been detected,
> further debugging may prove unreliable.
> Create a core file of GDB? (y or n) n
>
> Program received signal SIGTRAP, Trace/breakpoint trap.
> 0xb7eba9bc in memcpy () from /lib/tls/i686/cmov/libc.so.6
> (gdb) quit
> A debugging session is active.
>
>     Inferior 1 [process 15657] will be
> killed.
>
> Quit anyway? (y or n) y
>
>
> Thanks,
> Hui
>
> On Mon, Aug 17, 2009 at 05:16, Michael Snyder<msnyder@vmware.com>
> wrote:
> > paawan oza wrote:
> >>
> >> Hi Hui & Michael,
> >> Now we revert status registers also.
> >> please find the patch attached.
> >> I am sorry, if I am not pasting the patch in
> email-body due to tabs&spaces
> >> problem faced by Michael last time.
> >> Regards,
> >> Oza.
> >
> > Looking good!
> >
> > There were some conflicts between your changes and a
> check-in that
> > happened after your submission  --  I've taken the
> liberty of merging
> > your changes with the cvs head, fixing up the
> conflicts.  Hope you
> > don't mind  --  merged patch attached.
> >
> > I'll review your tests next.
> >
> > Can you write up a change log entry for this patch?
> >
> > Hui, Mark, any more comments?
> >
> > Cheers,
> > Michael
> >
> >
> >
> >
> >
>