Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFA] change to i386_process_record, with test
@ 2009-08-23  3:11 Michael Snyder
  2009-08-23  4:12 ` Hui Zhu
  0 siblings, 1 reply; 5+ messages in thread
From: Michael Snyder @ 2009-08-23  3:11 UTC (permalink / raw)
  To: Hui Zhu, gdb-patches

[-- Attachment #1: Type: text/plain, Size: 190 bytes --]

Hi Hui,

Would you please try this test on a 32 bit intel target?
I think it demonstrates the need for the attached change.
This also fixes four fails in machinestate.exp.

Thanks,
Michael


[-- Attachment #2: incdec.txt --]
[-- Type: text/plain, Size: 1990 bytes --]

2009-08-22  Michael Snyder  <msnyder@vmware.com>

	* i386-tdep.c (i386_process_record): Break out of prefix loop
	if not amd64.  Otherwise inc/dec instructions are lost.

Index: i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.283
diff -u -p -r1.283 i386-tdep.c
--- i386-tdep.c	10 Aug 2009 03:02:39 -0000	1.283
+++ i386-tdep.c	23 Aug 2009 02:55:10 -0000
@@ -3280,23 +3280,23 @@ i386_process_record (struct gdbarch *gdb
 	case 0x67:
 	  prefixes |= PREFIX_ADDR;
 	  break;
-        case 0x40:
-        case 0x41:
-        case 0x42:
-        case 0x43:
-        case 0x44:
-        case 0x45:
-        case 0x46:
-        case 0x47:
-        case 0x48:
-        case 0x49:
-        case 0x4a:
-        case 0x4b:
-        case 0x4c:
-        case 0x4d:
-        case 0x4e:
-        case 0x4f:
-          if (ir.regmap[X86_RECORD_R8_REGNUM])
+        case 0x40:	/* i386 inc %eax */
+        case 0x41:	/* i386 inc %ecx */
+        case 0x42:	/* i386 inc %edx */
+        case 0x43:	/* i386 inc %ebx */
+        case 0x44:	/* i386 inc %esp */
+        case 0x45:	/* i386 inc %ebp */
+        case 0x46:	/* i386 inc %esi */
+        case 0x47:	/* i386 inc %edi */
+        case 0x48:	/* i386 dec %eax */
+        case 0x49:	/* i386 dec %ecx */
+        case 0x4a:	/* i386 dec %edx */
+        case 0x4b:	/* i386 dec %ebx */
+        case 0x4c:	/* i386 dec %esp */
+        case 0x4d:	/* i386 dec %ebp */
+        case 0x4e:	/* i386 dec %esi */
+        case 0x4f:	/* i386 dec %edi */
+          if (ir.regmap[X86_RECORD_R8_REGNUM])	/* 64 bit target */
             {
                /* REX */
                rex = 1;
@@ -3305,6 +3305,8 @@ i386_process_record (struct gdbarch *gdb
                ir.rex_x = (tmpu8 & 0x2) << 2;
                ir.rex_b = (tmpu8 & 0x1) << 3;
             }
+	  else					/* 32 bit target */
+	    goto out_prefixes;
           break;
 	default:
 	  goto out_prefixes;

[-- Attachment #3: i386-reverse.c --]
[-- Type: text/x-csrc, Size: 1244 bytes --]

/* This testcase is part of GDB, the GNU debugger.

   Copyright 2009 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

/* Architecture tests for intel i386 platform.  */

void 
inc_dec_tests (void)
{
  asm ("inc %eax");
  asm ("inc %ecx");
  asm ("inc %edx");
  asm ("inc %ebx");
  asm ("inc %esp");
  asm ("inc %ebp");
  asm ("inc %esi");
  asm ("inc %edi");
  asm ("dec %eax");
  asm ("dec %ecx");
  asm ("dec %edx");
  asm ("dec %ebx");
  asm ("dec %esp");
  asm ("dec %ebp");
  asm ("dec %esi");
  asm ("dec %edi");
} /* end inc_dec_tests */

int 
main ()
{
  inc_dec_tests ();
  return 0;	/* end of main */
}

[-- Attachment #4: i386-reverse.exp --]
[-- Type: text/plain, Size: 8651 bytes --]

# Copyright 2009 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# This file is part of the gdb testsuite.

if $tracelevel {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

if ![istarget "i?86-*linux*"] then {
    verbose "Skipping i386 reverse tests."
    return
}

set testfile "i386-reverse"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# some targets have leading underscores on assembly symbols.
# TODO: detect this automatically
set additional_flags ""
if [istarget "i?86-*-cygwin*"] then {
  set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } {
    untested i386-reverse
    return -1
}

set end_of_main          [gdb_get_line_number " end of main "]
set end_of_inc_dec_tests [gdb_get_line_number " end inc_dec_tests "]

# Get things started.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
runto main

if [target_info exists gdb,use_precord] {
    # Activate process record/replay
    gdb_test "record" "" "Turn on process record"
    # FIXME: command ought to acknowledge, so we can test if it succeeded.
}

global hex
global decimal

gdb_test "step" "inc .eax.*" "step to inc eax 1st time"
send_gdb "info reg eax\n"
gdb_expect {
    -re "eax *($hex)\t.*$gdb_prompt " {
	set preinc_eax $expect_out(1,string)
    }
}

gdb_test "step" "inc .ecx.*" "step to inc ecx 1st time"
send_gdb "info reg ecx\n"
gdb_expect {
    -re "ecx *($hex)\t.*$gdb_prompt " {
	set preinc_ecx $expect_out(1,string)
    }
}

gdb_test "step" "inc .edx.*" "step to inc edx 1st time"
send_gdb "info reg edx\n"
gdb_expect {
    -re "edx *($hex)\t.*$gdb_prompt " {
	set preinc_edx $expect_out(1,string)
    }
}

gdb_test "step" "inc .ebx.*" "step to inc ebx 1st time"
send_gdb "info reg ebx\n"
gdb_expect {
    -re "ebx *($hex)\t.*$gdb_prompt " {
	set preinc_ebx $expect_out(1,string)
    }
}

gdb_test "step" "inc .esp.*" "step to inc esp 1st time"
send_gdb "info reg esp\n"
gdb_expect {
    -re "esp *($hex)\t.*$gdb_prompt " {
	set preinc_esp $expect_out(1,string)
    }
}

gdb_test "step" "inc .ebp.*" "step to inc ebp 1st time"
send_gdb "info reg ebp\n"
gdb_expect {
    -re "ebp *($hex)\t.*$gdb_prompt " {
	set preinc_ebp $expect_out(1,string)
    }
}

gdb_test "step" "inc .esi.*" "step to inc esi 1st time"
send_gdb "info reg esi\n"
gdb_expect {
    -re "esi *($hex)\t.*$gdb_prompt " {
	set preinc_esi $expect_out(1,string)
    }
}

gdb_test "step" "inc .edi.*" "step to inc edi 1st time"
send_gdb "info reg edi\n"
gdb_expect {
    -re "edi *($hex)\t.*$gdb_prompt " {
	set preinc_edi $expect_out(1,string)
    }
}

gdb_test "step" "dec .eax.*" "step to dec eax 1st time"
send_gdb "info reg eax\n"
gdb_expect {
    -re "eax *($hex)\t.*$gdb_prompt " {
	set predec_eax $expect_out(1,string)
    }
}

gdb_test "step" "dec .ecx.*" "step to dec ecx 1st time"
send_gdb "info reg ecx\n"
gdb_expect {
    -re "ecx *($hex)\t.*$gdb_prompt " {
	set predec_ecx $expect_out(1,string)
    }
}

gdb_test "step" "dec .edx.*" "step to dec edx 1st time"
send_gdb "info reg edx\n"
gdb_expect {
    -re "edx *($hex)\t.*$gdb_prompt " {
	set predec_edx $expect_out(1,string)
    }
}

gdb_test "step" "dec .ebx.*" "step to dec ebx 1st time"
send_gdb "info reg ebx\n"
gdb_expect {
    -re "ebx *($hex)\t.*$gdb_prompt " {
	set predec_ebx $expect_out(1,string)
    }
}

gdb_test "step" "dec .esp.*" "step to dec esp 1st time"
send_gdb "info reg esp\n"
gdb_expect {
    -re "esp *($hex)\t.*$gdb_prompt " {
	set predec_esp $expect_out(1,string)
    }
}

gdb_test "step" "dec .ebp.*" "step to dec ebp 1st time"
send_gdb "info reg ebp\n"
gdb_expect {
    -re "ebp *($hex)\t.*$gdb_prompt " {
	set predec_ebp $expect_out(1,string)
    }
}

gdb_test "step" "dec .esi.*" "step to dec esi 1st time"
send_gdb "info reg esi\n"
gdb_expect {
    -re "esi *($hex)\t.*$gdb_prompt " {
	set predec_esi $expect_out(1,string)
    }
}

gdb_test "step" "dec .edi.*" "step to dec edi 1st time"
send_gdb "info reg edi\n"
gdb_expect {
    -re "edi *($hex)\t.*$gdb_prompt " {
	set predec_edi $expect_out(1,string)
    }
}

# gdb_test "step" "end inc_dec_tests .*" "step to end inc_dec_tests 1st time"

gdb_test "break $end_of_main" \
    "Breakpoint $decimal at .* line $end_of_main\." \
    "set breakpoint at end of main"

gdb_test "continue" \
    " end of main .*" \
    "continue to end of main"

gdb_test "break $end_of_inc_dec_tests" \
    "Breakpoint $decimal at .* line $end_of_inc_dec_tests\." \
    "set breakpoint at end of inc_dec_tests"

gdb_test "reverse-continue" \
    " end inc_dec_tests .*" \
    "reverse to inc_dec_tests"

#
# Now reverse step, and check register values.
#

gdb_test "info reg edi" "edi *$preinc_edi\t.*" "edi before reverse-dec"
gdb_test "reverse-step" "dec .edi.*" "reverse-step to dec edi"
gdb_test "info reg edi" "edi *$predec_edi\t.*" "edi after reverse-dec"

gdb_test "info reg esi" "esi *$preinc_esi\t.*" "esi before reverse-dec"
gdb_test "reverse-step" "dec .esi.*" "reverse-step to dec esi"
gdb_test "info reg esi" "esi *$predec_esi\t.*" "esi after reverse-dec"

gdb_test "info reg ebp" "ebp *$preinc_ebp\t.*" "ebp before reverse-dec"
gdb_test "reverse-step" "dec .ebp.*" "reverse-step to dec ebp"
gdb_test "info reg ebp" "ebp *$predec_ebp\t.*" "ebp after reverse-dec"

gdb_test "info reg esp" "esp *$preinc_esp\t.*" "esp before reverse-dec"
gdb_test "reverse-step" "dec .esp.*" "reverse-step to dec esp"
gdb_test "info reg esp" "esp *$predec_esp\t.*" "esp after reverse-dec"

gdb_test "info reg ebx" "ebx *$preinc_ebx\t.*" "ebx before reverse-dec"
gdb_test "reverse-step" "dec .ebx.*" "reverse-step to dec ebx"
gdb_test "info reg ebx" "ebx *$predec_ebx\t.*" "ebx after reverse-dec"

gdb_test "info reg edx" "edx *$preinc_edx\t.*" "edx before reverse-dec"
gdb_test "reverse-step" "dec .edx.*" "reverse-step to dec edx"
gdb_test "info reg edx" "edx *$predec_edx\t.*" "edx after reverse-dec"

gdb_test "info reg ecx" "ecx *$preinc_ecx\t.*" "ecx before reverse-dec"
gdb_test "reverse-step" "dec .ecx.*" "reverse-step to dec ecx"
gdb_test "info reg ecx" "ecx *$predec_ecx\t.*" "ecx after reverse-dec"

gdb_test "info reg eax" "eax *$preinc_eax\t.*" "eax before reverse-dec"
gdb_test "reverse-step" "dec .eax.*" "reverse-step to dec eax"
gdb_test "info reg eax" "eax *$predec_eax\t.*" "eax after reverse-dec"

gdb_test "info reg edi" "edi *$predec_edi\t.*" "edi before reverse-inc"
gdb_test "reverse-step" "inc .edi.*" "reverse-step to inc edi"
gdb_test "info reg edi" "edi *$preinc_edi\t.*" "edi after reverse-inc"

gdb_test "info reg esi" "esi *$predec_esi\t.*" "esi before reverse-inc"
gdb_test "reverse-step" "inc .esi.*" "reverse-step to inc esi"
gdb_test "info reg esi" "esi *$preinc_esi\t.*" "esi after reverse-inc"

gdb_test "info reg ebp" "ebp *$predec_ebp\t.*" "ebp before reverse-inc"
gdb_test "reverse-step" "inc .ebp.*" "reverse-step to inc ebp"
gdb_test "info reg ebp" "ebp *$preinc_ebp\t.*" "ebp after reverse-inc"

gdb_test "info reg esp" "esp *$predec_esp\t.*" "esp before reverse-inc"
gdb_test "reverse-step" "inc .esp.*" "reverse-step to inc esp"
gdb_test "info reg esp" "esp *$preinc_esp\t.*" "esp after reverse-inc"

gdb_test "info reg ebx" "ebx *$predec_ebx\t.*" "ebx before reverse-inc"
gdb_test "reverse-step" "inc .ebx.*" "reverse-step to inc ebx"
gdb_test "info reg ebx" "ebx *$preinc_ebx\t.*" "ebx after reverse-inc"

gdb_test "info reg edx" "edx *$predec_edx\t.*" "edx before reverse-inc"
gdb_test "reverse-step" "inc .edx.*" "reverse-step to inc edx"
gdb_test "info reg edx" "edx *$preinc_edx\t.*" "edx after reverse-inc"

gdb_test "info reg ecx" "ecx *$predec_ecx\t.*" "ecx before reverse-inc"
gdb_test "reverse-step" "inc .ecx.*" "reverse-step to inc ecx"
gdb_test "info reg ecx" "ecx *$preinc_ecx\t.*" "ecx after reverse-inc"

gdb_test "info reg eax" "eax *$predec_eax\t.*" "eax before reverse-inc"
gdb_test "reverse-step" "inc .eax.*" "reverse-step to inc eax"
gdb_test "info reg eax" "eax *$preinc_eax\t.*" "eax after reverse-inc"



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] change to i386_process_record, with test
  2009-08-23  3:11 [RFA] change to i386_process_record, with test Michael Snyder
@ 2009-08-23  4:12 ` Hui Zhu
  2009-08-23  4:24   ` Michael Snyder
  0 siblings, 1 reply; 5+ messages in thread
From: Hui Zhu @ 2009-08-23  4:12 UTC (permalink / raw)
  To: Michael Snyder; +Cc: gdb-patches

On Sun, Aug 23, 2009 at 10:56, Michael Snyder<msnyder@vmware.com> wrote:
> Hi Hui,
>
> Would you please try this test on a 32 bit intel target?
> I think it demonstrates the need for the attached change.
> This also fixes four fails in machinestate.exp.
>
> Thanks,
> Michael
>

Cool.  Thanks for find this big bug out.  :)

BTW, I think I cannot reproduce this issue is because we use different
gcc.  My gcc is:
gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.3.3-5ubuntu4'
--with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--enable-mpfr --with-tune=generic --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)

Thanks,
Hui


>
> 2009-08-22  Michael Snyder  <msnyder@vmware.com>
>
>        * i386-tdep.c (i386_process_record): Break out of prefix loop
>        if not amd64.  Otherwise inc/dec instructions are lost.
>
> Index: i386-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/i386-tdep.c,v
> retrieving revision 1.283
> diff -u -p -r1.283 i386-tdep.c
> --- i386-tdep.c 10 Aug 2009 03:02:39 -0000      1.283
> +++ i386-tdep.c 23 Aug 2009 02:55:10 -0000
> @@ -3280,23 +3280,23 @@ i386_process_record (struct gdbarch *gdb
>        case 0x67:
>          prefixes |= PREFIX_ADDR;
>          break;
> -        case 0x40:
> -        case 0x41:
> -        case 0x42:
> -        case 0x43:
> -        case 0x44:
> -        case 0x45:
> -        case 0x46:
> -        case 0x47:
> -        case 0x48:
> -        case 0x49:
> -        case 0x4a:
> -        case 0x4b:
> -        case 0x4c:
> -        case 0x4d:
> -        case 0x4e:
> -        case 0x4f:
> -          if (ir.regmap[X86_RECORD_R8_REGNUM])
> +        case 0x40:     /* i386 inc %eax */
> +        case 0x41:     /* i386 inc %ecx */
> +        case 0x42:     /* i386 inc %edx */
> +        case 0x43:     /* i386 inc %ebx */
> +        case 0x44:     /* i386 inc %esp */
> +        case 0x45:     /* i386 inc %ebp */
> +        case 0x46:     /* i386 inc %esi */
> +        case 0x47:     /* i386 inc %edi */
> +        case 0x48:     /* i386 dec %eax */
> +        case 0x49:     /* i386 dec %ecx */
> +        case 0x4a:     /* i386 dec %edx */
> +        case 0x4b:     /* i386 dec %ebx */
> +        case 0x4c:     /* i386 dec %esp */
> +        case 0x4d:     /* i386 dec %ebp */
> +        case 0x4e:     /* i386 dec %esi */
> +        case 0x4f:     /* i386 dec %edi */
> +          if (ir.regmap[X86_RECORD_R8_REGNUM]) /* 64 bit target */
>             {
>                /* REX */
>                rex = 1;
> @@ -3305,6 +3305,8 @@ i386_process_record (struct gdbarch *gdb
>                ir.rex_x = (tmpu8 & 0x2) << 2;
>                ir.rex_b = (tmpu8 & 0x1) << 3;
>             }
> +         else                                  /* 32 bit target */
> +           goto out_prefixes;
>           break;
>        default:
>          goto out_prefixes;
>
> # Copyright 2009 Free Software Foundation, Inc.
>
> # This program is free software; you can redistribute it and/or modify
> # it under the terms of the GNU General Public License as published by
> # the Free Software Foundation; either version 3 of the License, or
> # (at your option) any later version.
> #
> # This program is distributed in the hope that it will be useful,
> # but WITHOUT ANY WARRANTY; without even the implied warranty of
> # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> # GNU General Public License for more details.
> #
> # You should have received a copy of the GNU General Public License
> # along with this program.  If not, see <http://www.gnu.org/licenses/>.
>
> # This file is part of the gdb testsuite.
>
> if $tracelevel {
>    strace $tracelevel
> }
>
> set prms_id 0
> set bug_id 0
>
> if ![istarget "i?86-*linux*"] then {
>    verbose "Skipping i386 reverse tests."
>    return
> }
>
> set testfile "i386-reverse"
> set srcfile ${testfile}.c
> set binfile ${objdir}/${subdir}/${testfile}
>
> # some targets have leading underscores on assembly symbols.
> # TODO: detect this automatically
> set additional_flags ""
> if [istarget "i?86-*-cygwin*"] then {
>  set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
> }
>
> if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable
> [list debug $additional_flags]] != "" } {
>    untested i386-reverse
>    return -1
> }
>
> set end_of_main          [gdb_get_line_number " end of main "]
> set end_of_inc_dec_tests [gdb_get_line_number " end inc_dec_tests "]
>
> # Get things started.
>
> gdb_exit
> gdb_start
> gdb_reinitialize_dir $srcdir/$subdir
> gdb_load ${binfile}
> runto main
>
> if [target_info exists gdb,use_precord] {
>    # Activate process record/replay
>    gdb_test "record" "" "Turn on process record"
>    # FIXME: command ought to acknowledge, so we can test if it succeeded.
> }
>
> global hex
> global decimal
>
> gdb_test "step" "inc .eax.*" "step to inc eax 1st time"
> send_gdb "info reg eax\n"
> gdb_expect {
>    -re "eax *($hex)\t.*$gdb_prompt " {
>        set preinc_eax $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "inc .ecx.*" "step to inc ecx 1st time"
> send_gdb "info reg ecx\n"
> gdb_expect {
>    -re "ecx *($hex)\t.*$gdb_prompt " {
>        set preinc_ecx $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "inc .edx.*" "step to inc edx 1st time"
> send_gdb "info reg edx\n"
> gdb_expect {
>    -re "edx *($hex)\t.*$gdb_prompt " {
>        set preinc_edx $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "inc .ebx.*" "step to inc ebx 1st time"
> send_gdb "info reg ebx\n"
> gdb_expect {
>    -re "ebx *($hex)\t.*$gdb_prompt " {
>        set preinc_ebx $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "inc .esp.*" "step to inc esp 1st time"
> send_gdb "info reg esp\n"
> gdb_expect {
>    -re "esp *($hex)\t.*$gdb_prompt " {
>        set preinc_esp $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "inc .ebp.*" "step to inc ebp 1st time"
> send_gdb "info reg ebp\n"
> gdb_expect {
>    -re "ebp *($hex)\t.*$gdb_prompt " {
>        set preinc_ebp $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "inc .esi.*" "step to inc esi 1st time"
> send_gdb "info reg esi\n"
> gdb_expect {
>    -re "esi *($hex)\t.*$gdb_prompt " {
>        set preinc_esi $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "inc .edi.*" "step to inc edi 1st time"
> send_gdb "info reg edi\n"
> gdb_expect {
>    -re "edi *($hex)\t.*$gdb_prompt " {
>        set preinc_edi $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "dec .eax.*" "step to dec eax 1st time"
> send_gdb "info reg eax\n"
> gdb_expect {
>    -re "eax *($hex)\t.*$gdb_prompt " {
>        set predec_eax $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "dec .ecx.*" "step to dec ecx 1st time"
> send_gdb "info reg ecx\n"
> gdb_expect {
>    -re "ecx *($hex)\t.*$gdb_prompt " {
>        set predec_ecx $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "dec .edx.*" "step to dec edx 1st time"
> send_gdb "info reg edx\n"
> gdb_expect {
>    -re "edx *($hex)\t.*$gdb_prompt " {
>        set predec_edx $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "dec .ebx.*" "step to dec ebx 1st time"
> send_gdb "info reg ebx\n"
> gdb_expect {
>    -re "ebx *($hex)\t.*$gdb_prompt " {
>        set predec_ebx $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "dec .esp.*" "step to dec esp 1st time"
> send_gdb "info reg esp\n"
> gdb_expect {
>    -re "esp *($hex)\t.*$gdb_prompt " {
>        set predec_esp $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "dec .ebp.*" "step to dec ebp 1st time"
> send_gdb "info reg ebp\n"
> gdb_expect {
>    -re "ebp *($hex)\t.*$gdb_prompt " {
>        set predec_ebp $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "dec .esi.*" "step to dec esi 1st time"
> send_gdb "info reg esi\n"
> gdb_expect {
>    -re "esi *($hex)\t.*$gdb_prompt " {
>        set predec_esi $expect_out(1,string)
>    }
> }
>
> gdb_test "step" "dec .edi.*" "step to dec edi 1st time"
> send_gdb "info reg edi\n"
> gdb_expect {
>    -re "edi *($hex)\t.*$gdb_prompt " {
>        set predec_edi $expect_out(1,string)
>    }
> }
>
> # gdb_test "step" "end inc_dec_tests .*" "step to end inc_dec_tests 1st
> time"
>
> gdb_test "break $end_of_main" \
>    "Breakpoint $decimal at .* line $end_of_main\." \
>    "set breakpoint at end of main"
>
> gdb_test "continue" \
>    " end of main .*" \
>    "continue to end of main"
>
> gdb_test "break $end_of_inc_dec_tests" \
>    "Breakpoint $decimal at .* line $end_of_inc_dec_tests\." \
>    "set breakpoint at end of inc_dec_tests"
>
> gdb_test "reverse-continue" \
>    " end inc_dec_tests .*" \
>    "reverse to inc_dec_tests"
>
> #
> # Now reverse step, and check register values.
> #
>
> gdb_test "info reg edi" "edi *$preinc_edi\t.*" "edi before reverse-dec"
> gdb_test "reverse-step" "dec .edi.*" "reverse-step to dec edi"
> gdb_test "info reg edi" "edi *$predec_edi\t.*" "edi after reverse-dec"
>
> gdb_test "info reg esi" "esi *$preinc_esi\t.*" "esi before reverse-dec"
> gdb_test "reverse-step" "dec .esi.*" "reverse-step to dec esi"
> gdb_test "info reg esi" "esi *$predec_esi\t.*" "esi after reverse-dec"
>
> gdb_test "info reg ebp" "ebp *$preinc_ebp\t.*" "ebp before reverse-dec"
> gdb_test "reverse-step" "dec .ebp.*" "reverse-step to dec ebp"
> gdb_test "info reg ebp" "ebp *$predec_ebp\t.*" "ebp after reverse-dec"
>
> gdb_test "info reg esp" "esp *$preinc_esp\t.*" "esp before reverse-dec"
> gdb_test "reverse-step" "dec .esp.*" "reverse-step to dec esp"
> gdb_test "info reg esp" "esp *$predec_esp\t.*" "esp after reverse-dec"
>
> gdb_test "info reg ebx" "ebx *$preinc_ebx\t.*" "ebx before reverse-dec"
> gdb_test "reverse-step" "dec .ebx.*" "reverse-step to dec ebx"
> gdb_test "info reg ebx" "ebx *$predec_ebx\t.*" "ebx after reverse-dec"
>
> gdb_test "info reg edx" "edx *$preinc_edx\t.*" "edx before reverse-dec"
> gdb_test "reverse-step" "dec .edx.*" "reverse-step to dec edx"
> gdb_test "info reg edx" "edx *$predec_edx\t.*" "edx after reverse-dec"
>
> gdb_test "info reg ecx" "ecx *$preinc_ecx\t.*" "ecx before reverse-dec"
> gdb_test "reverse-step" "dec .ecx.*" "reverse-step to dec ecx"
> gdb_test "info reg ecx" "ecx *$predec_ecx\t.*" "ecx after reverse-dec"
>
> gdb_test "info reg eax" "eax *$preinc_eax\t.*" "eax before reverse-dec"
> gdb_test "reverse-step" "dec .eax.*" "reverse-step to dec eax"
> gdb_test "info reg eax" "eax *$predec_eax\t.*" "eax after reverse-dec"
>
> gdb_test "info reg edi" "edi *$predec_edi\t.*" "edi before reverse-inc"
> gdb_test "reverse-step" "inc .edi.*" "reverse-step to inc edi"
> gdb_test "info reg edi" "edi *$preinc_edi\t.*" "edi after reverse-inc"
>
> gdb_test "info reg esi" "esi *$predec_esi\t.*" "esi before reverse-inc"
> gdb_test "reverse-step" "inc .esi.*" "reverse-step to inc esi"
> gdb_test "info reg esi" "esi *$preinc_esi\t.*" "esi after reverse-inc"
>
> gdb_test "info reg ebp" "ebp *$predec_ebp\t.*" "ebp before reverse-inc"
> gdb_test "reverse-step" "inc .ebp.*" "reverse-step to inc ebp"
> gdb_test "info reg ebp" "ebp *$preinc_ebp\t.*" "ebp after reverse-inc"
>
> gdb_test "info reg esp" "esp *$predec_esp\t.*" "esp before reverse-inc"
> gdb_test "reverse-step" "inc .esp.*" "reverse-step to inc esp"
> gdb_test "info reg esp" "esp *$preinc_esp\t.*" "esp after reverse-inc"
>
> gdb_test "info reg ebx" "ebx *$predec_ebx\t.*" "ebx before reverse-inc"
> gdb_test "reverse-step" "inc .ebx.*" "reverse-step to inc ebx"
> gdb_test "info reg ebx" "ebx *$preinc_ebx\t.*" "ebx after reverse-inc"
>
> gdb_test "info reg edx" "edx *$predec_edx\t.*" "edx before reverse-inc"
> gdb_test "reverse-step" "inc .edx.*" "reverse-step to inc edx"
> gdb_test "info reg edx" "edx *$preinc_edx\t.*" "edx after reverse-inc"
>
> gdb_test "info reg ecx" "ecx *$predec_ecx\t.*" "ecx before reverse-inc"
> gdb_test "reverse-step" "inc .ecx.*" "reverse-step to inc ecx"
> gdb_test "info reg ecx" "ecx *$preinc_ecx\t.*" "ecx after reverse-inc"
>
> gdb_test "info reg eax" "eax *$predec_eax\t.*" "eax before reverse-inc"
> gdb_test "reverse-step" "inc .eax.*" "reverse-step to inc eax"
> gdb_test "info reg eax" "eax *$preinc_eax\t.*" "eax after reverse-inc"
>
>
>
>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] change to i386_process_record, with test
  2009-08-23  4:12 ` Hui Zhu
