# Copyright 2014-2021 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
}

standard_testfile

set lib1name $testfile-solib1
set srcfile_lib1 $srcdir/$subdir/$lib1name.c
set binfile_lib1 [standard_output_file $lib1name.so]

set lib2name $testfile-solib2
set srcfile_lib2 $srcdir/$subdir/$lib2name.c
set binfile_lib2 [standard_output_file $lib2name.so]

if { [gdb_compile_shlib $srcfile_lib1 $binfile_lib1 \
	[list debug]] != "" } {
  untested "failed to compile shared library 1"
  return -1
}

if { [gdb_compile_shlib $srcfile_lib2 $binfile_lib2 \
	[list debug]] != "" } {
  untested "failed to compile shared library 2"
  return -1
}

if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable \
	[list debug shlib=$binfile_lib1 shlib=$binfile_lib2]] != "" } {
  return -1
}

clean_restart $binfile
gdb_load_shlib $binfile_lib1
gdb_load_shlib $binfile_lib2

if { ![runto_main] } {
  return -1
}

gdb_test "next" "$decimal.*b_main \\(\\);" "step over c_main"
gdb_test "next" "$decimal.*return 0;" "step over b_main"
gdb_test "print test" " = 42"
