OLD | NEW |
1 # Copyright 1992, 1994-1999, 2001-2004, 2006-2012 Free Software | 1 # Copyright 1992, 1994-1999, 2001-2004, 2006-2012 Free Software |
2 # Foundation, Inc. | 2 # Foundation, Inc. |
3 | 3 |
4 # This program is free software; you can redistribute it and/or modify | 4 # This program is free software; you can redistribute it and/or modify |
5 # it under the terms of the GNU General Public License as published by | 5 # it under the terms of the GNU General Public License as published by |
6 # the Free Software Foundation; either version 3 of the License, or | 6 # the Free Software Foundation; either version 3 of the License, or |
7 # (at your option) any later version. | 7 # (at your option) any later version. |
8 # | 8 # |
9 # This program is distributed in the hope that it will be useful, | 9 # This program is distributed in the hope that it will be useful, |
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 # GNU General Public License for more details. | 12 # GNU General Public License for more details. |
13 # | 13 # |
14 # You should have received a copy of the GNU General Public License | 14 # You should have received a copy of the GNU General Public License |
15 # along with this program. If not, see <http://www.gnu.org/licenses/>. | 15 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | 16 |
17 # This file was written by Fred Fish. (fnf@cygnus.com) | 17 # This file was written by Fred Fish. (fnf@cygnus.com) |
18 # And rewritten by Michael Chastain <mec.gnu@mindspring.com>. | 18 # And rewritten by Michael Chastain <mec.gnu@mindspring.com>. |
19 | 19 |
20 set nl "\[\r\n\]+" | 20 set nl "\[\r\n\]+" |
21 | 21 |
22 if $tracelevel then { | |
23 strace $tracelevel | |
24 } | |
25 | |
26 if { [skip_cplus_tests] } { continue } | 22 if { [skip_cplus_tests] } { continue } |
27 | 23 |
28 load_lib "cp-support.exp" | 24 load_lib "cp-support.exp" |
29 | 25 |
30 set testfile "virtfunc" | 26 standard_testfile .cc |
31 set srcfile ${testfile}.cc | |
32 set binfile ${objdir}/${subdir}/${testfile} | |
33 | 27 |
34 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {c++
debug}] != "" } { | 28 if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { |
35 untested virtfunc.exp | 29 return -1 |
36 return -1 | |
37 } | 30 } |
38 | 31 |
39 proc test_ptype_of_classes {} { | 32 proc test_ptype_of_classes {} { |
40 | 33 |
41 # class VA | 34 # class VA |
42 | 35 |
43 cp_test_ptype_class \ | 36 cp_test_ptype_class \ |
44 "ptype VA" "" "class" "VA" \ | 37 "ptype VA" "" "class" "VA" \ |
45 { | 38 { |
46 { field public "int va;" } | 39 { field public "int va;" } |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 # and call D::vg as if it were non-virtual. We still have | 216 # and call D::vg as if it were non-virtual. We still have |
224 # to e.g. adjust "this", though. | 217 # to e.g. adjust "this", though. |
225 kfail "gdb/1064" "print pEe->D::vg()" | 218 kfail "gdb/1064" "print pEe->D::vg()" |
226 } | 219 } |
227 -re "Attempt to take address of value not located in memory.$nl$gdb_prom
pt $" { | 220 -re "Attempt to take address of value not located in memory.$nl$gdb_prom
pt $" { |
228 kfail "gdb/1064" "print pEe->D::vg()" | 221 kfail "gdb/1064" "print pEe->D::vg()" |
229 } | 222 } |
230 } | 223 } |
231 } | 224 } |
232 | 225 |
| 226 # A helper proc that creates a regular expression matching a |
| 227 # particular vtable. NAME is the type name. Each element of ARGS is |
| 228 # the name of a function in the vtable. |
| 229 |
| 230 proc make_one_vtable_result {name args} { |
| 231 global hex |
| 232 |
| 233 set nls "\[\r\n\]+" |
| 234 |
| 235 set result "vtable for '${name}' @ $hex .subobject @ $hex.:$nls" |
| 236 set count 0 |
| 237 foreach func $args { |
| 238 append result ".${count}.: $hex <$func..>${nls}" |
| 239 incr count |
| 240 } |
| 241 |
| 242 return $result |
| 243 } |
| 244 |
| 245 # Test "info vtbl". |
| 246 |
| 247 proc test_info_vtbl {} { |
| 248 global hex |
| 249 |
| 250 set nls "\[\r\n\]+" |
| 251 |
| 252 set vt_A [make_one_vtable_result A A::f] |
| 253 set vt_B [make_one_vtable_result B B::f] |
| 254 set vt_V [make_one_vtable_result V VB::vvb V::vv] |
| 255 set vt_V2 [make_one_vtable_result V VB::vvb "virtual thunk to E::vv"] |
| 256 set vt_D [make_one_vtable_result D D::vg D::vd] |
| 257 set vt_D2 [make_one_vtable_result D "non-virtual thunk to E::vg" D::vd] |
| 258 set vt_E [make_one_vtable_result E E::f E::vg E::vv] |
| 259 |
| 260 gdb_test "info vtbl a" "${vt_A}${vt_V}" |
| 261 gdb_test "info vtbl b" "${vt_B}${vt_V}" |
| 262 gdb_test "info vtbl c" "${vt_V}" |
| 263 gdb_test "info vtbl d" "${vt_D}${vt_V}" |
| 264 gdb_test "info vtbl e" "${vt_E}${vt_D2}${vt_V2}" |
| 265 gdb_test "info vtbl pEe" "${vt_E}${vt_D2}${vt_V2}" |
| 266 |
| 267 gdb_test "info vtbl" "Argument required.*" |
| 268 gdb_test "info vtbl va" \ |
| 269 "This object does not have a virtual function table.*" |
| 270 gdb_test "info vtbl all_count" \ |
| 271 "This object does not have a virtual function table.*" |
| 272 } |
| 273 |
233 proc do_tests {} { | 274 proc do_tests {} { |
234 global srcdir subdir binfile | |
235 global gdb_prompt | |
236 | |
237 | |
238 gdb_exit | |
239 gdb_start | |
240 gdb_reinitialize_dir $srcdir/$subdir | |
241 gdb_load $binfile | |
242 | |
243 gdb_test_no_output "set language c++" "" | 275 gdb_test_no_output "set language c++" "" |
244 gdb_test_no_output "set width 0" "" | 276 gdb_test_no_output "set width 0" "" |
245 | 277 |
246 if ![runto_main] then { | 278 if ![runto_main] then { |
247 perror "couldn't run to breakpoint" | 279 perror "couldn't run to breakpoint" |
248 return | 280 return |
249 } | 281 } |
250 test_ptype_of_classes | 282 test_ptype_of_classes |
| 283 test_info_vtbl |
251 | 284 |
252 gdb_breakpoint test_calls | 285 gdb_breakpoint test_calls |
253 gdb_test "continue" ".*Breakpoint .* test_calls.*" "" | 286 gdb_test "continue" ".*Breakpoint .* test_calls.*" "" |
254 test_virtual_calls | 287 test_virtual_calls |
255 | 288 |
256 gdb_test "next" ".*pAa->f.*" "next to pAa->f call" | 289 gdb_test "next" ".*pAa->f.*" "next to pAa->f call" |
257 gdb_test "next" ".*pDe->vg.*" "next to pDe->vg call" | 290 gdb_test "next" ".*pDe->vg.*" "next to pDe->vg call" |
258 gdb_test "step" ".*E::vg.*" "step through thunk into E::vg" | 291 gdb_test "step" ".*E::vg.*" "step through thunk into E::vg" |
259 } | 292 } |
260 | 293 |
261 do_tests | 294 do_tests |
OLD | NEW |