#   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"
    gdb_expect {
        -re ".*\\\}.*$gdb_prompt $" { pass "step inside shr2 (shlib func)"}
        -re ".*$gdb_prompt $" { fail "step inside shr2 (shlib func)" }
        timeout { fail "step inside shr2 (shlib func) (timeout)" }
    }
    
    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 to main" }
        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
