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

# This file was created by Jeff Johnston. (jjohnstn@redhat.com)

#
# test running programs
#

if {[skip_shlib_tests]} {
    return 0
}

set testfile "unload"
set libfile "unloadshr"
set libfile2 "unloadshr2"
set libname "${libfile}.sl"
set libname2 "${libfile2}.sl"
set libsrcfile ${libfile}.c
set libsrcfile2 ${libfile2}.c
set srcfile $srcdir/$subdir/$testfile.c
set binfile [standard_output_file $testfile]
set shlibdir [standard_output_file {}]
set libsrc  $srcdir/$subdir/$libfile.c
set libsrc2  $srcdir/$subdir/$libfile2.c
set lib_sl  [standard_output_file $libname]
set lib_sl2  [standard_output_file $libname2]
set lib_dlopen [shlib_target_file ${libname}]
set lib_dlopen2 [shlib_target_file ${libname2}]
set lib_syms [shlib_symbol_file ${libname}]
set lib_syms2 [shlib_symbol_file ${libname2}]

if [get_compiler_info] {
    return -1
}

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

if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != ""
     || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""
     || [gdb_compile $srcfile $binfile executable $exec_opts] != ""} {
    untested "failed to compile"
    return -1
}

# Start with a fresh gdb.

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

#
# Test setting a breakpoint in a dynamically loaded library which is
# manually loaded and unloaded
#

gdb_breakpoint "shrfunc1" allow-pending
gdb_breakpoint "shrfunc2" allow-pending

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What\r?
1\[\t \]+breakpoint     keep y *<PENDING> *shrfunc1\r?
2\[\t \]+breakpoint     keep y *<PENDING> *shrfunc2" \
"pending breakpoint info before run"

set unloadshr_line [gdb_get_line_number "unloadshr break" ${libsrcfile}]

gdb_run_cmd
gdb_test "" \
"Breakpoint 1, shrfunc1 \\\(x=1\\\).*${libsrcfile}:$unloadshr_line.*" \
"running program"

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What\r?
1\[\t \]+breakpoint     keep y *0x\[0-9a-f\]+ *in shrfunc1 at .*
2\[\t \]+breakpoint     keep y *<PENDING> *shrfunc2.*" \
"pending breakpoint info on first run at shrfunc1"

gdb_breakpoint "$testfile.c:[gdb_get_line_number "y-set-1" $testfile.c]" temporary

gdb_test "continue" \
"Continuing.*warning: Temporarily disabling breakpoints for.*${lib_syms}.*y-set-1.*" \
"continuing to unloaded libfile"

gdb_test "print y" " = 10" "print y from libfile"

#
# Try to rerun program and verify that shared breakpoint is reset properly
#

gdb_run_cmd
gdb_test "" \
"Breakpoint 1, shrfunc1 \\\(x=1\\\).*${libsrcfile}:$unloadshr_line.*" \
"rerun to shared library breakpoint"

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What\r?
1\[\t \]+breakpoint     keep y *0x\[0-9a-f\]+ *in shrfunc1 at .*
2\[\t \]+breakpoint     keep y *<PENDING> *shrfunc2.*" \
"pending breakpoint info on second run at shrfunc1"

gdb_breakpoint "$testfile.c:[gdb_get_line_number "y-set-1" $testfile.c]" temporary

gdb_test "continue" \
"Continuing.*warning: Temporarily disabling breakpoints for.*${lib_syms}.*y-set-1.*" \
"continuing to unloaded libfile"

set unloadshr_line2 [gdb_get_line_number "unloadshr2 break" ${libsrcfile2}]

gdb_test "continue" \
"Breakpoint 2, shrfunc2 \\\(x=2\\\).*${libsrcfile2}:$unloadshr_line2\r\n.*" \
"continue to shrfunc2"

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What\r?
1\[\t \]+breakpoint     keep y *<PENDING> *shrfunc1\r?
\[\t \]+breakpoint already hit \[0-9\]+ (time|times)\r?
2\[\t \]+breakpoint     keep y *0x\[0-9a-f\]+ *in shrfunc2 at .*" \
"pending breakpoint info on second run at shrfunc2"

gdb_breakpoint "$testfile.c:[gdb_get_line_number "y-set-2" $testfile.c]"

gdb_test "continue" \
"Continuing.*warning: Temporarily disabling breakpoints for.*${lib_syms2}.*y-set-2.*" \
"continuing to unloaded libfile2"

gdb_test "print y" " = 200" "print y from libfile2"
