| 1 | # Copyright 1997, 1998, 1999, 2000, 2001, 2003, 2007, 2008, 2009, 2010 |
| 2 | # Free Software Foundation, Inc. |
| 3 | |
| 4 | # This program is free software; you can redistribute it and/or modify |
| 5 | # it under the terms of the GNU General Public License as published by |
| 6 | # the Free Software Foundation; either version 3 of the License, or |
| 7 | # (at your option) any later version. |
| 8 | # |
| 9 | # This program is distributed in the hope that it will be useful, |
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | # GNU General Public License for more details. |
| 13 | # |
| 14 | # You should have received a copy of the GNU General Public License |
| 15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 16 | |
| 17 | # display.exp Test display commands |
| 18 | # Also do some printing stuff for coverage's sake. |
| 19 | # |
| 20 | if $tracelevel then { |
| 21 | strace $tracelevel |
| 22 | } |
| 23 | |
| 24 | set testfile display |
| 25 | set srcfile ${testfile}.c |
| 26 | set binfile ${objdir}/${subdir}/${testfile} |
| 27 | |
| 28 | |
| 29 | |
| 30 | if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { |
| 31 | untested display.exp |
| 32 | return -1 |
| 33 | } |
| 34 | if [target_info exists gdb_stub] { |
| 35 | gdb_step_for_stub; |
| 36 | } |
| 37 | |
| 38 | # Preserve the old timeout, and set a new one that should be |
| 39 | # sufficient to avoid timing out during this test. |
| 40 | set oldtimeout $timeout |
| 41 | set timeout [expr "$timeout + 60"] |
| 42 | verbose "Timeout is now $timeout seconds" 2 |
| 43 | |
| 44 | # use this to debug: |
| 45 | #log_user 1 |
| 46 | |
| 47 | gdb_exit |
| 48 | gdb_start |
| 49 | gdb_reinitialize_dir $srcdir/$subdir |
| 50 | gdb_load ${binfile} |
| 51 | |
| 52 | # Some coverage stuff |
| 53 | # |
| 54 | if ![target_info exists use_gdb_stub] { |
| 55 | gdb_test "kill" ".*The program is not being run.*" |
| 56 | gdb_test "detach" ".*" |
| 57 | gdb_test "run" ".*" |
| 58 | |
| 59 | gdb_load ${binfile} |
| 60 | gdb_test "kill" ".*" "kill again" |
| 61 | gdb_test "detach" ".*" "detach again" |
| 62 | |
| 63 | gdb_exit |
| 64 | gdb_start |
| 65 | gdb_reinitialize_dir $srcdir/$subdir |
| 66 | gdb_load ${binfile} |
| 67 | } |
| 68 | |
| 69 | # Ok, on to real life |
| 70 | # |
| 71 | if ![runto_main] then { |
| 72 | fail "Could not run to main - other tests will fail." |
| 73 | continue |
| 74 | } |
| 75 | |
| 76 | # Disable hardware watchpoints if necessary. |
| 77 | if [target_info exists gdb,no_hardware_watchpoints] { |
| 78 | gdb_test "set can-use-hw-watchpoints 0" "" "" |
| 79 | } |
| 80 | |
| 81 | set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] |
| 82 | gdb_test "break $bp_location1" ".*Breakpoint 2.*" "break do_loops" |
| 83 | gdb_test "cont" ".*Breakpoint 2, do_loops.*" "get to do_loops" |
| 84 | |
| 85 | # Create stopping points. |
| 86 | # |
| 87 | gdb_test "watch sum" ".*\[Ww\]atchpoint 3: sum.*" "set watch" |
| 88 | set bp_location2 [gdb_get_line_number "set breakpoint 2 here"] |
| 89 | gdb_test "break $bp_location2" ".*Breakpoint 4.*" "break loop end" |
| 90 | |
| 91 | # Create displays for those points |
| 92 | # |
| 93 | gdb_test "info disp" ".*There are no auto-display expressions now..*" "inf disp" |
| 94 | gdb_test "disp i" ".*1: i = 0.*" "display i" |
| 95 | gdb_test "disp/x j" ".*2: /x j = 0x0.*" "display j" |
| 96 | gdb_test "disp/i &k" ".*3: x/i &k(\r\n| ) $hex:.*" "display &k" |
| 97 | gdb_test "disp/f f" ".*4: /f f = 3.1415*" "display/f f" |
| 98 | gdb_test "disp/s &sum" ".*5: x/s &sum $hex.*sum.:.*" "display/s &sum" |
| 99 | |
| 100 | # Hit the displays |
| 101 | # |
| 102 | gdb_test "cont" ".*\[Ww\]atchpoint 3: sum.*\[1-9\]*: x/s &sum.*\[1-9\]*: /f f = 3.1415\r\n\[1-9\]*: x/i &k.*\r\n\[1-9\]*: /x j = 0x0\r\n\[1-9\]*: i = 0.*" "first disp" |
| 103 | gdb_test "cont" ".*\[Ww\]atchpoint 3: sum.*\[1-9\]*: x/s &sum.*\[1-9\]*: /f f = 4.1415\r\n\[1-9\]*: x/i &k.*\r\n\[1-9\]*: /x j = 0x0.*\[1-9\]*: i = 0.*" "second disp" |
| 104 | |
| 105 | gdb_test "enab disp 6" ".*No display number 6..*" "catch err" |
| 106 | gdb_test "disab disp 1" ".*" "disab disp 1" |
| 107 | gdb_test "disab disp 2" ".*" "disab disp 2" |
| 108 | gdb_test "enab disp 1" ".*" "re-enab" |
| 109 | gdb_test "enab disp 1" ".*" "re-enab of enab" |
| 110 | gdb_test "undisp 5" ".*" "undisp" |
| 111 | gdb_test "info disp" ".*Auto-display expressions now in effect.*y /f f.*y /1bi &k.*n /x j.*y i.*" "info disp" |
| 112 | |
| 113 | gdb_test "cont" ".*\[Ww\]atch.*5.1415.*.*i = 0.*" "next hit" |
| 114 | |
| 115 | send_gdb "undisp\n" |
| 116 | gdb_expect { |
| 117 | -re ".*Delete all auto-display expressions.*y or n. $" { |
| 118 | send_gdb "y\n" |
| 119 | gdb_expect { |
| 120 | -re "y\r\n$gdb_prompt $" { |
| 121 | pass "undisp all" |
| 122 | } |
| 123 | -re ".*$gdb_prompt $" { |
| 124 | fail "some un-helpful response" |
| 125 | } |
| 126 | -re ".*Delete all.*$" { |
| 127 | fail "re-ask question" |
| 128 | } |
| 129 | timeout { fail "timeout" } |
| 130 | } |
| 131 | } |
| 132 | -re ".*$gdb_prompt $" { |
| 133 | fail "undisp all" |
| 134 | } |
| 135 | timeout { fail "timeout" } |
| 136 | } |
| 137 | |
| 138 | gdb_test "disab 3" ".*.*" "disab 3" |
| 139 | gdb_test "cont" ".*Breakpoint 4.*" "watch off" |
| 140 | |
| 141 | # Now the printf tests |
| 142 | # |
| 143 | # The "finish" command may leave us mid-line in the caller on some |
| 144 | # targets, including but not limited to the m68k, i386 & PA. So we |
| 145 | # have to arrange to step until we hit the line with the call to |
| 146 | # "do_vars". |
| 147 | send_gdb "finish\n" |
| 148 | gdb_expect { |
| 149 | -re ".*do_loops\\(\\);.*$gdb_prompt $" { |
| 150 | send_gdb "step\n" |
| 151 | exp_continue |
| 152 | } |
| 153 | -re ".*do_vars.*$gdb_prompt $" { |
| 154 | pass "finish" |
| 155 | } |
| 156 | -re ".*$gdb_prompt $" { |
| 157 | fail "finish" |
| 158 | gdb_suppress_tests |
| 159 | } |
| 160 | timeout { |
| 161 | fail "(timeout) finish" |
| 162 | gdb_suppress_tests |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | gdb_test "step" ".*do_vars.*.*i = 9.*" |
| 167 | set bp_location3 [gdb_get_line_number "set breakpoint 3 here"] |
| 168 | gdb_test "tbreak $bp_location3" ".*breakpoint 5 a.*" "tbreak in do_vars" |
| 169 | gdb_test "cont" ".*do_vars.*$bp_location3.*$bp_location3.*" |
| 170 | |
| 171 | # Beat on printf a bit |
| 172 | # |
| 173 | gdb_test "printf" ".*Argument required.*" |
| 174 | gdb_test "printf %d" ".*Bad format string, missing.*" |
| 175 | gdb_test "printf \"%d" ".*Bad format string, non-terminated.*" |
| 176 | gdb_test "printf \"%d%d\",i" ".*Wrong number of arguments.*" |
| 177 | gdb_test "printf \"\\\\!\\a\\f\\r\\t\\v\\b\\n\"" ".*!.*" |
| 178 | gdb_test "printf \"\"" ".*" "re-set term" |
| 179 | gdb_test "printf \"\\w\"" ".*Unrecognized escape character.*" |
| 180 | gdb_test "printf \"%d\" j" ".*Invalid argument syntax.*" |
| 181 | gdb_test "printf \"%p\\n\", 0" "\\(nil\\)" |
| 182 | gdb_test "printf \"%p\\n\", 1" "0x1" |
| 183 | |
| 184 | # play with "print", too |
| 185 | # |
| 186 | gdb_test "print/z j" ".*Undefined output format.*" |
| 187 | gdb_test "print/d j" " = 0\[\\r\\n\]+" "debug test output 1" |
| 188 | gdb_test "print/r j" " = 0\[\\r\\n\]+" "debug test output 1a" |
| 189 | gdb_test "print/x j" " = 0x0\[\\r\\n\]+" "debug test output 2" |
| 190 | gdb_test "print/r j" " = 0x0\[\\r\\n\]+" "debug test output 2a" |
| 191 | gdb_test "print j" " = 0\[\\r\\n\]+" "debug test output 3" |
| 192 | |
| 193 | # x/0 j doesn't produce any output and terminates PA64 process when testing |
| 194 | if [istarget "hppa2.0w-hp-hpux11*"] { |
| 195 | xfail "'x/0 j' terminates PA64 process - skipped test point" |
| 196 | } else { |
| 197 | gdb_test "x/0 j" ".*" |
| 198 | } |
| 199 | if [istarget "hppa*-hp-hpux*"] { |
| 200 | # on HP-UX you could access the first page without getting an error |
| 201 | gdb_test "x/rx j" ".*(Cannot access|Error accessing) memory.*|.*0xa:\[ \t\]*\[0-9\]+.*" |
| 202 | } |
| 203 | gdb_test "print/0 j" ".*Item count other than 1 is meaningless.*" "print/0 j" |
| 204 | gdb_test "print/s sum" " = 1000" "ignored s" |
| 205 | gdb_test "print/i sum" ".*Format letter.*is meaningless.*.*" "no i" |
| 206 | gdb_test "print/a &sum" ".*= $hex.*<sum>.*" |
| 207 | # If the constant below is larger than the length of main, then |
| 208 | # this test will (incorrectly) fail. So use a small number. |
| 209 | gdb_test "print/a main+4" ".*= $hex.*<.*>.*" |
| 210 | gdb_test "print/a \$pc" ".*= $hex.*<do_vars+.*>.*" |
| 211 | gdb_test "print/a &&j" ".*A .* error in expression.*" |
| 212 | |
| 213 | # Done! |
| 214 | # |
| 215 | gdb_exit |
| 216 | |
| 217 | # Restore the preserved old timeout value. |
| 218 | set timeout $oldtimeout |
| 219 | verbose "Timeout is now $timeout seconds" 2 |
| 220 | |
| 221 | return 0 |