# Copyright 2009-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/>.
#
# 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
}

# SEP must be last for the possible `unsupported' error path.
foreach libsepdebug {NO IN SEP} { with_test_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.*"
}}
