OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [testsuite/] [gdb.arch/] [thumb2-it.exp] - Blame information for rev 841

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
# Copyright 2010 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 .
15
 
16
# Test single stepping over Thumb-2 IT blocks.
17
 
18
if {![istarget arm*-*eabi*]} then {
19
    verbose "Skipping Thumb-2 tests."
20
    return
21
}
22
 
23
set testfile "thumb2-it"
24
set srcfile ${testfile}.S
25
set binfile ${objdir}/${subdir}/${testfile}
26
 
27
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug] != "" } {
28
    untested thumb2-it.exp
29
    return -1
30
}
31
 
32
gdb_exit
33
gdb_start
34
gdb_reinitialize_dir $srcdir/$subdir
35
gdb_load ${binfile}
36
 
37
if ![runto_main] then {
38
    untested thumb2-it.exp
39
    return -1
40
}
41
 
42
# Make sure that the compiler options allow Thumb-2.
43
gdb_test_multiple "list" "list main" {
44
    -re ".*@ No Thumb-2.*$gdb_prompt $" {
45
        pass "list main"
46
        untested thumb2-it.exp
47
        return -1
48
    }
49
    -re ".*@ Thumb-2 OK.*$gdb_prompt $" {
50
        pass "list main"
51
    }
52
}
53
 
54
proc test_it_block { func } {
55
    global gdb_prompt
56
    global software_step
57
 
58
    if { ! [gdb_breakpoint "*${func}"] } {
59
        unresolved "$func, IT block tests"
60
        return
61
    }
62
 
63
    gdb_test "call ${func}()" "Breakpoint.*@ Setup.*" "$func, call"
64
 
65
    set expected 0
66
    set reached 0
67
    set steps 0
68
    set ok 1
69
    while { $ok } {
70
        set ok 0
71
        set msg "$func, stepi $steps"
72
        gdb_test_multiple "stepi" "$msg" {
73
            -re ".*@ Setup.*$gdb_prompt $" {
74
                pass "$msg"
75
                set ok 1
76
            }
77
            -re ".*@ IT instruction, Expected == (\[0-9\]*)\r\n$gdb_prompt $" {
78
                set expected $expect_out(1,string)
79
                pass "$msg"
80
                set ok 1
81
            }
82
            -re ".*@ Reached.*$gdb_prompt $" {
83
                incr reached
84
                pass "$msg"
85
                set ok 1
86
                if { [regexp {@ Reached, Set ([^\r\n]*)\r\n} $expect_out(0,string) dummy change] } {
87
                    gdb_test "set $change" "" "$func, set $change"
88
                }
89
            }
90
            -re ".*@ Not reached.*$gdb_prompt $" {
91
                # An instruction in an IT block whose predicate is false when
92
                # we reach it.  If using software single step, we should not
93
                # stop here.
94
                if { $software_step } {
95
                    fail "$msg"
96
                } else {
97
                    pass "$msg"
98
                    set ok 1
99
                }
100
            }
101
            -re ".*@ Never reached.*$gdb_prompt $" {
102
                # An instruction that should be branched over.
103
                fail "$msg"
104
            }
105
            -re ".*@ Done.*$gdb_prompt $" {
106
                pass "$msg"
107
                if { $reached == $expected } {
108
                    pass "$func, correct instructions reached"
109
                } else {
110
                    fail "$func, correct instructions reached"
111
                }
112
                if { [regexp {@ Done, Check ([^\r\n]*)\r\n} $expect_out(0,string) dummy check] } {
113
                    gdb_test "print $check" ".* = 1" "$func, $check"
114
                }
115
            }
116
        }
117
        if { ! $ok } {
118
            break
119
        }
120
        incr steps
121
        continue
122
    }
123
 
124
    gdb_test "continue" "" "$func, continue"
125
    return
126
}
127
 
128
proc test_it_break { ndx } {
129
    global software_step
130
 
131
    set line [gdb_get_line_number "@ Break ${ndx}"]
132
 
133
    if { ! [gdb_breakpoint "${line}"] } {
134
        unresolved "continue to breakpoint: test ${ndx}"
135
        return
136
    }
137
 
138
    if { $software_step } {
139
        gdb_continue_to_breakpoint "test ${ndx}" ".*@ Location ${ndx}.*"
140
    } else {
141
        gdb_continue_to_breakpoint "test ${ndx}" ".*@ Break ${ndx}.*"
142
    }
143
}
144
 
145
# If we are using software single-stepping in GDB, then GDB will not
146
# stop at conditional instructions with a false predicate during stepi.
147
# If we are using a simulator or debug interface with hardware single
148
# step, then GDB will stop at such instructions.
149
if { [istarget arm*-linux*] } {
150
    set software_step 1
151
} else {
152
    set software_step 0
153
}
154
 
155
for { set i 1 } { $i <= 8 } { incr i } {
156
    test_it_block it_${i}
157
}
158
 
159
gdb_breakpoint "*it_breakpoints"
160
gdb_test "call it_breakpoints()" "Breakpoint.*"
161
for { set i 1 } { $i <= 7 } { incr i } {
162
    test_it_break ${i}
163
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.