diff options
Diffstat (limited to 'gdb/testsuite/gdb.arch/powerpc-plxv-nonrel.exp')
-rw-r--r-- | gdb/testsuite/gdb.arch/powerpc-plxv-nonrel.exp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.arch/powerpc-plxv-nonrel.exp b/gdb/testsuite/gdb.arch/powerpc-plxv-nonrel.exp new file mode 100644 index 0000000..08f1a37 --- /dev/null +++ b/gdb/testsuite/gdb.arch/powerpc-plxv-nonrel.exp @@ -0,0 +1,131 @@ +# Copyright 2021 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/>. + +# Test to see if gdb is properly single stepping over the +# displaced plxv instruction. + +if { ![istarget powerpc*-*] } { + verbose "Skipping powerpc plxv test." + return +} + +set retval 0 + +standard_testfile .s + +if { [prepare_for_testing "failed to prepare" $testfile "$srcfile" \ + {debug quiet}] } { + return -1 +} + +gdb_test "set radix 0b10000" +gdb_test "set debug displaced" + +if ![runto_main] then { + return +} + +gdb_test "set debug displaced on" + +# Proc to extract the uint128 hex value from the output of +# a print vector statement. +proc get_vector_hexadecimal_valueof { exp default {test ""} } { + set val "0x0000" + global gdb_prompt + if {$test == ""} { + set test "get vector_hexadecimal valueof \"${exp}\"" + } + gdb_test_multiple "print $${exp}.uint128" $test { + -re -wrap "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*" { + set val $expect_out(1,string) + pass "$test" + } + -re -wrap ".*Illegal instruction.* $" { + fail "Illegal instruction on print." + set val 0xffff + } + } + return ${val} +} + +# Proc to do a single-step, and ensure we gently handle +# an illegal instruction situation. +proc stepi_over_instruction { xyz } { + global gdb_prompt + gdb_test_multiple "stepi" "${xyz} " { + -re -wrap ".*Illegal instruction.*" { + fail "Illegal instruction on single step." + return + } + -re -wrap ".*" { + pass "stepi ${xyz}" + } + } +} + +set check_pc [get_hexadecimal_valueof "\$pc" "default0"] + +# set some breakpoints on the instructions below main(). +gdb_test "disas /r main" +set bp1 *$check_pc+4 +set bp2 *$check_pc+0d12 +set bp3 *$check_pc+0d20 +set bp4 *$check_pc+0d28 +gdb_breakpoint $bp1 +gdb_breakpoint $bp2 +gdb_breakpoint $bp3 +gdb_breakpoint $bp4 + +# single-step through the plxv instructions, and retrieve the +# register values as we proceed. + +stepi_over_instruction "stepi over NOP" +stepi_over_instruction "stepi over lnia" +stepi_over_instruction "stepi over addi" + +stepi_over_instruction "stepi over vs4 assignment" +set check_vs4 [get_vector_hexadecimal_valueof "vs4" "default0"] + +stepi_over_instruction "stepi over vs5 assignment" +set check_vs5 [get_vector_hexadecimal_valueof "vs5" "default0"] + +stepi_over_instruction "stepi over vs6 assignment" +set check_vs6 [get_vector_hexadecimal_valueof "vs6" "default0"] + +stepi_over_instruction "stepi over vs7 assignment" +set check_vs7 [get_vector_hexadecimal_valueof "vs7" "default0"] + +set vs4_expected 0xa5b5c5d5a4b4c4d4a3b3c3d3a2b2c2d2 +set vs5_expected 0xa7b7c7d7a6b6c6d6a5b5c5d5a4b4c4d4 +set vs6_expected 0xa9b9c9d9a8b8c8d8a7b7c7d7a6b6c6d6 +set vs7_expected 0xabbbcbdbaabacadaa9b9c9d9a8b8c8d8 + +if [expr $check_vs4 != $vs4_expected] { + fail "unexpected value vs4; actual:$check_vs4 expected:$vs4_expected" +} +if [expr $check_vs5 != $vs5_expected ] { + fail "unexpected value vs5; actual:$check_vs5 expected:$vs5_expected" +} +if [expr $check_vs6 != $vs6_expected ] { + fail "unexpected value vs6; actual:$check_vs6 expected:$vs6_expected" +} +if [expr $check_vs7 != $vs7_expected ] { + fail "unexpected value vs7; actual:$check_vs7 expected:$vs7_expected" +} + +gdb_test "info break" +gdb_test "info register vs4 vs5 vs6 vs7 " +gdb_test "disas main #2" + |