#   Copyright 1997-2013 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
