xref: /netbsd-src/external/gpl3/gdb/dist/gdb/testsuite/gdb.base/reread.exp (revision 80d9064ac03cbb6a4174695f0d5b237c8766d3d0)
1# Copyright 1998-2014 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16set prototypes 1
17
18# build the first test case
19
20set testfile1 "reread1"
21set srcfile1 ${testfile1}.c
22# Cygwin needs $EXEEXT.
23set binfile1 [standard_output_file ${testfile1}$EXEEXT]
24
25if  { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" executable {debug nowarnings}] != "" } {
26    untested reread.exp
27    return -1
28}
29
30# build the second test case
31
32set testfile2 "reread2"
33set srcfile2 ${testfile2}.c
34set binfile2 [standard_output_file ${testfile2}$EXEEXT]
35
36if  { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug nowarnings}] != ""
37      && [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug nowarnings additional_flags=-DNO_SECTIONS}] != ""} {
38    untested reread.exp
39    return -1
40}
41
42# Start with a fresh gdb.
43
44set testfile "reread"
45set binfile [standard_output_file ${testfile}$EXEEXT]
46
47gdb_start
48gdb_reinitialize_dir $srcdir/$subdir
49
50# Load the first executable.
51
52gdb_rename_execfile ${binfile1} ${binfile}
53gdb_load ${binfile}
54
55# Set a breakpoint at foo
56
57gdb_test "break foo" \
58    "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
59    "breakpoint foo in first file"
60
61
62# Run, should see "Breakpoint 1, foo () at hello1.c:14"
63
64gdb_run_cmd
65
66gdb_expect {
67    -re ".*Breakpoint.* foo .* at .*$srcfile1:14.*$gdb_prompt $"  {
68	pass "run to foo()"
69    }
70    -re ".*$gdb_prompt $" {
71	fail "run to foo()"
72	gdb_suppress_tests
73    }
74    timeout { fail "run to foo() (timeout)" ; gdb_suppress_tests }
75}
76
77# Restore first executable to its original name, and move
78# second executable into its place.  Ensure that the new
79# executable is at least a second newer than the old.
80
81gdb_rename_execfile ${binfile} ${binfile1}
82gdb_rename_execfile ${binfile2} ${binfile}
83gdb_test "shell sleep 1" ".*" ""
84gdb_touch_execfile ${binfile}
85
86# Run a second time; GDB should detect that the executable has changed
87# and reset the breakpoints correctly.
88# Should see "Breakpoint 1, foo () at reread2.c:9"
89
90if [is_remote target] {
91    unsupported "run to foo() second time "
92} else {
93    gdb_run_cmd
94    gdb_expect {
95	#    -re ".*re-reading symbols.*Breakpoint.* foo .* at .*$srcfile2:9.*$gdb_prompt $" {}
96	-re ".*Breakpoint.* foo .* at .*:9.*$gdb_prompt $" {
97	    pass "run to foo() second time "
98	}
99	-re ".*$gdb_prompt $" {
100	    fail "run to foo() second time"
101	    gdb_suppress_tests
102	}
103	timeout {
104	    fail "run to foo() second time (timeout)"
105	    gdb_suppress_tests
106	}
107    }
108}
109
110
111### Second pass: verify that GDB checks the executable file's
112### timestamp when the program is *restarted*, not just when it exits.
113
114if [is_remote target] {
115    unsupported "second pass: GDB should check for changes before running"
116} else {
117
118    # Put the older executable back in place.
119    gdb_rename_execfile ${binfile} ${binfile2}
120    gdb_rename_execfile ${binfile1} ${binfile}
121
122    # Restart GDB entirely.
123    gdb_start
124    gdb_reinitialize_dir $srcdir/$subdir
125    gdb_load ${binfile}
126
127    # Set a breakpoint on foo and run to it.
128    gdb_test "break foo" \
129            "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
130            "second pass: breakpoint foo in first file"
131    gdb_run_cmd
132    gdb_expect {
133        -re ".*Breakpoint.* foo .* at .*$srcfile1:14.*$gdb_prompt $"  {
134            pass "second pass: run to foo()"
135        }
136        -re ".*$gdb_prompt $" {
137            fail "second pass: run to foo()"
138            gdb_suppress_tests
139        }
140        timeout {
141            fail "second pass: run to foo() (timeout)"
142            gdb_suppress_tests
143        }
144    }
145
146    # This time, let the program run to completion.  If GDB checks the
147    # executable file's timestamp now, it won't notice any change.
148    gdb_continue_to_end "second pass"
149
150    # Now move the newer executable into place, and re-run.  GDB
151    # should still notice that the executable file has changed,
152    # and still re-set the breakpoint appropriately.
153    gdb_rename_execfile ${binfile} ${binfile1}
154    gdb_rename_execfile ${binfile2} ${binfile}
155    gdb_run_cmd
156    gdb_expect {
157	-re ".*Breakpoint.* foo .* at .*:9.*$gdb_prompt $" {
158	    pass "second pass: run to foo() second time "
159	}
160	-re ".*$gdb_prompt $" {
161	    fail "second pass: run to foo() second time"
162	    gdb_suppress_tests
163	}
164	timeout {
165	    fail "second pass: run to foo() second time (timeout)"
166	    gdb_suppress_tests
167	}
168    }
169}
170
171# End of tests.
172
173gdb_stop_suppressing_tests
174
175return 0
176