-# Copyright (C) 1998 Free Software Foundation, Inc.
+# Copyright 1998-2016 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 2 of the License, or
+# 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,
# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+# along with this program. If not, see <http://www.gnu.org/licenses/>. */
-# Please email any bugs, comments, and/or additions to this file to:
-# bug-gdb@prep.ai.mit.edu
+standard_testfile average.c sum.c
-if $tracelevel then {
- strace $tracelevel
-}
-
-set testfile1 "average"
-set testfile2 "sum"
-set testfile "dbx-test"
-set binfile1 ${objdir}/${subdir}/${testfile1}
-set binfile2 ${objdir}/${subdir}/${testfile2}
-set binfile ${objdir}/${subdir}/${testfile}
-
-
-
-if { [gdb_compile "${srcdir}/${subdir}/average.c" "${binfile1}.o" object {debug}] != "" } {
- gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-}
-
-if { [gdb_compile "${srcdir}/${subdir}/sum.c" "${binfile2}.o" object {debug}] != "" } {
- gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-}
-
-if { [gdb_compile "${binfile1}.o ${binfile2}.o" ${binfile} executable {debug}] != "" } {
- gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+if {[build_executable $testfile.exp $testfile \
+ [list $srcfile $srcfile2] debug] == -1} {
+ untested $testfile.exp
+ return -1
}
#
proc dbx_gdb_start { } {
global verbose
global GDB
- global GDBFLAGS
+ global INTERNAL_GDBFLAGS GDBFLAGS
global prompt
global spawn_id
global timeout
- verbose "Spawning $GDB -nw $GDBFLAGS"
+ verbose "Spawning $GDB -dbx $INTERNAL_GDBFLAGS $GDBFLAGS"
if { [which $GDB] == 0 } then {
perror "$GDB does not exist."
set oldtimeout $timeout
set timeout [expr "$timeout + 60"]
- eval "spawn $GDB -nw -dbx $GDBFLAGS"
+ eval "spawn $GDB -dbx $INTERNAL_GDBFLAGS $GDBFLAGS"
gdb_expect {
-re ".*\r\n$gdb_prompt $" {
verbose "GDB initialized."
# of this command returns, causing the test to get out of sync and fail
# seemingly randomly or only on a loaded system.
#
-proc dbx_gdb_file_cmd {arg } {
+# Problem is, though, that the testsuite config files can override the definition of
+# gdb_load (without notice, as was mentioned above). Unfortunately, the gdb_load proc
+# that was copied into this test was a copy of the unix native version.
+#
+# The real problem that we're attempting to solve is how to load an exec and symbol
+# file into gdb for a dbx session. So why not just override gdb_file_cmd with the
+# right sequence of events, allowing gdb_load to do its normal thing? This way
+# remotes and simulators will work, too.
+#
+# [drow 2002-03-30]: We can restore the old gdb_file_cmd afterwards, though.
+set old_gdb_file_cmd_args [info args gdb_file_cmd]
+set old_gdb_file_cmd_body [info body gdb_file_cmd]
+
+proc gdb_file_cmd {arg} {
global verbose
global loadpath
global loadfile
global gdb_prompt
global spawn_id
upvar timeout timeout
+ global last_loaded_file
+
+ set last_loaded_file $arg
+
+ if [is_remote host] {
+ set arg [remote_download host $arg]
+ if { $arg == "" } {
+ error "download failed"
+ return -1
+ }
+ }
send_gdb "symbol-file $arg\n"
gdb_expect {
verbose "\t\tLoaded $arg into the $GDB"
send_gdb "exec-file $arg\n"
gdb_expect {
+ -re "A program is being debugged already.*Kill it.*y or n. $" {
+ send_gdb "y\n"
+ verbose "\t\tKilling previous program being debugged"
+ exp_continue
+ }
-re ".*$gdb_prompt $" {
verbose "\t\tLoaded $arg with new symbol table into $GDB"
return 0
perror "$arg wasn't compiled with \"-g\""
return -1
}
- -re "A program is being debugged already.*Kill it.*y or n. $" {
- send_gdb "y\n"
- verbose "\t\tKilling previous program being debugged"
- exp_continue
- }
-re "Load new symbol table from \".*\".*y or n. $" {
send_gdb "y\n"
- gdb_expect {
- -re "Reading symbols from.*done.*$gdb_prompt $" {
- verbose "\t\tLoaded $arg with new symbol table into $GDB"
- return 0
- }
- timeout {
- perror "(timeout) Couldn't load $arg, other program already loaded."
- return -1
- }
- }
+ exp_continue
}
-re ".*No such file or directory.*$gdb_prompt $" {
perror "($arg) No such file or directory\n"
}
}
-proc dbx_gdb_load { arg } {
- global verbose
- global loadpath
- global loadfile
- global GDB
- global prompt
- upvar timeout timeout
-
- return [dbx_gdb_file_cmd $arg]
-}
-
#
#test_breakpoints
#
proc test_breakpoints { } {
- gdb_test "stop in main" "Breakpoint.*at.*: file.*average\.c, line 38\."
- gdb_test "status" "Num.*Type.*Disp.*Enb.*Address.*What\r\n1\[ \r\]+breakpoint\[ \r\]+keep y.*in main at.*average\.c:38.*"
- gdb_test "stop at 43" "Breakpoint.*at.*: file.*average\.c, line 43.*"
- gdb_test "stop in 43" "Usage: stop in <function . address>"
+ set stop_line [gdb_get_line_number "stop-in-main"]
+ gdb_test "stop in main" "Breakpoint.*at.*: file.*average\.c, line $stop_line\."
+ gdb_test "status" "Num.*Type.*Disp.*Enb.*Address.*What\r\n1\[ \r\]+breakpoint\[ \r\]+keep y.*in main at.*average\.c:$stop_line.*"
+ set stop_line [gdb_get_line_number "stop-at-call"]
+ gdb_test "stop at average.c:$stop_line" "Breakpoint.*at.*: file.*average\.c, line $stop_line.*"
+ gdb_test "stop in average.c:$stop_line" "Usage: stop in <function . address>"
gdb_test "stop at main" "Usage: stop at <line>"
}
#test_assign
#
proc test_assign { } {
- gdb_test "run" ""
- gdb_test "assign first=1" ""
+ global decimal
+ global gdb_prompt
+
+ gdb_run_cmd
+ set test "running to main"
+ gdb_test_multiple "" $test {
+ -re "Break.* at .*:$decimal.*$gdb_prompt $" {
+ pass $test
+ }
+ -re "Breakpoint \[0-9\]*, \[0-9xa-f\]* in .*$gdb_prompt $" {
+ pass $test
+ }
+ }
+ send_gdb "assign first=1\n"
+ gdb_expect {
+ -re "No symbol \"first\" in current context.*$" { fail "assign first" }
+ -re "$gdb_prompt $" { pass "assign first" }
+ timeout { fail "assign first (timeout)" }
+ }
gdb_test "print first" ".1 = 1"
}
#test_func
#
proc test_func { } {
- gdb_test "cont" ""
- gdb_test "step" ""
+ global decimal
+ global srcfile2
+ gdb_test "cont" ".*" "cont 1"
+ gdb_test "step" ".*"
gdb_test "func sum" "'sum' not within current stack frame\."
- gdb_test "stop in sum" "Breakpoint.*at.*: file.*sum\.c, line 11\."
- gdb_test "cont"
- gdb_test "func print_average" ".*in print_average.*\\(list=.*, low=0, high=6\\).*at.*average\.c:24\r\n24\[ \t\]+total = sum\\(list, low, high\\);"
+ set stop_line [gdb_get_line_number "stop-in-sum" $srcfile2]
+ gdb_test "stop in sum" "Breakpoint.*at.*: file.*sum\.c, line $stop_line\."
+ gdb_test "cont" ".*" "cont 2"
+ gdb_test "func print_average" ".*in print_average.*\\(list=.*, low=0, high=6\\).*at.*average\.c:${decimal}\r\n${decimal}\[ \t\]+total = sum\\(list, low, high\\);"
}
# Start with a fresh gdb.
set GDBFLAGS "$GDBFLAGS --dbx"
gdb_start
dbx_reinitialize_dir $srcdir/$subdir
-dbx_gdb_load ${binfile}
+gdb_load ${binfile}
test_breakpoints
test_assign
gdb_exit
set GDBFLAGS $saved_gdbflags
+eval proc gdb_file_cmd {$old_gdb_file_cmd_args} {$old_gdb_file_cmd_body}
+
return 0