| # Copyright 1997, 1998, 1999, 2000, 2004 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 |
| # (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 |
| |
| # 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 $tracelevel then { |
| strace $tracelevel |
| } |
| |
| set prms_id 0 |
| set bug_id 0 |
| |
| # are we on a target board? |
| if ![isnative] then { |
| return 0 |
| } |
| |
| set testfile "shmain" |
| set libfile1 "shr1" |
| set libfile2 "shr2" |
| set srcfile ${srcdir}/${subdir}/${testfile}.c |
| set lib1src ${srcdir}/${subdir}/${libfile1}.c |
| set lib2src ${srcdir}/${subdir}/${libfile2}.c |
| set lib1 ${objdir}/${subdir}/${libfile1}.sl |
| set lib2 ${objdir}/${subdir}/${libfile2}.sl |
| set binfile ${objdir}/${subdir}/${testfile} |
| |
| set lib_opts "debug" |
| set exec_opts [list debug shlib=${lib1} shlib=${lib2}] |
| |
| if [get_compiler_info ${binfile}] { |
| 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. |
| |
| 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 $" |
| |
| |
| if ![runto_main] then { |
| perror "C function calling tests suppressed" |
| } |
| |
| |
| #step -over |
| |
| send_gdb "next\n" |
| gdb_expect { |
| -re ".*g = shr1\\(g\\).*$gdb_prompt $" {pass "next to shr1"} |
| -re ".*$gdb_prompt $" { fail "next to shr1" } |
| timeout { fail "next to shr1 (timeout)" } |
| } |
| |
| |
| |
| #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" } |
| } |
| |
| |
| #step -over |
| if ![gdb_skip_stdio_test "next over shr1"] { |
| 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)" } |
| } |
| } 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" } |
| } |
| |
| #print shr1(1) |
| if ![gdb_skip_stdio_test "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)" } |
| } |
| } |
| |
| #print shr1(g) |
| if ![gdb_skip_stdio_test "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)" } |
| } |
| } |
| |
| #break shr2 |
| #go |
| gdb_test "break shr2" \ |
| "Breakpoint.*file.*shr2.c, line.*" \ |
| "breakpoint function shr2" |
| |
| gdb_test "continue" \ |
| "Continuing\\..*Breakpoint \[0-9\]+, shr2 \\(.*\\) at.*shr2\\.c:7.*7.*return 2.x;" \ |
| "run until breakpoint set at a function" |
| |
| |
| #print shr1(1) |
| if ![gdb_skip_stdio_test "print shr1(1) 2nd time"] { |
| send_gdb "print shr1(1)\n" |
| gdb_expect { |
| -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" { |
| pass "print shr1(1) 2nd time" |
| } |
| -re ".*$gdb_prompt $" { fail "print shr1(1) 2nd time" } |
| timeout { fail "(timeout) 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" } |
| } |
| |
| #step -return |
| send_gdb "step\n" |
| # 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_expect { |
| -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)" |
| send_gdb "step\n" |
| gdb_expect { |
| -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { pass "step out of shr2 epilogue to main"} |
| -re ".*$gdb_prompt $" { fail "step out of shr2 epilogue to main" } |
| timeout { fail "step out of shr2 epilogue to main (timeout)" } |
| } |
| } |
| -re ".*$gdb_prompt $" { fail "step out of shr2" } |
| timeout { fail "step out of shr2 to main (timeout)" } |
| } |
| |
| |
| #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" } |
| } |
| |
| #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)" } |
| } |
| |
| # 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 $" |
| |
| # 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_test "cont" ".*Program exited normally..*" |
| |
| gdb_test "run" "Starting program:.*Breakpoint .,.*" \ |
| "re-run to bp in shared library (PR's 16495, 18213)" |
| |
| gdb_test "cont" ".*Program exited normally..*" |
| } |
| |
| return 0 |