forked from Imagelibrary/binutils-gdb
Switch the license of all .f and .f90 files to GPLv3.
Switch the license of all .s and .S files to GPLv3.
432 lines
11 KiB
Plaintext
432 lines
11 KiB
Plaintext
# Copyright 2003, 2004, 2005, 2006, 2007 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/>.
|
|
|
|
# This file was written by Elena Zannoni (ezannoni@cygnus.com)
|
|
|
|
if $tracelevel then {
|
|
strace $tracelevel
|
|
}
|
|
|
|
|
|
# are we on a target board? If so, don't run these tests.
|
|
# note: this is necessary because we cannot use runto_main (which would
|
|
# work for remote targets too) because of the different prompt we get
|
|
# when using annotation level 2.
|
|
#
|
|
if [is_remote target] then {
|
|
return 0
|
|
}
|
|
|
|
|
|
#
|
|
# test running programs
|
|
#
|
|
set prms_id 0
|
|
set bug_id 0
|
|
|
|
set testfile "annota3"
|
|
set srcfile ${testfile}.c
|
|
set binfile ${objdir}/${subdir}/${testfile}$EXEEXT
|
|
|
|
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
|
|
untested annota3.exp
|
|
return -1
|
|
}
|
|
|
|
|
|
gdb_exit
|
|
gdb_start
|
|
gdb_reinitialize_dir $srcdir/$subdir
|
|
gdb_load ${binfile}
|
|
|
|
if [target_info exists gdb_stub] {
|
|
gdb_step_for_stub;
|
|
}
|
|
|
|
#
|
|
# the line at which break main will put the breakpoint
|
|
#
|
|
set main_line 32
|
|
|
|
# The commands we test here produce many lines of output; disable "press
|
|
# <return> to continue" prompts.
|
|
send_gdb "set height 0\n"
|
|
gdb_expect -re "$gdb_prompt $"
|
|
|
|
#
|
|
# break at main
|
|
#
|
|
gdb_test "break main" \
|
|
"Breakpoint.*at.* file .*$srcfile, line.*" \
|
|
"breakpoint main"
|
|
|
|
|
|
# NOTE: this prompt is OK only when the annotation level is > 1
|
|
|
|
# NOTE: When this prompt is in use the gdb_test procedure cannot be
|
|
# used because it assumes that the last char after the gdb_prompt is a
|
|
# white space. This is not true with this annotated prompt. So we must
|
|
# use send_gdb and gdb_expect or gdb_expect_list.
|
|
|
|
set old_gdb_prompt $gdb_prompt
|
|
set gdb_prompt "\r\n\032\032pre-prompt\r\n$gdb_prompt \r\n\032\032prompt\r\n"
|
|
|
|
|
|
|
|
#
|
|
# set the annotation level to 3
|
|
#
|
|
# of course, this will test:
|
|
# annotate-pre-prompt
|
|
# annotate-prompt
|
|
# annotate-post-prompt (in the next block)
|
|
#
|
|
send_gdb "set annotate 3\n"
|
|
gdb_expect_list "annotation set at level 3" "\r\n$gdb_prompt$" {
|
|
"set annotate 3"
|
|
}
|
|
|
|
#
|
|
# if construct:
|
|
#
|
|
send_gdb "if 1\n"
|
|
gdb_expect {
|
|
-re "^if 1\r\n\r\n\032\032post-prompt\r\n\r\n\032\032pre-commands\r\n >\r\n\032\032commands\r\n$" {
|
|
pass "start if construct"
|
|
}
|
|
-re ".*\032\032commands\r\n" {
|
|
fail "start if construct"
|
|
}
|
|
timeout { fail "start if construct (timeout)" }
|
|
}
|
|
send_gdb "end\n"
|
|
gdb_expect {
|
|
-re "^end\r\n\r\n\032\032post-commands\r\n$gdb_prompt$" {
|
|
pass "end if construct"
|
|
}
|
|
-re ".*$gdb_prompt$" {
|
|
fail "end if construct"
|
|
}
|
|
timeout { fail "end if construct (timeout)" }
|
|
}
|
|
#
|
|
# info break:
|
|
#
|
|
send_gdb "info break\n"
|
|
gdb_expect_list "breakpoint info" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Num Type Disp Enb Address +What\r\n"
|
|
"1 breakpoint keep y 0x\[0-9a-zA-Z\]+ +in main at .*annota3.c:32\r\n"
|
|
}
|
|
|
|
|
|
#
|
|
# run to a break point will test:
|
|
#
|
|
#exp_internal 1
|
|
send_gdb "run\n"
|
|
gdb_expect_list "run until main breakpoint" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Starting program: .*annota3(|\.exe) \r\n"
|
|
"\r\n\032\032starting\r\n"
|
|
"\r\n\032\032breakpoint 1\r\n"
|
|
"\r\n"
|
|
"Breakpoint 1, "
|
|
"\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n"
|
|
"main \\(\\) at .*annota3.c:32\r\n"
|
|
"\r\n\032\032source.*annota3.c:32:.*:beg:0x\[0-9a-z\]+\r\n"
|
|
"\r\n\032\032stopped\r\n"
|
|
}
|
|
#exp_internal 0
|
|
#exit 0
|
|
|
|
#
|
|
# Let's do a next, to get to a point where the array is initialized
|
|
# We don't care about the annotated output for this operation, it is the same as
|
|
# the one produced by run above
|
|
#
|
|
send_gdb "next\n"
|
|
gdb_expect_list "go after array init line" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"\r\n\032\032starting\r\n"
|
|
"\r\n\032\032source .*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
|
|
"\r\n\032\032stopped\r\n"
|
|
}
|
|
|
|
|
|
#
|
|
# printing the array:
|
|
#
|
|
send_gdb "print my_array\n"
|
|
gdb_expect_list "print array" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
".*= .1, 2, 3.\r\n"
|
|
}
|
|
|
|
|
|
#
|
|
# this should generate an error message, so to test:
|
|
# annotate-error-begin
|
|
# FIXME: annotate-error not tested
|
|
#
|
|
|
|
#exp_internal 1
|
|
send_gdb "print non_existent_value\n"
|
|
gdb_expect_list "print non_existent_value" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"\r\n\032\032error-begin\r\n"
|
|
"No symbol \"non_existent_value\" in current context.\r\n"
|
|
"\r\n\032\032error\r\n"
|
|
}
|
|
|
|
|
|
#
|
|
# break at signal handler
|
|
#
|
|
send_gdb "break handle_USR1\n"
|
|
gdb_expect_list "breakpoint handle_USR1" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Breakpoint.*at 0x\[0-9a-z\]+: file.*annota3.c, line.*\r\n"
|
|
}
|
|
|
|
#
|
|
# break at printf. When we are stopped at printf, we can test
|
|
#
|
|
send_gdb "break printf\n"
|
|
gdb_expect_list "breakpoint printf" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Breakpoint.*at 0x\[0-9a-z\]+.*"
|
|
}
|
|
|
|
#
|
|
# get to printf
|
|
#
|
|
send_gdb "continue\n"
|
|
gdb_expect_list "continue to printf" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Continuing.\r\n"
|
|
"\r\n\032\032starting\r\n"
|
|
"\r\n\032\032breakpoint 3\r\n"
|
|
"\r\n"
|
|
"Breakpoint 3, \[^\r\n\]*\r\n"
|
|
"\r\n\032\032stopped\r\n"
|
|
}
|
|
|
|
send_gdb "backtrace\n"
|
|
gdb_expect_list "backtrace from shlibrary" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"#0 .* .*printf \[^\r\n\]*\r\n"
|
|
"#1 .* main \[^\r\n\]*\r\n"
|
|
}
|
|
|
|
|
|
#
|
|
# test printing a frame with some arguments:
|
|
#
|
|
|
|
if [target_info exists gdb,nosignals] {
|
|
unsupported "send SIGUSR1"
|
|
unsupported "backtrace @ signal handler"
|
|
} else {
|
|
send_gdb "signal SIGUSR1\n"
|
|
gdb_expect_list "send SIGUSR1" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Continuing with signal SIGUSR1.\r\n"
|
|
"\r\n\032\032starting\r\n"
|
|
"\r\n\032\032breakpoint 2\r\n"
|
|
"\r\n"
|
|
"Breakpoint 2, "
|
|
"\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n"
|
|
"handle_USR1 \\(sig=\[0-9\]+\\) at .*annota3.c:\[0-9\]+\r\n"
|
|
"\r\n\032\032source .*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
|
|
"\r\n\032\032stopped\r\n"
|
|
}
|
|
|
|
#
|
|
# test:
|
|
#
|
|
verbose "match_max local is: [match_max]"
|
|
verbose "match_max default is: [match_max -d]"
|
|
# This is necessary because a 2000 buffer is not enought to get everything
|
|
# up to the prompt ad the test gets a timeout.
|
|
match_max 3000
|
|
verbose "match_max now is: [match_max]"
|
|
send_gdb "backtrace\n"
|
|
gdb_expect_list "backtrace @ signal handler" "$gdb_prompt$" {
|
|
"#0 +handle_USR1 \[^\r\n\]+\r\n"
|
|
"#1 +.signal handler called.\r\n"
|
|
"#2 .* .*printf \[^\r\n\]+\r\n"
|
|
"#3 .* main \[^\r\n\]+\r\n"
|
|
}
|
|
}
|
|
|
|
#
|
|
# delete all the breakpoints
|
|
#
|
|
send_gdb "delete 1\n"
|
|
gdb_expect_list "delete bp 1" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
}
|
|
|
|
send_gdb "delete 2\n"
|
|
gdb_expect_list "delete bp 2" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
}
|
|
|
|
send_gdb "delete 3\n"
|
|
gdb_expect_list "delete bp 3" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
}
|
|
|
|
#
|
|
# break at main, after value is initialized. This is in preparation
|
|
# to test the annotate output for the display command.
|
|
#
|
|
send_gdb "break main\n"
|
|
gdb_expect_list "break at 28" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Breakpoint 4 at 0x\[0-9a-z\]+: file .*annota3.c, line 32.\r\n"
|
|
}
|
|
|
|
#
|
|
# display the value
|
|
#
|
|
send_gdb "display value\n"
|
|
gdb_expect_list "set up display" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"1: value = 7\r\n"
|
|
}
|
|
|
|
|
|
# should ask query. Test annotate-query.
|
|
# we don't care about anything else here, only the query.
|
|
|
|
send_gdb "run\n"
|
|
gdb_expect {
|
|
-re "pre-query.*already.*\\(y or n\\).*query\r\n" {
|
|
send_gdb "y\n"
|
|
gdb_expect {
|
|
-re ".*post-query.*$gdb_prompt$" \
|
|
{ pass "re-run" }
|
|
-re ".*$gdb_prompt$" { fail "re-run" }
|
|
timeout { fail "re-run (timeout)" }
|
|
}
|
|
}
|
|
-re ".*$gdb_prompt$" { fail "re-run" }
|
|
timeout { fail "re-run (timeout)" }
|
|
}
|
|
|
|
#
|
|
# Test that breakpoints-invalid is issued once and only once for
|
|
# breakpoint ignore count changes, after annotation stopped.
|
|
# NOTE: breakpoints-invalid annotations have been removed from
|
|
# level 3 but keep these tests for continuity and comparison
|
|
# with annota1.exp.
|
|
send_gdb "break 46\n"
|
|
gdb_expect_list "break at 46" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Breakpoint 5 at 0x\[0-9a-z\]+: file .*annota3.c, line 46.\r\n"
|
|
}
|
|
|
|
send_gdb "ignore 5 4\n"
|
|
gdb_expect_list "ignore 5 4" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Will ignore next 4 crossings of breakpoint 5"
|
|
"\r\n"
|
|
}
|
|
|
|
send_gdb "continue\n"
|
|
gdb_expect_list "annotate ignore count change" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"\r\n\032\032breakpoint 5\r\n"
|
|
"\r\n"
|
|
"Breakpoint 5, "
|
|
"\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n"
|
|
"main \\(\\) at .*annota3.c:46\r\n"
|
|
"\r\n\032\032source .*annota3.c:46:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
|
|
"1: value = 11\r\n"
|
|
"\r\n\032\032stopped\r\n"
|
|
}
|
|
|
|
# check that ignore command is working, or the above can provide
|
|
# misleading assurance ...
|
|
|
|
send_gdb "next\n"
|
|
gdb_expect_list "next to exit loop" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"\r\n\032\032starting\r\n"
|
|
"\r\n\032\032source.*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
|
|
"1: value = 12\r\n"
|
|
"\r\n\032\032stopped\r\n"
|
|
}
|
|
|
|
send_gdb "next\n"
|
|
gdb_expect_list "breakpoint ignore count" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"\r\n\032\032starting\r\n"
|
|
"\r\n\032\032source.*annota3.c:49:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
|
|
"1: value = 12\r\n"
|
|
"\r\n\032\032stopped\r\n"
|
|
}
|
|
|
|
#
|
|
# Send a signal that is not handled
|
|
#
|
|
# SIGTRAP signals are dropped before they get to the inferior process
|
|
# on hpux11. In theory, this behaivor can be controlled by setting
|
|
# TTEO_NORM_SIGTRAP in the inferior, but doing so did not cause
|
|
# the signal to be properly delivered.
|
|
#
|
|
# It has been verified that other signals will be delivered. However,
|
|
# rather than twiddle the test, I choose to leave it as-is as it
|
|
# exposes an interesting failure on hpux11.
|
|
|
|
if [target_info exists gdb,nosignals] {
|
|
unsupported "signal sent"
|
|
} else {
|
|
setup_xfail hppa*-*-hpux11*
|
|
send_gdb "signal SIGTRAP\n"
|
|
gdb_expect_list "signal sent" "$gdb_prompt$" {
|
|
"\r\n\032\032post-prompt\r\n"
|
|
"Continuing with signal SIGTRAP.\r\n"
|
|
"\r\n\032\032starting\r\n"
|
|
"\r\n\032\032signalled\r\n"
|
|
"\r\nProgram terminated with signal SIGTRAP, Trace.breakpoint trap.\r\n"
|
|
"The program no longer exists.\r\n"
|
|
"\r\n\032\032stopped\r\n"
|
|
}
|
|
}
|
|
|
|
|
|
# Check for production of a core file and remove it!
|
|
|
|
set exec_output [remote_exec build "ls core"]
|
|
|
|
set test "cleanup core file"
|
|
if [ regexp "core not found" $exec_output] {
|
|
pass "$test (not dumped)"
|
|
} else {
|
|
if [ regexp "No such file or directory" $exec_output] {
|
|
pass "$test (not dumped)"
|
|
} else {
|
|
remote_exec build "rm -f core"
|
|
pass "$test (removed)"
|
|
}
|
|
}
|
|
|
|
# restore the original prompt for the rest of the testsuite
|
|
|
|
set gdb_prompt $old_gdb_prompt
|