42a20e8e837a62f0ce87f19f85411158cb08f3c9
[external/binutils.git] / gdb / testsuite / gdb.base / memattr.exp
1 # Copyright 2011-2012 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
16 # This file is part of the gdb testsuite
17
18 # Test the memory attribute commands.
19
20 if $tracelevel then {
21     strace $tracelevel
22 }
23
24 set testfile "memattr"
25 set srcfile  ${testfile}.c
26
27 if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
28     return -1
29 }
30
31 runto main
32
33 set mem1start -1
34 set mem2start -1
35 set mem3start -1
36 set mem4start -1
37 set mem5start -1
38
39 set mem1end -1
40 set mem2end -1
41 set mem3end -1
42 set mem4end -1
43 set mem5end -1
44
45
46 gdb_test_multiple "info address mem1" "get address of mem1" {
47     -re "Symbol \"mem1\" is static storage at address ($hex).*$gdb_prompt $" {
48         set mem1start $expect_out(1,string)
49     }
50 }
51
52 gdb_test_multiple "info address mem2" "get address of mem2" {
53     -re "Symbol \"mem2\" is static storage at address ($hex).*$gdb_prompt $" {
54         set mem2start $expect_out(1,string)
55     }
56 }
57
58 gdb_test_multiple "info address mem3" "get address of mem3" {
59     -re "Symbol \"mem3\" is static storage at address ($hex).*$gdb_prompt $" {
60         set mem3start $expect_out(1,string)
61     }
62 }
63
64 gdb_test_multiple "info address mem4" "get address of mem4" {
65     -re "Symbol \"mem4\" is static storage at address ($hex).*$gdb_prompt $" {
66         set mem4start $expect_out(1,string)
67     }
68 }
69
70 gdb_test_multiple "info address mem5" "get address of mem5" {
71     -re "Symbol \"mem5\" is static storage at address ($hex).*$gdb_prompt $" {
72         set mem5start $expect_out(1,string)
73     }
74 }
75
76 gdb_test_multiple "print &mem1\[64\]" "get end of mem1" {
77     -re "$decimal = .* ($hex).*$gdb_prompt $" {
78         set mem1end $expect_out(1,string)
79     }
80 }
81
82 gdb_test_multiple "print &mem2\[64\]" "get end of mem2" {
83     -re "$decimal = .* ($hex).*$gdb_prompt $" {
84         set mem2end $expect_out(1,string)
85     }
86 }
87
88 gdb_test_multiple "print &mem3\[64\]" "get end of mem3" {
89     -re "$decimal = .* ($hex).*$gdb_prompt $" {
90         set mem3end $expect_out(1,string)
91     }
92 }
93
94 gdb_test_multiple "print &mem4\[64\]" "get end of mem4" {
95     -re "$decimal = .* ($hex).*$gdb_prompt $" {
96         set mem4end $expect_out(1,string)
97     }
98 }
99
100 gdb_test_multiple "print &mem5\[64\]" "get end of mem5" {
101     -re "$decimal = .* ($hex).*$gdb_prompt $" {
102         set mem5end $expect_out(1,string)
103     }
104 }
105
106 gdb_test_no_output "mem $mem1start $mem1end wo" "create mem region 1"
107 gdb_test_no_output "mem $mem2start $mem2end ro" "create mem region 2"
108 gdb_test_no_output "mem $mem3start $mem3end rw" "create mem region 3"
109 gdb_test_no_output "mem $mem4start $mem4end rw" "create mem region 4"
110 gdb_test_no_output "mem $mem5start $mem5end rw" "create mem region 5"
111
112 set see1 0
113 set see2 0
114 set see3 0
115 set see4 0
116 set see5 0
117
118 gdb_test_multiple "info mem" "info mem(1)" {
119     -re "1   y  \[ \t\]+$hex $hex wo nocache \[^\r\n\]*" {
120         set see1 1
121         exp_continue
122     }
123     -re "2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*" {
124         set see2 1
125         exp_continue
126     }
127     -re "3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
128         set see3 1
129         exp_continue
130     }
131     -re "4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
132         set see4 1
133         exp_continue
134     }
135     -re "5   y  \[ \t\]+$hex $hex rw nocache .\[^\r\n\]*" {
136         set see5 1
137         exp_continue
138     }
139     -re "$gdb_prompt $" {
140         if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
141             pass "info mem (1)"
142         } else {
143             fail "info mem (1)"
144         }
145     }
146 }
147
148 #
149 # Test read-only, write-only
150 #
151
152 # mem1 is write only: read should fail.
153 gdb_test "print mem1\[1\]" \
154     "Cannot access memory at address $hex" \
155     "mem1 cannot be read"
156
157 gdb_test "print mem1\[1\] = 9" \
158     "$decimal = 9" \
159     "mem1 can be written"
160
161 # mem2 is read only: write should fail.
162 gdb_test "print mem2\[1\] = 9" \
163     "Cannot access memory at address $hex" \
164     "mem2 cannot be written"
165
166 gdb_test "print mem2\[1\]" \
167     "$decimal = 0" \
168     "mem2 can be read"
169
170 #
171 # Test disable and enable
172 #
173
174 gdb_test_no_output "disable mem 1" "disable mem 1"
175 gdb_test "info mem" "1   n  .*" "mem 1 was disabled"
176
177 gdb_test_no_output "enable mem 1" "enable mem 1"
178 gdb_test "info mem" "1   y  .*" "mem 1 was enabled"
179
180 gdb_test_no_output "disable mem 2 4"
181
182 set see1 0
183 set see2 0
184 set see3 0
185 set see4 0
186 set see5 0
187
188 gdb_test_multiple "info mem" "mem 2 and 4 were disabled" {
189     -re "1   y  \[ \t\]+$hex $hex wo nocache \[^\r\n\]*" {
190         set see1 1
191         exp_continue
192     }
193     -re "2   n  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*" {
194         set see2 1
195         exp_continue
196     }
197     -re "3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
198         set see3 1
199         exp_continue
200     }
201     -re "4   n  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
202         set see4 1
203         exp_continue
204     }
205     -re "5   y  \[ \t\]+$hex $hex rw nocache .\[^\r\n\]*" {
206         set see5 1
207         exp_continue
208     }
209     -re "$gdb_prompt $" {
210         if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
211             pass "mem 2 and 4 were disabled"
212         } else {
213             fail "mem 2 and 4 were disabled"
214         }
215     }
216 }
217
218 gdb_test_no_output "enable mem 2-4" "enable mem 2-4"
219
220 set see1 0
221 set see2 0
222 set see3 0
223 set see4 0
224 set see5 0
225
226 gdb_test_multiple "info mem" "mem 2-4 were enabled" {
227     -re "1   y  \[ \t\]+$hex $hex wo nocache \[^\r\n\]*" {
228         set see1 1
229         exp_continue
230     }
231     -re "2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*" {
232         set see2 1
233         exp_continue
234     }
235     -re "3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
236         set see3 1
237         exp_continue
238     }
239     -re "4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
240         set see4 1
241         exp_continue
242     }
243     -re "5   y  \[ \t\]+$hex $hex rw nocache .\[^\r\n\]*" {
244         set see5 1
245         exp_continue
246     }
247     -re "$gdb_prompt $" {
248         if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
249             pass "mem 2-4 were enabled"
250         } else {
251             fail "mem 2-4 were enabled"
252         }
253     }
254 }
255
256 gdb_test_no_output "disable mem" "disable mem"
257
258 set see1 0
259 set see2 0
260 set see3 0
261 set see4 0
262 set see5 0
263
264 gdb_test_multiple "info mem" "mem 1 to 5 were disabled" {
265     -re "1   n  \[ \t\]+$hex $hex wo nocache \[^\r\n\]*" {
266         set see1 1
267         exp_continue
268     }
269     -re "2   n  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*" {
270         set see2 1
271         exp_continue
272     }
273     -re "3   n  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
274         set see3 1
275         exp_continue
276     }
277     -re "4   n  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
278         set see4 1
279         exp_continue
280     }
281     -re "5   n  \[ \t\]+$hex $hex rw nocache .\[^\r\n\]*" {
282         set see5 1
283         exp_continue
284     }
285     -re "$gdb_prompt $" {
286         if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
287             pass "mem 1 to 5 were disabled"
288         } else {
289             fail "mem 1 to 5 were disabled"
290         }
291     }
292 }
293
294 gdb_test_no_output "enable mem" "enable mem"
295
296 set see1 0
297 set see2 0
298 set see3 0
299 set see4 0
300 set see5 0
301
302 gdb_test_multiple "info mem" "mem 1 to 5 were enabled" {
303     -re "1   y  \[ \t\]+$hex $hex wo nocache \[^\r\n\]*" {
304         set see1 1
305         exp_continue
306     }
307     -re "2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*" {
308         set see2 1
309         exp_continue
310     }
311     -re "3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
312         set see3 1
313         exp_continue
314     }
315     -re "4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
316         set see4 1
317         exp_continue
318     }
319     -re "5   y  \[ \t\]+$hex $hex rw nocache .\[^\r\n\]*" {
320         set see5 1
321         exp_continue
322     }
323     -re "$gdb_prompt $" {
324         if { $see1 && $see2 && $see3 && $see4 && $see5 } then {
325             pass "mem 1 to 5 were enabled"
326         } else {
327             fail "mem 1 to 5 were enabled"
328         }
329     }
330 }
331
332 gdb_test "disable mem 7 8" \
333     "No memory region number 7.*No memory region number 8." \
334     "disable non-existant regions"
335
336 #
337 # Test delete
338 #
339
340 set see1 0
341 set see2 0
342 set see3 0
343 set see4 0
344 set see5 0
345
346 gdb_test_no_output "delete mem 1" "delete mem 1"
347 gdb_test_multiple "info mem" "mem 1 was deleted" {
348     -re "1   y  \[ \t\]+$hex $hex wo nocache \[^\r\n\]*" {
349         set see1 1
350         exp_continue
351     }
352     -re "2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*" {
353         set see2 1
354         exp_continue
355     }
356     -re "3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
357         set see3 1
358         exp_continue
359     }
360     -re "4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
361         set see4 1
362         exp_continue
363     }
364     -re "5   y  \[ \t\]+$hex $hex rw nocache .\[^\r\n\]*" {
365         set see5 1
366         exp_continue
367     }
368     -re "$gdb_prompt $" {
369         if { !$see1 && $see2 && $see3 && $see4 && $see5 } then {
370             pass "mem 1 was deleted"
371         } else {
372             fail "mem 1 was deleted"
373         }
374     }
375 }
376
377 set see1 0
378 set see2 0
379 set see3 0
380 set see4 0
381 set see5 0
382
383 gdb_test_no_output "delete mem 2 4" "delete mem 2 4"
384 gdb_test_multiple "info mem" "mem 2 and 4 were deleted" {
385     -re "1   y  \[ \t\]+$hex $hex wo nocache \[^\r\n\]*" {
386         set see1 1
387         exp_continue
388     }
389     -re "2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*" {
390         set see2 1
391         exp_continue
392     }
393     -re "3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
394         set see3 1
395         exp_continue
396     }
397     -re "4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
398         set see4 1
399         exp_continue
400     }
401     -re "5   y  \[ \t\]+$hex $hex rw nocache .\[^\r\n\]*" {
402         set see5 1
403         exp_continue
404     }
405     -re "$gdb_prompt $" {
406         if { !$see1 && !$see2 && $see3 && !$see4 && $see5 } then {
407             pass "mem 2 and 4 were deleted"
408         } else {
409             fail "mem 2 and 4 were deleted"
410         }
411     }
412 }
413
414 set see1 0
415 set see2 0
416 set see3 0
417 set see4 0
418 set see5 0
419
420 gdb_test "delete mem 2-4" \
421     "No memory region number 2.*No memory region number 4." \
422     "delete mem 2-4"
423 gdb_test_multiple "info mem" "mem 2-4 were deleted" {
424     -re "1   y  \[ \t\]+$hex $hex wo nocache \[^\r\n\]*" {
425         set see1 1
426         exp_continue
427     }
428     -re "2   y  \[ \t\]+$hex $hex ro nocache \[^\r\n\]*" {
429         set see2 1
430         exp_continue
431     }
432     -re "3   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
433         set see3 1
434         exp_continue
435     }
436     -re "4   y  \[ \t\]+$hex $hex rw nocache \[^\r\n\]*" {
437         set see4 1
438         exp_continue
439     }
440     -re "5   y  \[ \t\]+$hex $hex rw nocache .\[^\r\n\]*" {
441         set see5 1
442         exp_continue
443     }
444     -re "$gdb_prompt $" {
445         if { !$see1 && !$see2 && !$see3 && !$see4 && $see5 } then {
446             pass "mem 2-4 were deleted"
447         } else {
448             fail "mem 2-4 were deleted"
449         }
450     }
451 }
452
453 gdb_test "delete mem 8" "No memory region number 8." \
454     "delete non-existant region"