# Copyright 2009, 2010, 2011 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 {}
# Binary file.
set testfile "solib-display-main"
set srcfile ${srcdir}/${subdir}/${testfile}.c
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}
set bin_flags [list debug shlib=${binfile_lib}]

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

set save_pf_prefix $pf_prefix
# SEP must be last for the possible `unsupported' error path.
foreach libsepdebug {NO IN SEP} {

    set pf_prefix $save_pf_prefix
    lappend pf_prefix "$libsepdebug:"

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

    if {$libsepdebug == "SEP"} {
	if {[gdb_gnu_strip_debug $binfile_lib] != 0} {
	    unsupported "Could not split debug of $binfile_lib."
	    return
	} else {
	    pass "split solib"
	}
    }

    clean_restart $executable

    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)"
	continue
    }

    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} \
	      "$sep_lib_flags additional_flags=-DNO_B_GLOBAL"] != ""} {
	fail "Can't rebuild $binfile_lib"
    }

    if {$libsepdebug == "SEP"} {
	set test "split solib second time"
	if {[gdb_gnu_strip_debug $binfile_lib] != 0} {
	    fail $test
	    continue
	} else {
	    pass $test
	}
    }

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

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

    # 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)"
	continue
    }

    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.*"
}
set pf_prefix $save_pf_prefix
