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

# Test connecting and disconnecting at shared library events.

if {[skip_shlib_tests]} {
    return 0
}

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

set testfile solib-disc
set libfile so-disc-shr
set srcfile ${testfile}.c
set binfile [standard_output_file ${testfile}]

set libsrc "${srcdir}/${subdir}/${libfile}.c"
set libname "${libfile}.so"
set libobj [standard_output_file ${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] {
    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_shlib $libobj

if ![runto_main] then {
    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"
