#   Copyright 2003-2013 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"
