aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.arch/powerpc-plxv-nonrel.exp
blob: 446b2bdd39aa182e57f64bd02f58ab66b4c865a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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*-*] || [skip_power_isa_3_1_tests] } {
    verbose "Skipping powerpc ISA 3.1 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"