# Copyright 2007, 2008, 2009, 2010, 2011 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 connecting and disconnecting at shared library events.

if {[skip_shlib_tests]} {
    return 0
}

if { [info proc gdb_reconnect] == "" } {
    return 0
}

set testfile solib-disc
set libfile so-disc-shr
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

set libsrc "${srcdir}/${subdir}/${libfile}.c"
set libname "${libfile}.so"
set libobj "${objdir}/${subdir}/${libname}"
set execsrc "${srcdir}/${subdir}/${srcfile}"
set lib_dlopen [shlib_target_file ${libname}]
set lib_syms [shlib_symbol_file ${libname}]

remote_exec build "rm -f ${binfile}"

if [get_compiler_info ${binfile}] {
    return -1
}

set exec_opts [list debug shlib_load additional_flags=-DSHLIB_NAME\=\"${lib_dlopen}\"]

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

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

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

gdb_test_no_output "set stop-on-solib-events 1"

gdb_test "continue" "Stopped due to shared library event" "continue to load"

set msg "save \$pc after load"
set saved_pc ""
gdb_test_multiple "print/x \$pc" $msg {
    -re "\\\$$decimal = (\[^\r\n\]*)\r\n$gdb_prompt $" {
	set saved_pc $expect_out(1,string)
	pass $msg
    }
}

gdb_test "disconnect" "Ending remote debugging\\." "disconnect after load"
if { [gdb_reconnect] == 0 } {
    pass "reconnect after load"
} else {
    fail "reconnect after load"
    return 0
}

gdb_test "print/x \$pc" "\\\$$decimal = $saved_pc" "check \$pc after load"


gdb_test "continue" "Stopped due to shared library event" "continue to unload"

set msg "save \$pc after unload"
set saved_pc ""
gdb_test_multiple "print/x \$pc" $msg {
    -re "\\\$$decimal = (\[^\r\n\]*)\r\n$gdb_prompt $" {
	set saved_pc $expect_out(1,string)
	pass $msg
    }
}

gdb_test "disconnect" "Ending remote debugging\\." "disconnect after unload"
if { [gdb_reconnect] == 0 } {
    pass "reconnect after unload"
} else {
    fail "reconnect after unload"
    return 0
}

gdb_test "print/x \$pc" "\\\$$decimal = $saved_pc" "check \$pc after unload"
