X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ftestsuite%2Fgdb.base%2Fshlib-call.exp;h=81d2e03757de096dba1fb90b16edadff3f5eb095;hb=01d8c27e4f77375c0e157d115266129b76ff6734;hp=414d7427f01a81c21872dac54a7ab2071d9bc5e5;hpb=c906108c21474dfb4ed285bcc0ac6fe02cd400cc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/testsuite/gdb.base/shlib-call.exp b/gdb/testsuite/gdb.base/shlib-call.exp index 414d7427f0..81d2e03757 100644 --- a/gdb/testsuite/gdb.base/shlib-call.exp +++ b/gdb/testsuite/gdb.base/shlib-call.exp @@ -1,21 +1,17 @@ -# Copyright (C) 1997, 1998 Free Software Foundation, Inc. +# Copyright 1997-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, # 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu +# along with this program. If not, see . # file to test calls into shared libraries # the source files for this test are: @@ -32,82 +28,40 @@ #prop lib shr1.sl #prop lib shr2.sl -if $tracelevel then { - strace $tracelevel -} -set prms_id 0 -set bug_id 0 - -# are we on a target board? -if ![isnative] then { +if {[skip_shlib_tests]} { return 0 } -set testfile "shmain" -set libfile "shr" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} - -# build the first test case -if [get_compiler_info ${binfile}] { - return -1 -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}.o" object {debug}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} +standard_testfile shmain.c shr1.c shr2.c +set srcfile ${srcdir}/${subdir}/${srcfile} +set lib1src ${srcdir}/${subdir}/${srcfile2} +set lib2src ${srcdir}/${subdir}/${srcfile3} +set lib1 [standard_output_file shr1.sl] +set lib2 [standard_output_file shr2.sl] +set lib_opts "debug" +set exec_opts [list debug shlib=${lib1} shlib=${lib2}] -# Build the shared libraries this test case needs. -# - -if {$gcc_compiled == 0} { - if [istarget "hppa*-hp-hpux*"] then { - set additional_flags "additional_flags=+z" - } else { - # don't know what the compiler is... - set additional_flags "" - } -} else { - set additional_flags "additional_flags=-fpic" -} - -if {[gdb_compile "${srcdir}/${subdir}/${libfile}1.c" "${objdir}/${subdir}/${libfile}1.o" object [list debug $additional_flags]] != ""} { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if {[gdb_compile "${srcdir}/${subdir}/${libfile}2.c" "${objdir}/${subdir}/${libfile}2.o" object [list debug $additional_flags]] != ""} { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +if [get_compiler_info] { + return -1 } -if [istarget "hppa*-*-hpux*"] { - remote_exec build "ld -b ${objdir}/${subdir}/${libfile}1.o -o ${objdir}/${subdir}/${libfile}1.sl" - remote_exec build "ld -b ${objdir}/${subdir}/${libfile}2.o -o ${objdir}/${subdir}/${libfile}2.sl" -} else { - set additional_flags "additional_flags=-shared" - if {[gdb_compile "${objdir}/${subdir}/${libfile}1.o" "${objdir}/${subdir}/${libfile}1.sl" executable [list debug $additional_flags]] != ""} { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." - } - if {[gdb_compile "${objdir}/${subdir}/${libfile}2.o" "${objdir}/${subdir}/${libfile}2.sl" executable [list debug $additional_flags]] != ""} { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." - } -} -if {[gdb_compile "${objdir}/${subdir}/${testfile}.o ${objdir}/${subdir}/${libfile}1.sl ${objdir}/${subdir}/${libfile}2.sl" "${binfile}" executable {debug}] != ""} { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +if { [gdb_compile_shlib ${lib1src} ${lib1} $lib_opts] != "" + || [gdb_compile_shlib ${lib2src} ${lib2} $lib_opts] != "" + || [gdb_compile ${srcfile} ${binfile} executable $exec_opts] != ""} { + untested "Could not compile $lib1, $lib2, or $srcfile." + return -1 } - - # Start with a fresh gdb. -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} -send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" -send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" -send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" +clean_restart ${binfile} +gdb_load_shlibs $lib1 $lib2 + +gdb_test_no_output "set print sevenbit-strings" +gdb_test_no_output "set print address off" +gdb_test_no_output "set width 0" if ![runto_main] then { @@ -117,62 +71,41 @@ if ![runto_main] then { #step -over - send_gdb "next\n" - gdb_expect { - -re ".*g = shr1\\(g\\).*$gdb_prompt $" {pass "next to shr2"} - -re ".*$gdb_prompt $" { fail "next to shr2" } - timeout { fail "next to shr2 (timeout)" } - } - - +gdb_test "next 2" "g = shr1\\(g\\);" "next to shr1" #print g -send_gdb "print g\n" -gdb_expect { - -re ".*\[0-9\]* = 1.*$gdb_prompt $" { - pass "print g" - } - -re ".*$gdb_prompt $" { fail "print g" } - timeout { fail "(timeout) print g" } - } - +gdb_test "print g" "\[0-9\]* = 1" "print g" #step -over - send_gdb "next\n" - gdb_expect { - -re ".*address of sgs is $hex.*g = shr2\\(g\\).*$gdb_prompt $" { - pass "next over shr1" } - -re ".*$gdb_prompt $" { fail "next over shr1" } - timeout { fail "next over shr1 (timeout)" } - } +if ![gdb_skip_stdio_test "next over shr1"] { + gdb_test_stdio "next" \ + "address of sgs is $hex" \ + "g = shr2\\(g\\);" \ + "next over shr1" +} else { + gdb_test "next" ".*" "" +} + #print g -send_gdb "print g\n" -gdb_expect { - -re ".*\[0-9\]* = 2.*$gdb_prompt $" { - pass "print g" } - -re ".*$gdb_prompt $" { fail "print g" } - timeout { fail "(timeout) print g" } - } +gdb_test "print g" "\[0-9\]* = 2" "print g" #print shr1(1) -send_gdb "print shr1(1)\n" -gdb_expect { - -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" { - pass "print shr1(1)" } - -re ".*$gdb_prompt $" { fail "print shr1(1)" } - timeout { fail "(timeout) print shr1(1)" } - } +if ![gdb_skip_stdio_test "print shr1(1)"] { + gdb_test_stdio "print shr1(1)" \ + "address of sgs is $hex" \ + "\[0-9\]* = 2" \ + "print shr1(1)" +} #print shr1(g) -send_gdb "print shr1(g)\n" -gdb_expect { - -re ".*address of sgs is $hex.*\[0-9\]* = 4.*$gdb_prompt $" { - pass "print shr1(g)" } - -re ".*$gdb_prompt $" { fail "print shr1(g)" } - timeout { fail "(timeout) print shr1(g)" } - } +if ![gdb_skip_stdio_test "print shr1(g)"] { + gdb_test_stdio "print shr1(g)" \ + "address of sgs is $hex" \ + "\[0-9\]* = 4" \ + "print shr1(g)" +} #break shr2 #go @@ -180,62 +113,46 @@ gdb_test "break shr2" \ "Breakpoint.*file.*shr2.c, line.*" \ "breakpoint function shr2" -gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, shr2 \\(.*\\) at.*shr2\\.c:3.*3.*return 2.x;" \ -"run until breakpoint set at a function" +gdb_test "continue" \ + "Continuing\\..*Breakpoint ${decimal}, shr2 \\(.*\\) at.*shr2\\.c:${decimal}.*shr2-return \\*\\/" \ + "run until breakpoint set at a function" #print shr1(1) -send_gdb "print shr1(1)\n" -gdb_expect { - -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" { - pass "print shr1(1)" - } - -re ".*$gdb_prompt $" { fail "print shr1(1)" } - timeout { fail "(timeout) print shr1(1)" } - } +if ![gdb_skip_stdio_test "print shr1(1) 2nd time"] { + gdb_test_stdio "print shr1(1)" \ + "address of sgs is $hex" \ + "\[0-9\]* = 2" \ + "print shr1(1) 2nd time" +} #print mainshr1(1) -send_gdb "print mainshr1(1)\n" -gdb_expect { - -re ".*\[0-9\]* = 2.*$gdb_prompt $" { - pass "print mainshr1(1) from shlib func" - } - -re ".*$gdb_prompt $" { fail "print mainshr1(1) from shlib func" } - timeout { fail "(timeout) print mainshr1(1) from shlib func" } - } +gdb_test "print mainshr1(1)" "\[0-9\]* = 2" \ + "print mainshr1(1) from shlib func" #step -return - send_gdb "step\n" - gdb_expect { - -re ".*\\\}.*$gdb_prompt $" { pass "step inside shr2 (shlib func)"} - -re ".*$gdb_prompt $" { fail "step inside shr2 (shlib func)" } - timeout { fail "step inside shr2 (shlib func) (timeout)" } +# A step at this point will either take us entirely out of +# the function or into the function's epilogue. The exact +# behavior will differ depending upon upon whether or not +# the compiler emits line number information for the epilogue. +gdb_test_multiple "step" "step out of shr2 to main" { + -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { + pass "step out of shr2 to main" } - - send_gdb "step\n" - gdb_expect { - -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { pass "step out of shr2 to main"} - -re ".*$gdb_prompt $" { fail "step out of shr2 to main" } - timeout { fail "step out of shr2 to main (timeout)" } + -re ".*\\\}.*$gdb_prompt $" { + pass "step out of shr2 to main (stopped in shr2 epilogue)" + gdb_test "step" \ + "main \\(\\) at.*g = mainshr1\\(g\\);" \ + "step out of shr2 epilogue to main" } - +} + #print mainshr1(1) -send_gdb "print mainshr1(1)\n" -gdb_expect { - -re ".*\[0-9\]* = 2.*$gdb_prompt $" { - pass "print mainshr1(1)" - } - -re ".*$gdb_prompt $" { fail "print mainshr1(1) from main" } - timeout { fail "(timeout) print mainshr1(1) from main" } - } +gdb_test "print mainshr1(1)" "\[0-9\]* = 2" "print mainshr1(1)" #step - send_gdb "step\n" - gdb_expect { - -re ".*mainshr1 \\(g=4\\) at.*return 2.g;.*$gdb_prompt $" { pass "step into mainshr1"} - -re ".*$gdb_prompt $" { fail "step into mainshr1" } - timeout { fail "step into mainshr1 (timeout)" } - } +gdb_test "step" "mainshr1 \\(g=4\\) at.*return 2.g;" \ + "step into mainshr1" # Start with a fresh gdb. @@ -243,16 +160,27 @@ gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} -send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" -send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" -send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" +gdb_test_no_output "set print sevenbit-strings" +gdb_test_no_output "set print address off" +gdb_test_no_output "set width 0" + # PR's 16495, 18213 # test that we can re-set breakpoints in shared libraries -gdb_test "break shr1" "Breakpoint 1 at .*" "set bp in shared library" -gdb_test "run" "Starting program:.*Breakpoint 1,.*" "run to bp in shared library" -gdb_test "cont" "Program exited normally." -gdb_test "run" "Starting program:.*Breakpoint 1,.*" "re-run to bp in shared library (PR's 16495, 18213)" -gdb_test "cont" "Program exited normally." +gdb_breakpoint "shr1" "allow-pending" + +# FIXME: should not send "run" explicitly. Non-portable. + +if ![is_remote target] { + gdb_test "run" "Starting program:.*Breakpoint .,.*" \ + "run to bp in shared library" + + gdb_continue_to_end "" continue 1 + + gdb_test "run" "Starting program:.*Breakpoint .,.*" \ + "re-run to bp in shared library (PR's 16495, 18213)" + + gdb_continue_to_end "" continue 1 +} return 0