#   Copyright 1997, 1998, 1999, 2000, 2004, 2007, 2008, 2009, 2010
#   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 $tracelevel then {
        strace $tracelevel
}

set prms_id 0
set bug_id 0

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 ${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}
gdb_load_shlibs $lib1 $lib2

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
