# Copyright 1997-2015 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/>. # file to test calls into shared libraries # the source files for this test are: # # shmain.c # shr1.c (shared lib) # shr2.c (shared lib) # ss.h (header for shr2.c) # # file written by Elena Zannoni: elz@ch.apollo.com # #debug shmain #prop lib shr1.sl #prop lib shr2.sl if {[skip_shlib_tests]} { return 0 } 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}] if [get_compiler_info] { return -1 } 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. 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 { perror "C function calling tests suppressed" } #step -over gdb_test "next 2" "g = shr1\\(g\\);" "next to shr1" #print g gdb_test "print g" "\[0-9\]* = 1" "print g" #step -over 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 gdb_test "print g" "\[0-9\]* = 2" "print g" #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) 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 gdb_test "break shr2" \ "Breakpoint.*file.*shr2.c, line.*" \ "breakpoint function shr2" gdb_test "continue" \ "Continuing\\..*Breakpoint ${decimal}, shr2 \\(.*\\) at.*shr2\\.c:${decimal}.*shr2-return \\*\\/" \ "run until breakpoint set at a function" #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) gdb_test "print mainshr1(1)" "\[0-9\]* = 2" \ "print mainshr1(1) from shlib func" #step -return # 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" } -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) gdb_test "print mainshr1(1)" "\[0-9\]* = 2" "print mainshr1(1)" #step gdb_test "step" "mainshr1 \\(g=4\\) at.*return 2.g;" \ "step into mainshr1" # Start with a fresh gdb. gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} 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_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