# Copyright 2004-2017 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/>.  */

# 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 {[skip_shlib_tests]} {
    return 0
}

standard_testfile gdb1555-main.c gdb1555.c

set libfile gdb1555
set libsrc "${srcdir}/${subdir}/${libfile}.c"
set libobj [standard_output_file ${libfile}.so]
set execsrc "${srcdir}/${subdir}/${srcfile}"

remote_exec build "rm -f ${binfile}"

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

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

clean_restart ${binfile}
gdb_load_shlib $libobj

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:\[0-9\]+\r\n\[0-9\]+.*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 "\[0-9\]+.*return a;.*$gdb_prompt $" {
	pass $name
    }
    -re "Single stepping until exit from function .*, \r\nwhich has no line number information.\r\n\r\n$inferior_exited_re normally.*$gdb_prompt $" { 
	kfail "gdb/1555" $name 
    }
}

