#   Copyright 1997-2000, 2004, 2007-2012 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
}

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] {
    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}
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" "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 "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 "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 "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 \[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"] {
    gdb_test "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
