1# Copyright (C) 2012-2013 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# Test single-step on bbit.
17
18if ![istarget "*octeon*"] {
19  return -1
20}
21
22proc current_insn {} {
23    global gdb_prompt
24
25    send_gdb "x/i \$pc\n"
26    gdb_expect {
27	-re ".*?:\\s+\(.*?\)\\s*$gdb_prompt $" {
28	    set insn $expect_out(1,string)
29	    return $insn
30	}
31    }
32    return ""
33}
34
35proc single_step {} {
36    global gdb_prompt
37
38    send_gdb "si\n"
39    gdb_expect {
40	-re "$gdb_prompt \$" {
41	    return 1
42	}
43    }
44    return 0;
45}
46
47proc single_step_until { match } {
48    global timeout
49
50    set insn [current_insn]
51    set start [timestamp]
52    while { $insn != "" && [timestamp] - $start < 3*$timeout } {
53	if [regexp $match $insn] {
54	    return 1
55	}
56	if {![single_step]} {
57	    return 0
58	}
59	set insn [current_insn]
60    }
61    return 0;
62}
63
64proc test_bbit { name taken } {
65    if {![single_step_until "bbit"]} {
66	fail "$name single-step until bbit"
67	return
68    }
69    pass "$name single-step until bbit"
70    gdb_test "si" "" "$name single-step on bbit"
71    if [regexp "li\\s+\[sv\]0,$taken" [current_insn]] {
72	pass "$name check insn after bbit"
73    } else {
74	send_log "expected: li\\s+\[sv\]0,$taken found [current_insn]\n"
75	fail "$name check insn after bbit"
76    }
77}
78
79set testfile "mips-octeon-bbit"
80set srcfile ${testfile}.c
81set binfile ${objdir}/${subdir}/${testfile}
82
83if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \
84       {debug nowarnings}] != "" } {
85     fail "compilation"
86     return
87}
88
89pass "compilation"
90
91gdb_exit
92gdb_start
93gdb_reinitialize_dir $srcdir/$subdir
94gdb_load ${binfile}
95# Native needs run.
96runto_main
97
98set tests ""
99foreach n [list "0_10" "0_36" "1_20" "1_49"] {
100    lappend tests "bbit_is_taken_$n"
101}
102foreach func $tests {
103    gdb_test "break $func" "Breakpoint.*at.*" "set breakpoint on $func"
104}
105
106foreach func $tests {
107    gdb_test "continue" "Continuing.*Breakpoint.*$func.*" "hit $func first"
108    test_bbit "$func branch taken" 1
109    gdb_test "continue" "Continuing.*Breakpoint.*$func.*" "hit $func second"
110    test_bbit "$func branch not taken" 0
111}
112