#   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] {
    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"
