aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/solib-display.exp
blob: 817846c68bdbc91c360a8f1cb530ecc7415ab57c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Copyright 2009-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/>.
#
# 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] {
    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.*"
}}