@ 2009-08-23  4:24   ` Michael Snyder
  2009-08-23  4:30     ` Hui Zhu
  0 siblings, 1 reply; 5+ messages in thread
From: Michael Snyder @ 2009-08-23  4:24 UTC (permalink / raw)
  To: Hui Zhu; +Cc: gdb-patches

Hui Zhu wrote:
> On Sun, Aug 23, 2009 at 10:56, Michael Snyder<msnyder@vmware.com> wrote:
>> Hi Hui,
>>
>> Would you please try this test on a 32 bit intel target?
>> I think it demonstrates the need for the attached change.
>> This also fixes four fails in machinestate.exp.
>>
>> Thanks,
>> Michael
>>
> 
> Cool.  Thanks for find this big bug out.  :)
> 
> BTW, I think I cannot reproduce this issue is because we use different
> gcc.  

Yeah, I think you're right.
So you approve the change and the tests?  Shall I commit?

> 
>> 2009-08-22  Michael Snyder  <msnyder@vmware.com>
>>
>>        * i386-tdep.c (i386_process_record): Break out of prefix loop
>>        if not amd64.  Otherwise inc/dec instructions are lost.
>>
>> Index: i386-tdep.c
>> ===================================================================
>> RCS file: /cvs/src/src/gdb/i386-tdep.c,v
>> retrieving revision 1.283
>> diff -u -p -r1.283 i386-tdep.c
>> --- i386-tdep.c 10 Aug 2009 03:02:39 -0000      1.283
>> +++ i386-tdep.c 23 Aug 2009 02:55:10 -0000
>> @@ -3280,23 +3280,23 @@ i386_process_record (struct gdbarch *gdb
>>        case 0x67:
>>          prefixes |= PREFIX_ADDR;
>>          break;
>> -        case 0x40:
>> -        case 0x41:
>> -        case 0x42:
>> -        case 0x43:
>> -        case 0x44:
>> -        case 0x45:
>> -        case 0x46:
>> -        case 0x47:
>> -        case 0x48:
>> -        case 0x49:
>> -        case 0x4a:
>> -        case 0x4b:
>> -        case 0x4c:
>> -        case 0x4d:
>> -        case 0x4e:
>> -        case 0x4f:
>> -          if (ir.regmap[X86_RECORD_R8_REGNUM])
>> +        case 0x40:     /* i386 inc %eax */
>> +        case 0x41:     /* i386 inc %ecx */
>> +        case 0x42:     /* i386 inc %edx */
>> +        case 0x43:     /* i386 inc %ebx */
>> +        case 0x44:     /* i386 inc %esp */
>> +        case 0x45:     /* i386 inc %ebp */
>> +        case 0x46:     /* i386 inc %esi */
>> +        case 0x47:     /* i386 inc %edi */
>> +        case 0x48:     /* i386 dec %eax */
>> +        case 0x49:     /* i386 dec %ecx */
>> +        case 0x4a:     /* i386 dec %edx */
>> +        case 0x4b:     /* i386 dec %ebx */
>> +        case 0x4c:     /* i386 dec %esp */
>> +        case 0x4d:     /* i386 dec %ebp */
>> +        case 0x4e:     /* i386 dec %esi */
>> +        case 0x4f:     /* i386 dec %edi */
>> +          if (ir.regmap[X86_RECORD_R8_REGNUM]) /* 64 bit target */
>>             {
>>                /* REX */
>>                rex = 1;
>> @@ -3305,6 +3305,8 @@ i386_process_record (struct gdbarch *gdb
>>                ir.rex_x = (tmpu8 & 0x2) << 2;
>>                ir.rex_b = (tmpu8 & 0x1) << 3;
>>             }
>> +         else                                  /* 32 bit target */
>> +           goto out_prefixes;
>>           break;
>>        default:
>>          goto out_prefixes;
>>
>> # Copyright 2009 Free Software Foundation, Inc.
>>
>> # This program is free software; you can redistribute it and/or modify
>> # it under the terms of the GNU General Public License as published by
>> # the Free Software Foundation; either version 3 of the License, or
>> # (at your option) any later version.
>> #
>> # This program is distributed in the hope that it will be useful,
>> # but WITHOUT ANY WARRANTY; without even the implied warranty of
>> # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> # GNU General Public License for more details.
>> #
>> # You should have received a copy of the GNU General Public License
>> # along with this program.  If not, see <http://www.gnu.org/licenses/>.
>>
>> # This file is part of the gdb testsuite.
>>
>> if $tracelevel {
>>    strace $tracelevel
>> }
>>
>> set prms_id 0
>> set bug_id 0
>>
>> if ![istarget "i?86-*linux*"] then {
>>    verbose "Skipping i386 reverse tests."
>>    return
>> }
>>
>> set testfile "i386-reverse"
>> set srcfile ${testfile}.c
>> set binfile ${objdir}/${subdir}/${testfile}
>>
>> # some targets have leading underscores on assembly symbols.
>> # TODO: detect this automatically
>> set additional_flags ""
>> if [istarget "i?86-*-cygwin*"] then {
>>  set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
>> }
>>
>> if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable
>> [list debug $additional_flags]] != "" } {
>>    untested i386-reverse
>>    return -1
>> }
>>
>> set end_of_main          [gdb_get_line_number " end of main "]
>> set end_of_inc_dec_tests [gdb_get_line_number " end inc_dec_tests "]
>>
>> # Get things started.
>>
>> gdb_exit
>> gdb_start
>> gdb_reinitialize_dir $srcdir/$subdir
>> gdb_load ${binfile}
>> runto main
>>
>> if [target_info exists gdb,use_precord] {
>>    # Activate process record/replay
>>    gdb_test "record" "" "Turn on process record"
>>    # FIXME: command ought to acknowledge, so we can test if it succeeded.
>> }
>>
>> global hex
>> global decimal
>>
>> gdb_test "step" "inc .eax.*" "step to inc eax 1st time"
>> send_gdb "info reg eax\n"
>> gdb_expect {
>>    -re "eax *($hex)\t.*$gdb_prompt " {
>>        set preinc_eax $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "inc .ecx.*" "step to inc ecx 1st time"
>> send_gdb "info reg ecx\n"
>> gdb_expect {
>>    -re "ecx *($hex)\t.*$gdb_prompt " {
>>        set preinc_ecx $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "inc .edx.*" "step to inc edx 1st time"
>> send_gdb "info reg edx\n"
>> gdb_expect {
>>    -re "edx *($hex)\t.*$gdb_prompt " {
>>        set preinc_edx $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "inc .ebx.*" "step to inc ebx 1st time"
>> send_gdb "info reg ebx\n"
>> gdb_expect {
>>    -re "ebx *($hex)\t.*$gdb_prompt " {
>>        set preinc_ebx $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "inc .esp.*" "step to inc esp 1st time"
>> send_gdb "info reg esp\n"
>> gdb_expect {
>>    -re "esp *($hex)\t.*$gdb_prompt " {
>>        set preinc_esp $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "inc .ebp.*" "step to inc ebp 1st time"
>> send_gdb "info reg ebp\n"
>> gdb_expect {
>>    -re "ebp *($hex)\t.*$gdb_prompt " {
>>        set preinc_ebp $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "inc .esi.*" "step to inc esi 1st time"
>> send_gdb "info reg esi\n"
>> gdb_expect {
>>    -re "esi *($hex)\t.*$gdb_prompt " {
>>        set preinc_esi $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "inc .edi.*" "step to inc edi 1st time"
>> send_gdb "info reg edi\n"
>> gdb_expect {
>>    -re "edi *($hex)\t.*$gdb_prompt " {
>>        set preinc_edi $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "dec .eax.*" "step to dec eax 1st time"
>> send_gdb "info reg eax\n"
>> gdb_expect {
>>    -re "eax *($hex)\t.*$gdb_prompt " {
>>        set predec_eax $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "dec .ecx.*" "step to dec ecx 1st time"
>> send_gdb "info reg ecx\n"
>> gdb_expect {
>>    -re "ecx *($hex)\t.*$gdb_prompt " {
>>        set predec_ecx $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "dec .edx.*" "step to dec edx 1st time"
>> send_gdb "info reg edx\n"
>> gdb_expect {
>>    -re "edx *($hex)\t.*$gdb_prompt " {
>>        set predec_edx $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "dec .ebx.*" "step to dec ebx 1st time"
>> send_gdb "info reg ebx\n"
>> gdb_expect {
>>    -re "ebx *($hex)\t.*$gdb_prompt " {
>>        set predec_ebx $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "dec .esp.*" "step to dec esp 1st time"
>> send_gdb "info reg esp\n"
>> gdb_expect {
>>    -re "esp *($hex)\t.*$gdb_prompt " {
>>        set predec_esp $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "dec .ebp.*" "step to dec ebp 1st time"
>> send_gdb "info reg ebp\n"
>> gdb_expect {
>>    -re "ebp *($hex)\t.*$gdb_prompt " {
>>        set predec_ebp $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "dec .esi.*" "step to dec esi 1st time"
>> send_gdb "info reg esi\n"
>> gdb_expect {
>>    -re "esi *($hex)\t.*$gdb_prompt " {
>>        set predec_esi $expect_out(1,string)
>>    }
>> }
>>
>> gdb_test "step" "dec .edi.*" "step to dec edi 1st time"
>> send_gdb "info reg edi\n"
>> gdb_expect {
>>    -re "edi *($hex)\t.*$gdb_prompt " {
>>        set predec_edi $expect_out(1,string)
>>    }
>> }
>>
>> # gdb_test "step" "end inc_dec_tests .*" "step to end inc_dec_tests 1st
>> time"
>>
>> gdb_test "break $end_of_main" \
>>    "Breakpoint $decimal at .* line $end_of_main\." \
>>    "set breakpoint at end of main"
>>
>> gdb_test "continue" \
>>    " end of main .*" \
>>    "continue to end of main"
>>
>> gdb_test "break $end_of_inc_dec_tests" \
>>    "Breakpoint $decimal at .* line $end_of_inc_dec_tests\." \
>>    "set breakpoint at end of inc_dec_tests"
>>
>> gdb_test "reverse-continue" \
>>    " end inc_dec_tests .*" \
>>    "reverse to inc_dec_tests"
>>
>> #
>> # Now reverse step, and check register values.
>> #
>>
>> gdb_test "info reg edi" "edi *$preinc_edi\t.*" "edi before reverse-dec"
>> gdb_test "reverse-step" "dec .edi.*" "reverse-step to dec edi"
>> gdb_test "info reg edi" "edi *$predec_edi\t.*" "edi after reverse-dec"
>>
>> gdb_test "info reg esi" "esi *$preinc_esi\t.*" "esi before reverse-dec"
>> gdb_test "reverse-step" "dec .esi.*" "reverse-step to dec esi"
>> gdb_test "info reg esi" "esi *$predec_esi\t.*" "esi after reverse-dec"
>>
>> gdb_test "info reg ebp" "ebp *$preinc_ebp\t.*" "ebp before reverse-dec"
>> gdb_test "reverse-step" "dec .ebp.*" "reverse-step to dec ebp"
>> gdb_test "info reg ebp" "ebp *$predec_ebp\t.*" "ebp after reverse-dec"
>>
>> gdb_test "info reg esp" "esp *$preinc_esp\t.*" "esp before reverse-dec"
>> gdb_test "reverse-step" "dec .esp.*" "reverse-step to dec esp"
>> gdb_test "info reg esp" "esp *$predec_esp\t.*" "esp after reverse-dec"
>>
>> gdb_test "info reg ebx" "ebx *$preinc_ebx\t.*" "ebx before reverse-dec"
>> gdb_test "reverse-step" "dec .ebx.*" "reverse-step to dec ebx"
>> gdb_test "info reg ebx" "ebx *$predec_ebx\t.*" "ebx after reverse-dec"
>>
>> gdb_test "info reg edx" "edx *$preinc_edx\t.*" "edx before reverse-dec"
>> gdb_test "reverse-step" "dec .edx.*" "reverse-step to dec edx"
>> gdb_test "info reg edx" "edx *$predec_edx\t.*" "edx after reverse-dec"
>>
>> gdb_test "info reg ecx" "ecx *$preinc_ecx\t.*" "ecx before reverse-dec"
>> gdb_test "reverse-step" "dec .ecx.*" "reverse-step to dec ecx"
>> gdb_test "info reg ecx" "ecx *$predec_ecx\t.*" "ecx after reverse-dec"
>>
>> gdb_test "info reg eax" "eax *$preinc_eax\t.*" "eax before reverse-dec"
>> gdb_test "reverse-step" "dec .eax.*" "reverse-step to dec eax"
>> gdb_test "info reg eax" "eax *$predec_eax\t.*" "eax after reverse-dec"
>>
>> gdb_test "info reg edi" "edi *$predec_edi\t.*" "edi before reverse-inc"
>> gdb_test "reverse-step" "inc .edi.*" "reverse-step to inc edi"
>> gdb_test "info reg edi" "edi *$preinc_edi\t.*" "edi after reverse-inc"
>>
>> gdb_test "info reg esi" "esi *$predec_esi\t.*" "esi before reverse-inc"
>> gdb_test "reverse-step" "inc .esi.*" "reverse-step to inc esi"
>> gdb_test "info reg esi" "esi *$preinc_esi\t.*" "esi after reverse-inc"
>>
>> gdb_test "info reg ebp" "ebp *$predec_ebp\t.*" "ebp before reverse-inc"
>> gdb_test "reverse-step" "inc .ebp.*" "reverse-step to inc ebp"
>> gdb_test "info reg ebp" "ebp *$preinc_ebp\t.*" "ebp after reverse-inc"
>>
>> gdb_test "info reg esp" "esp *$predec_esp\t.*" "esp before reverse-inc"
>> gdb_test "reverse-step" "inc .esp.*" "reverse-step to inc esp"
>> gdb_test "info reg esp" "esp *$preinc_esp\t.*" "esp after reverse-inc"
>>
>> gdb_test "info reg ebx" "ebx *$predec_ebx\t.*" "ebx before reverse-inc"
>> gdb_test "reverse-step" "inc .ebx.*" "reverse-step to inc ebx"
>> gdb_test "info reg ebx" "ebx *$preinc_ebx\t.*" "ebx after reverse-inc"
>>
>> gdb_test "info reg edx" "edx *$predec_edx\t.*" "edx before reverse-inc"
>> gdb_test "reverse-step" "inc .edx.*" "reverse-step to inc edx"
>> gdb_test "info reg edx" "edx *$preinc_edx\t.*" "edx after reverse-inc"
>>
>> gdb_test "info reg ecx" "ecx *$predec_ecx\t.*" "ecx before reverse-inc"
>> gdb_test "reverse-step" "inc .ecx.*" "reverse-step to inc ecx"
>> gdb_test "info reg ecx" "ecx *$preinc_ecx\t.*" "ecx after reverse-inc"
>>
>> gdb_test "info reg eax" "eax *$predec_eax\t.*" "eax before reverse-inc"
>> gdb_test "reverse-step" "inc .eax.*" "reverse-step to inc eax"
>> gdb_test "info reg eax" "eax *$preinc_eax\t.*" "eax after reverse-inc"
>>
>>
>>
>>
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] change to i386_process_record, with test
  2009-08-23  4:24   ` Michael Snyder
@ 2009-08-23  4:30     ` Hui Zhu
  2009-08-27  0:28       ` Michael Snyder
  0 siblings, 1 reply; 5+ messages in thread
From: Hui Zhu @ 2009-08-23  4:30 UTC (permalink / raw)
  To: Michael Snyder; +Cc: gdb-patches

On Sun, Aug 23, 2009 at 12:09, Michael Snyder<msnyder@vmware.com> wrote:
> Hui Zhu wrote:
>>
>> On Sun, Aug 23, 2009 at 10:56, Michael Snyder<msnyder@vmware.com> wrote:
>>>
>>> Hi Hui,
>>>
>>> Would you please try this test on a 32 bit intel target?
>>> I think it demonstrates the need for the attached change.
>>> This also fixes four fails in machinestate.exp.
>>>
>>> Thanks,
>>> Michael
>>>
>>
>> Cool.  Thanks for find this big bug out.  :)
>>
>> BTW, I think I cannot reproduce this issue is because we use different
>> gcc.
>
> Yeah, I think you're right.
> So you approve the change and the tests?  Shall I commit?

Of course.  :)

Hui

>
>>
>>> 2009-08-22  Michael Snyder  <msnyder@vmware.com>
>>>
>>>       * i386-tdep.c (i386_process_record): Break out of prefix loop
>>>       if not amd64.  Otherwise inc/dec instructions are lost.
>>>
>>> Index: i386-tdep.c
>>> ===================================================================
>>> RCS file: /cvs/src/src/gdb/i386-tdep.c,v
>>> retrieving revision 1.283
>>> diff -u -p -r1.283 i386-tdep.c
>>> --- i386-tdep.c 10 Aug 2009 03:02:39 -0000      1.283
>>> +++ i386-tdep.c 23 Aug 2009 02:55:10 -0000
>>> @@ -3280,23 +3280,23 @@ i386_process_record (struct gdbarch *gdb
>>>       case 0x67:
>>>         prefixes |= PREFIX_ADDR;
>>>         break;
>>> -        case 0x40:
>>> -        case 0x41:
>>> -        case 0x42:
>>> -        case 0x43:
>>> -        case 0x44:
>>> -        case 0x45:
>>> -        case 0x46:
>>> -        case 0x47:
>>> -        case 0x48:
>>> -        case 0x49:
>>> -        case 0x4a:
>>> -        case 0x4b:
>>> -        case 0x4c:
>>> -        case 0x4d:
>>> -        case 0x4e:
>>> -        case 0x4f:
>>> -          if (ir.regmap[X86_RECORD_R8_REGNUM])
>>> +        case 0x40:     /* i386 inc %eax */
>>> +        case 0x41:     /* i386 inc %ecx */
>>> +        case 0x42:     /* i386 inc %edx */
>>> +        case 0x43:     /* i386 inc %ebx */
>>> +        case 0x44:     /* i386 inc %esp */
>>> +        case 0x45:     /* i386 inc %ebp */
>>> +        case 0x46:     /* i386 inc %esi */
>>> +        case 0x47:     /* i386 inc %edi */
>>> +        case 0x48:     /* i386 dec %eax */
>>> +        case 0x49:     /* i386 dec %ecx */
>>> +        case 0x4a:     /* i386 dec %edx */
>>> +        case 0x4b:     /* i386 dec %ebx */
>>> +        case 0x4c:     /* i386 dec %esp */
>>> +        case 0x4d:     /* i386 dec %ebp */
>>> +        case 0x4e:     /* i386 dec %esi */
>>> +        case 0x4f:     /* i386 dec %edi */
>>> +          if (ir.regmap[X86_RECORD_R8_REGNUM]) /* 64 bit target */
>>>            {
>>>               /* REX */
>>>               rex = 1;
>>> @@ -3305,6 +3305,8 @@ i386_process_record (struct gdbarch *gdb
>>>               ir.rex_x = (tmpu8 & 0x2) << 2;
>>>               ir.rex_b = (tmpu8 & 0x1) << 3;
>>>            }
>>> +         else                                  /* 32 bit target */
>>> +           goto out_prefixes;
>>>          break;
>>>       default:
>>>         goto out_prefixes;
>>>
>>> # Copyright 2009 Free Software Foundation, Inc.
>>>
>>> # This program is free software; you can redistribute it and/or modify
>>> # it under the terms of the GNU General Public License as published by
>>> # the Free Software Foundation; either version 3 of the License, or
>>> # (at your option) any later version.
>>> #
>>> # This program is distributed in the hope that it will be useful,
>>> # but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> # GNU General Public License for more details.
>>> #
>>> # You should have received a copy of the GNU General Public License
>>> # along with this program.  If not, see <http://www.gnu.org/licenses/>.
>>>
>>> # This file is part of the gdb testsuite.
>>>
>>> if $tracelevel {
>>>   strace $tracelevel
>>> }
>>>
>>> set prms_id 0
>>> set bug_id 0
>>>
>>> if ![istarget "i?86-*linux*"] then {
>>>   verbose "Skipping i386 reverse tests."
>>>   return
>>> }
>>>
>>> set testfile "i386-reverse"
>>> set srcfile ${testfile}.c
>>> set binfile ${objdir}/${subdir}/${testfile}
>>>
>>> # some targets have leading underscores on assembly symbols.
>>> # TODO: detect this automatically
>>> set additional_flags ""
>>> if [istarget "i?86-*-cygwin*"] then {
>>>  set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
>>> }
>>>
>>> if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}"
>>> executable
>>> [list debug $additional_flags]] != "" } {
>>>   untested i386-reverse
>>>   return -1
>>> }
>>>
>>> set end_of_main          [gdb_get_line_number " end of main "]
>>> set end_of_inc_dec_tests [gdb_get_line_number " end inc_dec_tests "]
>>>
>>> # Get things started.
>>>
>>> gdb_exit
>>> gdb_start
>>> gdb_reinitialize_dir $srcdir/$subdir
>>> gdb_load ${binfile}
>>> runto main
>>>
>>> if [target_info exists gdb,use_precord] {
>>>   # Activate process record/replay
>>>   gdb_test "record" "" "Turn on process record"
>>>   # FIXME: command ought to acknowledge, so we can test if it succeeded.
>>> }
>>>
>>> global hex
>>> global decimal
>>>
>>> gdb_test "step" "inc .eax.*" "step to inc eax 1st time"
>>> send_gdb "info reg eax\n"
>>> gdb_expect {
>>>   -re "eax *($hex)\t.*$gdb_prompt " {
>>>       set preinc_eax $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "inc .ecx.*" "step to inc ecx 1st time"
>>> send_gdb "info reg ecx\n"
>>> gdb_expect {
>>>   -re "ecx *($hex)\t.*$gdb_prompt " {
>>>       set preinc_ecx $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "inc .edx.*" "step to inc edx 1st time"
>>> send_gdb "info reg edx\n"
>>> gdb_expect {
>>>   -re "edx *($hex)\t.*$gdb_prompt " {
>>>       set preinc_edx $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "inc .ebx.*" "step to inc ebx 1st time"
>>> send_gdb "info reg ebx\n"
>>> gdb_expect {
>>>   -re "ebx *($hex)\t.*$gdb_prompt " {
>>>       set preinc_ebx $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "inc .esp.*" "step to inc esp 1st time"
>>> send_gdb "info reg esp\n"
>>> gdb_expect {
>>>   -re "esp *($hex)\t.*$gdb_prompt " {
>>>       set preinc_esp $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "inc .ebp.*" "step to inc ebp 1st time"
>>> send_gdb "info reg ebp\n"
>>> gdb_expect {
>>>   -re "ebp *($hex)\t.*$gdb_prompt " {
>>>       set preinc_ebp $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "inc .esi.*" "step to inc esi 1st time"
>>> send_gdb "info reg esi\n"
>>> gdb_expect {
>>>   -re "esi *($hex)\t.*$gdb_prompt " {
>>>       set preinc_esi $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "inc .edi.*" "step to inc edi 1st time"
>>> send_gdb "info reg edi\n"
>>> gdb_expect {
>>>   -re "edi *($hex)\t.*$gdb_prompt " {
>>>       set preinc_edi $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "dec .eax.*" "step to dec eax 1st time"
>>> send_gdb "info reg eax\n"
>>> gdb_expect {
>>>   -re "eax *($hex)\t.*$gdb_prompt " {
>>>       set predec_eax $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "dec .ecx.*" "step to dec ecx 1st time"
>>> send_gdb "info reg ecx\n"
>>> gdb_expect {
>>>   -re "ecx *($hex)\t.*$gdb_prompt " {
>>>       set predec_ecx $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "dec .edx.*" "step to dec edx 1st time"
>>> send_gdb "info reg edx\n"
>>> gdb_expect {
>>>   -re "edx *($hex)\t.*$gdb_prompt " {
>>>       set predec_edx $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "dec .ebx.*" "step to dec ebx 1st time"
>>> send_gdb "info reg ebx\n"
>>> gdb_expect {
>>>   -re "ebx *($hex)\t.*$gdb_prompt " {
>>>       set predec_ebx $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "dec .esp.*" "step to dec esp 1st time"
>>> send_gdb "info reg esp\n"
>>> gdb_expect {
>>>   -re "esp *($hex)\t.*$gdb_prompt " {
>>>       set predec_esp $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "dec .ebp.*" "step to dec ebp 1st time"
>>> send_gdb "info reg ebp\n"
>>> gdb_expect {
>>>   -re "ebp *($hex)\t.*$gdb_prompt " {
>>>       set predec_ebp $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "dec .esi.*" "step to dec esi 1st time"
>>> send_gdb "info reg esi\n"
>>> gdb_expect {
>>>   -re "esi *($hex)\t.*$gdb_prompt " {
>>>       set predec_esi $expect_out(1,string)
>>>   }
>>> }
>>>
>>> gdb_test "step" "dec .edi.*" "step to dec edi 1st time"
>>> send_gdb "info reg edi\n"
>>> gdb_expect {
>>>   -re "edi *($hex)\t.*$gdb_prompt " {
>>>       set predec_edi $expect_out(1,string)
>>>   }
>>> }
>>>
>>> # gdb_test "step" "end inc_dec_tests .*" "step to end inc_dec_tests 1st
>>> time"
>>>
>>> gdb_test "break $end_of_main" \
>>>   "Breakpoint $decimal at .* line $end_of_main\." \
>>>   "set breakpoint at end of main"
>>>
>>> gdb_test "continue" \
>>>   " end of main .*" \
>>>   "continue to end of main"
>>>
>>> gdb_test "break $end_of_inc_dec_tests" \
>>>   "Breakpoint $decimal at .* line $end_of_inc_dec_tests\." \
>>>   "set breakpoint at end of inc_dec_tests"
>>>
>>> gdb_test "reverse-continue" \
>>>   " end inc_dec_tests .*" \
>>>   "reverse to inc_dec_tests"
>>>
>>> #
>>> # Now reverse step, and check register values.
>>> #
>>>
>>> gdb_test "info reg edi" "edi *$preinc_edi\t.*" "edi before reverse-dec"
>>> gdb_test "reverse-step" "dec .edi.*" "reverse-step to dec edi"
>>> gdb_test "info reg edi" "edi *$predec_edi\t.*" "edi after reverse-dec"
>>>
>>> gdb_test "info reg esi" "esi *$preinc_esi\t.*" "esi before reverse-dec"
>>> gdb_test "reverse-step" "dec .esi.*" "reverse-step to dec esi"
>>> gdb_test "info reg esi" "esi *$predec_esi\t.*" "esi after reverse-dec"
>>>
>>> gdb_test "info reg ebp" "ebp *$preinc_ebp\t.*" "ebp before reverse-dec"
>>> gdb_test "reverse-step" "dec .ebp.*" "reverse-step to dec ebp"
>>> gdb_test "info reg ebp" "ebp *$predec_ebp\t.*" "ebp after reverse-dec"
>>>
>>> gdb_test "info reg esp" "esp *$preinc_esp\t.*" "esp before reverse-dec"
>>> gdb_test "reverse-step" "dec .esp.*" "reverse-step to dec esp"
>>> gdb_test "info reg esp" "esp *$predec_esp\t.*" "esp after reverse-dec"
>>>
>>> gdb_test "info reg ebx" "ebx *$preinc_ebx\t.*" "ebx before reverse-dec"
>>> gdb_test "reverse-step" "dec .ebx.*" "reverse-step to dec ebx"
>>> gdb_test "info reg ebx" "ebx *$predec_ebx\t.*" "ebx after reverse-dec"
>>>
>>> gdb_test "info reg edx" "edx *$preinc_edx\t.*" "edx before reverse-dec"
>>> gdb_test "reverse-step" "dec .edx.*" "reverse-step to dec edx"
>>> gdb_test "info reg edx" "edx *$predec_edx\t.*" "edx after reverse-dec"
>>>
>>> gdb_test "info reg ecx" "ecx *$preinc_ecx\t.*" "ecx before reverse-dec"
>>> gdb_test "reverse-step" "dec .ecx.*" "reverse-step to dec ecx"
>>> gdb_test "info reg ecx" "ecx *$predec_ecx\t.*" "ecx after reverse-dec"
>>>
>>> gdb_test "info reg eax" "eax *$preinc_eax\t.*" "eax before reverse-dec"
>>> gdb_test "reverse-step" "dec .eax.*" "reverse-step to dec eax"
>>> gdb_test "info reg eax" "eax *$predec_eax\t.*" "eax after reverse-dec"
>>>
>>> gdb_test "info reg edi" "edi *$predec_edi\t.*" "edi before reverse-inc"
>>> gdb_test "reverse-step" "inc .edi.*" "reverse-step to inc edi"
>>> gdb_test "info reg edi" "edi *$preinc_edi\t.*" "edi after reverse-inc"
>>>
>>> gdb_test "info reg esi" "esi *$predec_esi\t.*" "esi before reverse-inc"
>>> gdb_test "reverse-step" "inc .esi.*" "reverse-step to inc esi"
>>> gdb_test "info reg esi" "esi *$preinc_esi\t.*" "esi after reverse-inc"
>>>
>>> gdb_test "info reg ebp" "ebp *$predec_ebp\t.*" "ebp before reverse-inc"
>>> gdb_test "reverse-step" "inc .ebp.*" "reverse-step to inc ebp"
>>> gdb_test "info reg ebp" "ebp *$preinc_ebp\t.*" "ebp after reverse-inc"
>>>
>>> gdb_test "info reg esp" "esp *$predec_esp\t.*" "esp before reverse-inc"
>>> gdb_test "reverse-step" "inc .esp.*" "reverse-step to inc esp"
>>> gdb_test "info reg esp" "esp *$preinc_esp\t.*" "esp after reverse-inc"
>>>
>>> gdb_test "info reg ebx" "ebx *$predec_ebx\t.*" "ebx before reverse-inc"
>>> gdb_test "reverse-step" "inc .ebx.*" "reverse-step to inc ebx"
>>> gdb_test "info reg ebx" "ebx *$preinc_ebx\t.*" "ebx after reverse-inc"
>>>
>>> gdb_test "info reg edx" "edx *$predec_edx\t.*" "edx before reverse-inc"
>>> gdb_test "reverse-step" "inc .edx.*" "reverse-step to inc edx"
>>> gdb_test "info reg edx" "edx *$preinc_edx\t.*" "edx after reverse-inc"
>>>
>>> gdb_test "info reg ecx" "ecx *$predec_ecx\t.*" "ecx before reverse-inc"
>>> gdb_test "reverse-step" "inc .ecx.*" "reverse-step to inc ecx"
>>> gdb_test "info reg ecx" "ecx *$preinc_ecx\t.*" "ecx after reverse-inc"
>>>
>>> gdb_test "info reg eax" "eax *$predec_eax\t.*" "eax before reverse-inc"
>>> gdb_test "reverse-step" "inc .eax.*" "reverse-step to inc eax"
>>> gdb_test "info reg eax" "eax *$preinc_eax\t.*" "eax after reverse-inc"
>>>
>>>
>>>
>>>
>>
>
>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] change to i386_process_record, with test
  2009-08-23  4:30     ` Hui Zhu
@ 2009-08-27  0:28       ` Michael Snyder
  0 siblings, 0 replies; 5+ messages in thread
From: Michael Snyder @ 2009-08-27  0:28 UTC (permalink / raw)
  To: Hui Zhu; +Cc: gdb-patches

Hui Zhu wrote:
> On Sun, Aug 23, 2009 at 12:09, Michael Snyder<msnyder@vmware.com> wrote:
>> Hui Zhu wrote:
>>> On Sun, Aug 23, 2009 at 10:56, Michael Snyder<msnyder@vmware.com> wrote:
>>>> Hi Hui,
>>>>
>>>> Would you please try this test on a 32 bit intel target?
>>>> I think it demonstrates the need for the attached change.
>>>> This also fixes four fails in machinestate.exp.
>>>>
>>>> Thanks,
>>>> Michael
>>>>
>>> Cool.  Thanks for find this big bug out.  :)
>>>
>>> BTW, I think I cannot reproduce this issue is because we use different
>>> gcc.
>> Yeah, I think you're right.
>> So you approve the change and the tests?  Shall I commit?
> 
> Of course.  :)

Committed.   Thanks.


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-08-27  0:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-23  3:11 [RFA] change to i386_process_record, with test Michael Snyder
2009-08-23  4:12 ` Hui Zhu
2009-08-23  4:24   ` Michael Snyder
2009-08-23  4:30     ` Hui Zhu
2009-08-27  0:28       ` Michael Snyder

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox