1# Copyright 1997, 1998, 1999, 2000, 2004, 2007, 2008, 2009, 2010, 2011 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# file to test calls into shared libraries 18# the source files for this test are: 19# 20# shmain.c 21# shr1.c (shared lib) 22# shr2.c (shared lib) 23# ss.h (header for shr2.c) 24# 25# file written by Elena Zannoni: elz@ch.apollo.com 26# 27 28#debug shmain 29#prop lib shr1.sl 30#prop lib shr2.sl 31 32if $tracelevel then { 33 strace $tracelevel 34} 35 36 37if {[skip_shlib_tests]} { 38 return 0 39} 40 41set testfile "shmain" 42set libfile1 "shr1" 43set libfile2 "shr2" 44set srcfile ${srcdir}/${subdir}/${testfile}.c 45set lib1src ${srcdir}/${subdir}/${libfile1}.c 46set lib2src ${srcdir}/${subdir}/${libfile2}.c 47set lib1 ${objdir}/${subdir}/${libfile1}.sl 48set lib2 ${objdir}/${subdir}/${libfile2}.sl 49set binfile ${objdir}/${subdir}/${testfile} 50 51set lib_opts "debug" 52set exec_opts [list debug shlib=${lib1} shlib=${lib2}] 53 54if [get_compiler_info ${binfile}] { 55 return -1 56} 57 58if { [gdb_compile_shlib ${lib1src} ${lib1} $lib_opts] != "" 59 || [gdb_compile_shlib ${lib2src} ${lib2} $lib_opts] != "" 60 || [gdb_compile ${srcfile} ${binfile} executable $exec_opts] != ""} { 61 untested "Could not compile $lib1, $lib2, or $srcfile." 62 return -1 63} 64 65# Start with a fresh gdb. 66 67gdb_exit 68gdb_start 69gdb_reinitialize_dir $srcdir/$subdir 70gdb_load ${binfile} 71gdb_load_shlibs $lib1 $lib2 72 73gdb_test_no_output "set print sevenbit-strings" 74gdb_test_no_output "set print address off" 75gdb_test_no_output "set width 0" 76 77 78if ![runto_main] then { 79 perror "C function calling tests suppressed" 80} 81 82 83#step -over 84 85gdb_test "next" "g = shr1\\(g\\);" "next to shr1" 86 87#print g 88 89gdb_test "print g" "\[0-9\]* = 1" "print g" 90 91#step -over 92if ![gdb_skip_stdio_test "next over shr1"] { 93 gdb_test "next" \ 94 "address of sgs is $hex.*g = shr2\\(g\\);" \ 95 "next over shr1" 96} else { 97 gdb_test "next" ".*" "" 98} 99 100 101#print g 102gdb_test "print g" "\[0-9\]* = 2" "print g" 103 104#print shr1(1) 105if ![gdb_skip_stdio_test "print shr1(1)"] { 106 gdb_test "print shr1(1)" \ 107 "address of sgs is $hex.*\[0-9\]* = 2" \ 108 "print shr1(1)" 109} 110 111#print shr1(g) 112if ![gdb_skip_stdio_test "print shr1(g)"] { 113 gdb_test "print shr1(g)" \ 114 "address of sgs is $hex.*\[0-9\]* = 4" \ 115 "print shr1(g)" 116} 117 118#break shr2 119#go 120gdb_test "break shr2" \ 121 "Breakpoint.*file.*shr2.c, line.*" \ 122 "breakpoint function shr2" 123 124gdb_test "continue" \ 125 "Continuing\\..*Breakpoint \[0-9\]+, shr2 \\(.*\\) at.*shr2\\.c:7.*7.*return 2.x;" \ 126 "run until breakpoint set at a function" 127 128 129#print shr1(1) 130if ![gdb_skip_stdio_test "print shr1(1) 2nd time"] { 131 gdb_test "print shr1(1)" \ 132 "address of sgs is $hex.*\[0-9\]* = 2" \ 133 "print shr1(1) 2nd time" 134} 135 136#print mainshr1(1) 137gdb_test "print mainshr1(1)" "\[0-9\]* = 2" \ 138 "print mainshr1(1) from shlib func" 139 140#step -return 141# A step at this point will either take us entirely out of 142# the function or into the function's epilogue. The exact 143# behavior will differ depending upon upon whether or not 144# the compiler emits line number information for the epilogue. 145gdb_test_multiple "step" "step out of shr2 to main" { 146 -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { 147 pass "step out of shr2 to main" 148 } 149 -re ".*\\\}.*$gdb_prompt $" { 150 pass "step out of shr2 to main (stopped in shr2 epilogue)" 151 gdb_test "step" \ 152 "main \\(\\) at.*g = mainshr1\\(g\\);" \ 153 "step out of shr2 epilogue to main" 154 } 155} 156 157#print mainshr1(1) 158gdb_test "print mainshr1(1)" "\[0-9\]* = 2" "print mainshr1(1)" 159 160#step 161gdb_test "step" "mainshr1 \\(g=4\\) at.*return 2.g;" \ 162 "step into mainshr1" 163 164# Start with a fresh gdb. 165 166gdb_exit 167gdb_start 168gdb_reinitialize_dir $srcdir/$subdir 169gdb_load ${binfile} 170gdb_test_no_output "set print sevenbit-strings" 171gdb_test_no_output "set print address off" 172gdb_test_no_output "set width 0" 173 174 175# PR's 16495, 18213 176# test that we can re-set breakpoints in shared libraries 177gdb_breakpoint "shr1" "allow-pending" 178 179# FIXME: should not send "run" explicitly. Non-portable. 180 181if ![is_remote target] { 182 gdb_test "run" "Starting program:.*Breakpoint .,.*" \ 183 "run to bp in shared library" 184 185 gdb_continue_to_end "" continue 1 186 187 gdb_test "run" "Starting program:.*Breakpoint .,.*" \ 188 "re-run to bp in shared library (PR's 16495, 18213)" 189 190 gdb_continue_to_end "" continue 1 191} 192 193return 0 194