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

# Test stepping into and continuing on from a function in
# a shared library (PR gdb/1555, was PR shlib/1280, shlib/1237).
# Tested on ppc-yellowdog-linux (Yellow Dog Linux 3.0 3.2.2-2a)

if $tracelevel then {
    strace $tracelevel
}

set testfile gdb1555-main
set libfile gdb1555
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

set libsrc "${srcdir}/${subdir}/${libfile}.c"
set libobj "${objdir}/${subdir}/${libfile}.so"
set execsrc "${srcdir}/${subdir}/${srcfile}"

remote_exec build "rm -f ${binfile}"

# Are we on a target board?  No support for downloading shared libraries
# to a target yet.
if ![isnative] then {
    return 0
}

# get the value of gcc_compiled
if [get_compiler_info ${binfile}] {
    return -1
}

if { [gdb_compile_shlib $libsrc $libobj {debug}] != ""
     || [gdb_compile $execsrc ${binfile} executable \
	     [list debug shlib=${libobj}]] != "" } {
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
    fail "Can't run to main"
    return 0
}

# PR/1555 (was shlib 1280)
set name "Step into shared lib function"
gdb_test_multiple "s" $name \
{
    -re "hithere2 \\(\\) at.*${libfile}.c:25\r\n25.*a = 21;.*$gdb_prompt $"  {
	pass $name
    }
    -re "0x\[0-9a-f\]+ in .* \\(\\) from /lib/ld.so.1.*$gdb_prompt $" { 
	kfail "gdb/1555" $name 
    }
}

# PR/1555 (was shlib 1237)
set name "Next while in a shared lib function"
gdb_test_multiple "n" $name \
{
    -re "26.*return a;.*$gdb_prompt $" {
	pass $name
    }
    -re "Single stepping until exit from function .*, \r\nwhich has no line number information.\r\n\r\nProgram exited normally.*$gdb_prompt $" { 
	kfail "gdb/1555" $name 
    }
}

