# Copyright 2009 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/>.
#
# Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
#

# This test case verifies that if a display is active on a variable
# which belongs in a shared library, and that shared library is
# reloaded (e.g. due to re-execution of the program), GDB will continue
# to display it (gdb-6.8 crashed under this scenario).

# Also test that a display of variable which is currently present in
# a shared library, but disappears before re-run, doesn't cause GDB
# difficulties, and that it continues to display other variables.

# Finally, test that displays which refer to main executable
# (and thus aren't affected by shared library unloading) are not
# disabled prematurely.

if { [skip_shlib_tests] || [is_remote target] } {
    return 0
}

# Library file.
set libname "solib-display-lib"
set srcfile_lib ${srcdir}/${subdir}/${libname}.c
set binfile_lib ${objdir}/${subdir}/${libname}.so
set lib_flags [list debug]
# Binary file.
set testfile "solib-display-main"
set srcfile ${srcdir}/${subdir}/${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
set bin_flags [list debug shlib=${binfile_lib}]

if [get_compiler_info ${binfile}] {
    return -1
}

if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $lib_flags] != ""
     || [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } {
  untested "Could not compile $binfile_lib or $binfile."
  return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
  fail "Can't run to main"
  return 0
}

gdb_test "display a_global" "1: a_global = 41"
gdb_test "display b_global" "2: b_global = 42"
gdb_test "display c_global" "3: c_global = 43"

if { [gdb_start_cmd] < 0 } {
    fail "Can't run to main (2)"
    return 0
}

gdb_test "" "3: c_global = 43\\r\\n2: b_global = 42\\r\\n1: a_global = 41" "after rerun"

# Now rebuild the library without b_global
if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} \
	  "$lib_flags additional_flags=-DNO_B_GLOBAL"] != ""} {
    fail "Can't rebuild $binfile_lib"
}

if { [gdb_start_cmd] < 0 } {
    fail "Can't run to main (3)"
    return 0
}

gdb_test "" "3: c_global = 43\\r\\nwarning: .*b_global.*\\r\\n1: a_global = 41" "after rerun"

# Now verify that displays which are not in the shared library
# are not cleared permaturely.

gdb_test "break [gdb_get_line_number "break here" ${testfile}.c]" \
	".*Breakpoint.* at .*" 

gdb_test "continue"
gdb_test "display main_global" "4: main_global = 44"
gdb_test "display a_local" "5: a_local = 45"
gdb_test "display a_static" "6: a_static = 46"

if { [gdb_start_cmd] < 0 } {
    fail "Can't run to main (4)"
    return 0
}

gdb_test "" "6: a_static = 46\\r\\n4: main_global = 44\\r\\n.*"
gdb_test "break [gdb_get_line_number "break here" ${testfile}.c]" \
	".*Breakpoint.* at .*" 
gdb_test "continue" "6: a_static = 46\\r\\n5: a_local = 45\\r\\n4: main_global = 44\\r\\n.*"

gdb_exit

return 0


