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

# In some cases gdbserver cannot find the DT_DEBUG library list on its own and
# it needs to fall back to GDB solib-svr4.c look up via symbols from the main
# executable.
# gdbserver :1234 ld-linux-x86-64.so.2 /bin/prog
# gdb /bin/prog
# (gdb) target remote ...

load_lib gdbserver-support.exp
load_lib prelink-support.exp

if {[skip_gdbserver_tests] || [skip_shlib_tests]} {
    return
}

# This test case (currently) does not support remote targets, since it
# assumes the ELF interpreter can be found on the host system
if [is_remote target] then {
    return
}

standard_testfile solib-list-main.c
set srclibfile ${testfile}-lib.c
set binlibfile [standard_output_file ${testfile}.so]
set executable ${testfile}
set objfile ${binfile}.o

if { [get_compiler_info]
     || [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" "${binlibfile}" [list debug ldflags=-Wl,-soname,${binlibfile}]] != ""
     || [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != ""
     || [gdb_compile "${objfile} ${binlibfile}" "${binfile}" executable {}] != "" } {
    untested "could not compile sources"
    return -1
}

set interp_system [section_get ${binfile} .interp]
verbose -log "system interpreter is: $interp_system"

foreach nonstop { 0 1 } { with_test_prefix "non-stop $nonstop" {

    # clean_restart assumes ${objdir}/${subdir}/ which is not applicable
    # for ${interp_system}.
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load ${interp_system}
    gdb_load_shlibs ${binfile}
    gdb_load_shlibs ${binlibfile}

    # Make sure we're disconnected, in case we're testing with an
    # extended-remote board, therefore already connected.
    gdb_test "disconnect" ".*"

    gdb_test "set non-stop $nonstop"
    gdb_test "set target-async $nonstop"

    # It is required for the non-stop mode, GDB would try to step over
    # _dl_debug_state breakpoint will still only ld.so loaded in gdbserver.
    # But GDB having symbols from the main executable it would try to use
    # displaced-stepping buffer at unmapped that time address _start.
    gdb_test "set displaced-stepping off"
	
    set res [gdbserver_spawn ${binfile}]
    set gdbserver_protocol [lindex $res 0]
    set gdbserver_gdbport [lindex $res 1]

    # Load BINFILE after gdbserver_spawn (so that gdbserver executes ld.so)
    # but before "target remote" below so that qSymbol data get already
    # initialized from BINFILE (and not from ld.so first needing a change to
    # BINFILE later).
    gdb_test "file ${binfile}" {Reading symbols from .*\.\.\.done\..*} "file binfile" \
	     {(Are you sure you want to change the file|Load new symbol table from ".*")\? \(y or n\) } "y"

    set test "target $gdbserver_protocol"
    gdb_test_multiple "target $gdbserver_protocol $gdbserver_gdbport" $test {
	-re "Remote debugging using .*\r\n$gdb_prompt " {
	    # Do not anchor end, there may be more output in non-stop mode.
	    pass $test
	}
    }

    if $nonstop {
	set test "non-stop interior stop"
	gdb_test_multiple "" $test {
	    -re " #1 stopped\\.\r\n" {
		pass $test
	    }
	}
    }

    gdb_test "continue" "Program received signal SIGUSR1, .*"
    gdb_test "sharedlibrary" ".*"
    gdb_test "p libvar" " = 23"
}}
