#   Copyright 2003-2005, 2007-2012 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 $objdir/$subdir/$testfile
set shlibdir ${objdir}/${subdir}
set libsrc  $srcdir/$subdir/$libfile.c
set libsrc2  $srcdir/$subdir/$libfile2.c
set lib_sl  $objdir/$subdir/$libname
set lib_sl2  $objdir/$subdir/$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 ${binfile}] {
    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 "Couldn't compile $libsrc or $libsrc2 or $srcfile."
    return -1
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_load_shlibs $lib_sl $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"
