#   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
