1# Copyright 2009-2020 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# This file is part of the gdb testsuite. 17 18# 19# This test tests some i386 general instructions for reverse execution. 20# 21 22if ![supports_reverse] { 23 return 24} 25 26 27if ![istarget "i?86-*linux*"] then { 28 verbose "Skipping i386 reverse tests." 29 return 30} 31 32standard_testfile 33 34# some targets have leading underscores on assembly symbols. 35set additional_flags [gdb_target_symbol_prefix_flags] 36 37if {[prepare_for_testing "failed to prepare" $testfile $srcfile \ 38 [list debug $additional_flags]]} { 39 return -1 40} 41 42set end_of_main [gdb_get_line_number " end of main "] 43set end_of_inc_dec_tests [gdb_get_line_number " end inc_dec_tests "] 44 45runto main 46 47if [supports_process_record] { 48 # Activate process record/replay 49 gdb_test_no_output "record" "turn on process record" 50} 51 52global hex 53global decimal 54 55gdb_test "step" "inc .eax.*" "step to inc eax 1st time" 56send_gdb "info reg eax\n" 57gdb_expect { 58 -re "eax *($hex)\[ \t\]+.*$gdb_prompt " { 59 set preinc_eax $expect_out(1,string) 60 } 61} 62 63gdb_test "step" "inc .ecx.*" "step to inc ecx 1st time" 64send_gdb "info reg ecx\n" 65gdb_expect { 66 -re "ecx *($hex)\[ \t\]+.*$gdb_prompt " { 67 set preinc_ecx $expect_out(1,string) 68 } 69} 70 71gdb_test "step" "inc .edx.*" "step to inc edx 1st time" 72send_gdb "info reg edx\n" 73gdb_expect { 74 -re "edx *($hex)\[ \t\]+.*$gdb_prompt " { 75 set preinc_edx $expect_out(1,string) 76 } 77} 78 79gdb_test "step" "inc .ebx.*" "step to inc ebx 1st time" 80send_gdb "info reg ebx\n" 81gdb_expect { 82 -re "ebx *($hex)\[ \t\]+.*$gdb_prompt " { 83 set preinc_ebx $expect_out(1,string) 84 } 85} 86 87gdb_test "step" "inc .esp.*" "step to inc esp 1st time" 88send_gdb "info reg esp\n" 89gdb_expect { 90 -re "esp *($hex)\[ \t\]+.*$gdb_prompt " { 91 set preinc_esp $expect_out(1,string) 92 } 93} 94 95gdb_test "step" "inc .ebp.*" "step to inc ebp 1st time" 96send_gdb "info reg ebp\n" 97gdb_expect { 98 -re "ebp *($hex)\[ \t\]+.*$gdb_prompt " { 99 set preinc_ebp $expect_out(1,string) 100 } 101} 102 103gdb_test "step" "inc .esi.*" "step to inc esi 1st time" 104send_gdb "info reg esi\n" 105gdb_expect { 106 -re "esi *($hex)\[ \t\]+.*$gdb_prompt " { 107 set preinc_esi $expect_out(1,string) 108 } 109} 110 111gdb_test "step" "inc .edi.*" "step to inc edi 1st time" 112send_gdb "info reg edi\n" 113gdb_expect { 114 -re "edi *($hex)\[ \t\]+.*$gdb_prompt " { 115 set preinc_edi $expect_out(1,string) 116 } 117} 118 119gdb_test "step" "dec .eax.*" "step to dec eax 1st time" 120send_gdb "info reg eax\n" 121gdb_expect { 122 -re "eax *($hex)\[ \t\]+.*$gdb_prompt " { 123 set predec_eax $expect_out(1,string) 124 } 125} 126 127gdb_test "step" "dec .ecx.*" "step to dec ecx 1st time" 128send_gdb "info reg ecx\n" 129gdb_expect { 130 -re "ecx *($hex)\[ \t\]+.*$gdb_prompt " { 131 set predec_ecx $expect_out(1,string) 132 } 133} 134 135gdb_test "step" "dec .edx.*" "step to dec edx 1st time" 136send_gdb "info reg edx\n" 137gdb_expect { 138 -re "edx *($hex)\[ \t\]+.*$gdb_prompt " { 139 set predec_edx $expect_out(1,string) 140 } 141} 142 143gdb_test "step" "dec .ebx.*" "step to dec ebx 1st time" 144send_gdb "info reg ebx\n" 145gdb_expect { 146 -re "ebx *($hex)\[ \t\]+.*$gdb_prompt " { 147 set predec_ebx $expect_out(1,string) 148 } 149} 150 151gdb_test "step" "dec .esp.*" "step to dec esp 1st time" 152send_gdb "info reg esp\n" 153gdb_expect { 154 -re "esp *($hex)\[ \t\]+.*$gdb_prompt " { 155 set predec_esp $expect_out(1,string) 156 } 157} 158 159gdb_test "step" "dec .ebp.*" "step to dec ebp 1st time" 160send_gdb "info reg ebp\n" 161gdb_expect { 162 -re "ebp *($hex)\[ \t\]+.*$gdb_prompt " { 163 set predec_ebp $expect_out(1,string) 164 } 165} 166 167gdb_test "step" "dec .esi.*" "step to dec esi 1st time" 168send_gdb "info reg esi\n" 169gdb_expect { 170 -re "esi *($hex)\[ \t\]+.*$gdb_prompt " { 171 set predec_esi $expect_out(1,string) 172 } 173} 174 175gdb_test "step" "dec .edi.*" "step to dec edi 1st time" 176send_gdb "info reg edi\n" 177gdb_expect { 178 -re "edi *($hex)\[ \t\]+.*$gdb_prompt " { 179 set predec_edi $expect_out(1,string) 180 } 181} 182 183# gdb_test "step" "end inc_dec_tests .*" "step to end inc_dec_tests 1st time" 184 185gdb_test "break $end_of_main" \ 186 "Breakpoint $decimal at .* line $end_of_main\." \ 187 "set breakpoint at end of main" 188 189gdb_test "continue" \ 190 " end of main .*" \ 191 "continue to end of main" 192 193gdb_test "break $end_of_inc_dec_tests" \ 194 "Breakpoint $decimal at .* line $end_of_inc_dec_tests\." \ 195 "set breakpoint at end of inc_dec_tests" 196 197gdb_test "reverse-continue" \ 198 " end inc_dec_tests .*" \ 199 "reverse to inc_dec_tests" 200 201# 202# Now reverse step, and check register values. 203# 204 205gdb_test "info reg edi" "edi *$preinc_edi\[ \t\]+.*" "edi before reverse-dec" 206gdb_test "reverse-step" "dec .edi.*" "reverse-step to dec edi" 207gdb_test "info reg edi" "edi *$predec_edi\[ \t\]+.*" "edi after reverse-dec" 208 209gdb_test "info reg esi" "esi *$preinc_esi\[ \t\]+.*" "esi before reverse-dec" 210gdb_test "reverse-step" "dec .esi.*" "reverse-step to dec esi" 211gdb_test "info reg esi" "esi *$predec_esi\[ \t\]+.*" "esi after reverse-dec" 212 213gdb_test "info reg ebp" "ebp *$preinc_ebp\[ \t\]+.*" "ebp before reverse-dec" 214gdb_test "reverse-step" "dec .ebp.*" "reverse-step to dec ebp" 215gdb_test "info reg ebp" "ebp *$predec_ebp\[ \t\]+.*" "ebp after reverse-dec" 216 217gdb_test "info reg esp" "esp *$preinc_esp\[ \t\]+.*" "esp before reverse-dec" 218gdb_test "reverse-step" "dec .esp.*" "reverse-step to dec esp" 219gdb_test "info reg esp" "esp *$predec_esp\[ \t\]+.*" "esp after reverse-dec" 220 221gdb_test "info reg ebx" "ebx *$preinc_ebx\[ \t\]+.*" "ebx before reverse-dec" 222gdb_test "reverse-step" "dec .ebx.*" "reverse-step to dec ebx" 223gdb_test "info reg ebx" "ebx *$predec_ebx\[ \t\]+.*" "ebx after reverse-dec" 224 225gdb_test "info reg edx" "edx *$preinc_edx\[ \t\]+.*" "edx before reverse-dec" 226gdb_test "reverse-step" "dec .edx.*" "reverse-step to dec edx" 227gdb_test "info reg edx" "edx *$predec_edx\[ \t\]+.*" "edx after reverse-dec" 228 229gdb_test "info reg ecx" "ecx *$preinc_ecx\[ \t\]+.*" "ecx before reverse-dec" 230gdb_test "reverse-step" "dec .ecx.*" "reverse-step to dec ecx" 231gdb_test "info reg ecx" "ecx *$predec_ecx\[ \t\]+.*" "ecx after reverse-dec" 232 233gdb_test "info reg eax" "eax *$preinc_eax\[ \t\]+.*" "eax before reverse-dec" 234gdb_test "reverse-step" "dec .eax.*" "reverse-step to dec eax" 235gdb_test "info reg eax" "eax *$predec_eax\[ \t\]+.*" "eax after reverse-dec" 236 237gdb_test "info reg edi" "edi *$predec_edi\[ \t\]+.*" "edi before reverse-inc" 238gdb_test "reverse-step" "inc .edi.*" "reverse-step to inc edi" 239gdb_test "info reg edi" "edi *$preinc_edi\[ \t\]+.*" "edi after reverse-inc" 240 241gdb_test "info reg esi" "esi *$predec_esi\[ \t\]+.*" "esi before reverse-inc" 242gdb_test "reverse-step" "inc .esi.*" "reverse-step to inc esi" 243gdb_test "info reg esi" "esi *$preinc_esi\[ \t\]+.*" "esi after reverse-inc" 244 245gdb_test "info reg ebp" "ebp *$predec_ebp\[ \t\]+.*" "ebp before reverse-inc" 246gdb_test "reverse-step" "inc .ebp.*" "reverse-step to inc ebp" 247gdb_test "info reg ebp" "ebp *$preinc_ebp\[ \t\]+.*" "ebp after reverse-inc" 248 249gdb_test "info reg esp" "esp *$predec_esp\[ \t\]+.*" "esp before reverse-inc" 250gdb_test "reverse-step" "inc .esp.*" "reverse-step to inc esp" 251gdb_test "info reg esp" "esp *$preinc_esp\[ \t\]+.*" "esp after reverse-inc" 252 253gdb_test "info reg ebx" "ebx *$predec_ebx\[ \t\]+.*" "ebx before reverse-inc" 254gdb_test "reverse-step" "inc .ebx.*" "reverse-step to inc ebx" 255gdb_test "info reg ebx" "ebx *$preinc_ebx\[ \t\]+.*" "ebx after reverse-inc" 256 257gdb_test "info reg edx" "edx *$predec_edx\[ \t\]+.*" "edx before reverse-inc" 258gdb_test "reverse-step" "inc .edx.*" "reverse-step to inc edx" 259gdb_test "info reg edx" "edx *$preinc_edx\[ \t\]+.*" "edx after reverse-inc" 260 261gdb_test "info reg ecx" "ecx *$predec_ecx\[ \t\]+.*" "ecx before reverse-inc" 262gdb_test "reverse-step" "inc .ecx.*" "reverse-step to inc ecx" 263gdb_test "info reg ecx" "ecx *$preinc_ecx\[ \t\]+.*" "ecx after reverse-inc" 264 265gdb_test "info reg eax" "eax *$predec_eax\[ \t\]+.*" "eax before reverse-inc" 266gdb_test "reverse-step" "inc .eax.*" "reverse-step to inc eax" 267gdb_test "info reg eax" "eax *$preinc_eax\[ \t\]+.*" "eax after reverse-inc" 268 269 270