aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/solib-display.exp
blob: 67b57cbde3c79b4891e124aadf1e55429d2717da (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# Copyright 2009-2021 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] } {
    return 0
}

# This test is currently not supported for stub targets, because it uses the
# start command (through gdb_start_cmd).  In theory, it could be changed to
# use something else (kill + gdb_run_cmd with a manual breakpoint at main).
# However, when we try that with the native-gdbserver board, we see that the
# test fails and gdb outputs this upon connection:
#
#   warning: Unable to display "a_global": No symbol "a_global" in current context.
#   warning: Unable to display "b_global": No symbol "b_global" in current context.
#   warning: Unable to display "c_global": No symbol "c_global" in current context.
#
# This is because the initial stop is done before the shared libraries are
# loaded.

if { [use_gdb_stub] } {
    return 0
}

# Library file.
set libname "solib-display-lib"
set srcfile_lib ${srcdir}/${subdir}/${libname}.c
set binfile_lib [standard_output_file ${libname}.so]
set lib_flags {}
# Binary file.
set testfile "solib-display-main"
set srcfile ${srcdir}/${subdir}/${testfile}.c
set executable ${testfile}
set binfile [standard_output_file ${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 "failed to compile"
      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 (int) a_global" "1: \\(int\\) a_global = 41"
    gdb_test "display (int) b_global" "2: \\(int\\) b_global = 42"
    gdb_test "display (int) c_global" "3: \\(int\\) c_global = 43"

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

    gdb_test "" [multi_line \
		     "1: \\(int\\) a_global = 41" \
		     "2: \\(int\\) b_global = 42"  \
		     "3: \\(int\\) c_global = 43" \
		    ] "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 "" [multi_line \
		     "1: \\(int\\) a_global = 41" \
		     "warning: .*b_global.*"  \
		     "3: \\(int\\) c_global = 43" \
		    ] "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" [multi_line \
			     "4: main_global = 44" \
			     "5: a_local = 45" \
			     "6: a_static = 46" \
			    ]
}}