# Copyright 1997-2013 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/>.


if {[skip_shlib_tests]} {
    return 0
}

set testfile "so-impl-ld"
set libfile "solib1"
set srcfile $srcdir/$subdir/$testfile.c
set libsrc  $srcdir/$subdir/$libfile.c
set binfile $objdir/$subdir/$testfile
set lib_sl  $objdir/$subdir/$libfile.sl

set lib_opts  debug
set exec_opts [list debug shlib=$lib_sl]

if [get_compiler_info] {
    return -1
}

if [get_compiler_info] {
    return -1
}

if [test_compiler_info "hpcc-*"] {
    lappend exec_opts "additional_flags=-Ae"
}

if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != ""
     || [gdb_compile $srcfile $binfile executable $exec_opts] != ""} {
    untested "Couldn't compile $libsrc or $srcfile."
    return -1
}

# Start with a fresh gdb

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

# This program implicitly loads SOM shared libraries.
#
if ![runto_main] then { fail "implicit solibs tests suppressed" }

# Verify that we can step over the first shlib call.
#
gdb_test "next" "21\[ \t\]*result = solib_main .result.;" \
    "step over solib call"

# Verify that we can step into the second shlib call.
#
gdb_test "step" "solib_main .arg=10000. at.*${libfile}.c:17.*" \
    "step into solib call"

# Verify that we can step within the shlib call.
#
gdb_test "next" "18\[ \t\]*\}" "step in solib call"

# Verify that we can step out of the shlib call, and back out into
# the caller.
#
gdb_test_multiple "next" "step out of solib call" {
    -re "0x\[0-9a-f\]*\[ \t\]*9\[ \t\]*.*$gdb_prompt $" {
	gdb_test "next" \
	    "main .. at.*so-impl-ld.c:22.*" \
	    "step out of solib call"
    }
    -re "main .. at.*so-impl-ld.c:22.*$gdb_prompt $" {
	pass "step out of solib call"
    }
}

gdb_exit
return 0






