OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gdb/] [gdb-6.8/] [gdb/] [testsuite/] [gdb.cp/] [virtfunc.exp] - Blame information for rev 25

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 25 jlechner
# Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004,
2
# 2006, 2007, 2008 Free Software Foundation, Inc.
3
 
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
6
# the Free Software Foundation; either version 3 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program.  If not, see .
16
 
17
# This file was written by Fred Fish. (fnf@cygnus.com)
18
# And rewritten by Michael Chastain .
19
 
20
set nl          "\[\r\n\]+"
21
 
22
if $tracelevel then {
23
    strace $tracelevel
24
}
25
 
26
if { [skip_cplus_tests] } { continue }
27
 
28
load_lib "cp-support.exp"
29
 
30
set testfile "virtfunc"
31
set srcfile ${testfile}.cc
32
set binfile ${objdir}/${subdir}/${testfile}
33
 
34
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {c++ debug}] != "" } {
35
     untested virtfunc.exp
36
     return -1
37
}
38
 
39
proc test_ptype_of_classes {} {
40
 
41
    # class VA
42
 
43
    cp_test_ptype_class \
44
        "ptype VA" "" "class" "VA" \
45
        {
46
            { field public "int va;" }
47
        }
48
 
49
    # class VB
50
 
51
    cp_test_ptype_class \
52
        "ptype VB" "" "class" "VB" \
53
        {
54
            { field  public "int vb;" }
55
            { method public "int fvb();" }
56
            { method public "virtual int vvb();" }
57
        }
58
 
59
    # class V
60
 
61
    cp_test_ptype_class \
62
        "ptype V" "" "class" "V" \
63
        {
64
            { base          "public VA" }
65
            { base          "public VB" }
66
            { field  public "int w;" }
67
            { method public "int f();" }
68
            { method public "virtual int vv();" }
69
        }
70
 
71
    # class A
72
 
73
    cp_test_ptype_class \
74
        "ptype A" "" "class" "A" \
75
        {
76
            { base           "public virtual V" }
77
            { vbase          "V" }
78
            { field  private "int a;" }
79
            { method public  "virtual int f();" }
80
        }
81
 
82
    # class B
83
 
84
    cp_test_ptype_class \
85
        "ptype B" "" "class" "B" \
86
        {
87
            { base           "public A" }
88
            { field  private "int b;" }
89
            { method public  "virtual int f();" }
90
        }
91
 
92
    # class C
93
 
94
    cp_test_ptype_class \
95
        "ptype C" "" "class" "C" \
96
        {
97
            { base         "public virtual V" }
98
            { vbase        "V" }
99
            { field public "int c;" }
100
        }
101
 
102
    # class AD
103
 
104
    cp_test_ptype_class \
105
        "ptype AD" "" "class" "AD" \
106
        {
107
            { method public "virtual int vg();" }
108
        }
109
 
110
    # class D
111
 
112
    cp_test_ptype_class \
113
        "ptype D" "" "class" "D" \
114
        {
115
            { base          "public AD" }
116
            { base          "public virtual V" }
117
            { vbase         "V" }
118
            { method public "static void s();" }
119
            { method public "virtual int vg();" }
120
            { method public "virtual int vd();" }
121
            { method public "int fd();" }
122
            { field  public "int d;" }
123
        }
124
 
125
    # class E
126
 
127
    cp_test_ptype_class \
128
        "ptype E" "" "class" "E" \
129
        {
130
            { base          "public B" }
131
            { base          "public virtual V" }
132
            { base          "public D" }
133
            { base          "public C" }
134
            { vbase         "V" }
135
            { method public "virtual int f();" }
136
            { method public "virtual int vg();" }
137
            { method public "virtual int vv();" }
138
            { field  public "int e;" }
139
        }
140
 
141
    # An instance of D
142
 
143
    cp_test_ptype_class "ptype dd" "" "class" "D" ibid
144
 
145
    # An instance of D *
146
 
147
    cp_test_ptype_class "ptype ppd" "" "class" "D" ibid "*"
148
 
149
    # An instance of AD *
150
    # TODO: this should be named pADd, not pAd.
151
 
152
    cp_test_ptype_class "ptype pAd" "" "class" "AD" ibid "*"
153
 
154
    # Instances of these classes.
155
 
156
    cp_test_ptype_class "ptype a" "" "class" "A" ibid
157
    cp_test_ptype_class "ptype b" "" "class" "B" ibid
158
    cp_test_ptype_class "ptype c" "" "class" "C" ibid
159
    cp_test_ptype_class "ptype d" "" "class" "D" ibid
160
    cp_test_ptype_class "ptype e" "" "class" "E" ibid
161
    cp_test_ptype_class "ptype v" "" "class" "V" ibid
162
    cp_test_ptype_class "ptype vb" "" "class" "VB" ibid
163
 
164
    # Instances of pointers to these classes.
165
 
166
    cp_test_ptype_class "ptype pAa" "" "class" "A" ibid "*"
167
    cp_test_ptype_class "ptype pAe" "" "class" "A" ibid "*"
168
    cp_test_ptype_class "ptype pBe" "" "class" "B" ibid "*"
169
    cp_test_ptype_class "ptype pDd" "" "class" "D" ibid "*"
170
    cp_test_ptype_class "ptype pDe" "" "class" "D" ibid "*"
171
    cp_test_ptype_class "ptype pVa" "" "class" "V" ibid "*"
172
    cp_test_ptype_class "ptype pVv" "" "class" "V" ibid "*"
173
    cp_test_ptype_class "ptype pVe" "" "class" "V" ibid "*"
174
    cp_test_ptype_class "ptype pVd" "" "class" "V" ibid "*"
175
    cp_test_ptype_class "ptype pADe" "" "class" "AD" ibid "*"
176
    cp_test_ptype_class "ptype pEe" "" "class" "E" ibid "*"
177
    cp_test_ptype_class "ptype pVB" "" "class" "VB" ibid "*"
178
 
179
}
180
 
181
# Call virtual functions.
182
 
183
proc test_virtual_calls {} {
184
    global gdb_prompt
185
    global nl
186
 
187
    if [target_info exists gdb,cannot_call_functions] {
188
        setup_xfail "*-*-*" 2416
189
        fail "This target can not call functions"
190
        return 0
191
    }
192
 
193
    gdb_test "print pAe->f()"   "\\$\[0-9\]+ = 20"
194
    gdb_test "print pAa->f()"   "\\$\[0-9\]+ = 1"
195
    gdb_test "print pDe->vg()"  "\\$\[0-9\]+ = 202"
196
    gdb_test "print pADe->vg()" "\\$\[0-9\]+ = 202"
197
    gdb_test "print pDd->vg()"  "\\$\[0-9\]+ = 101"
198
    gdb_test "print pEe->vvb()" "\\$\[0-9\]+ = 411"
199
    gdb_test "print pVB->vvb()" "\\$\[0-9\]+ = 407"
200
    gdb_test "print pBe->vvb()" "\\$\[0-9\]+ = 411"
201
    gdb_test "print pDe->vvb()" "\\$\[0-9\]+ = 411"
202
    gdb_test "print pEe->vd()"  "\\$\[0-9\]+ = 282"
203
    gdb_test "print pEe->fvb()" "\\$\[0-9\]+ = 311"
204
 
205
    # more recent results:
206
    # wrong value "202"
207
    #   gcc 2.95.3 -gdwarf-2
208
    #   gcc 2.95.3 -gstabs+
209
    # attempt to take addres of value not located in memory
210
    #   gcc 3.3.2 -gdwarf-2
211
    #   gcc 3.3.2 -gstabs+
212
    #
213
    # -- chastain 2003-12-31
214
 
215
    gdb_test_multiple "print pEe->D::vg()" "print pEe->D::vg()" {
216
        -re "\\$\[0-9]+ = 102$nl$gdb_prompt $" {
217
            pass "print pEe->D::vg()"
218
        }
219
        -re "\\$\[0-9]+ = 202$nl$gdb_prompt $" {
220
            # To get this result, we have called pEe->*(&D::vg) ().
221
            # That's how GDB interprets this, but it's wrong; in fact
222
            # the explicit D:: means to bypass virtual function lookup,
223
            # and call D::vg as if it were non-virtual.  We still have
224
            # to e.g. adjust "this", though.
225
            kfail "gdb/1064" "print pEe->D::vg()"
226
        }
227
        -re "Attempt to take address of value not located in memory.$nl$gdb_prompt $" {
228
            kfail "gdb/1064" "print pEe->D::vg()"
229
        }
230
    }
231
}
232
 
233
proc do_tests {} {
234
    global prms_id
235
    global bug_id
236
    global srcdir subdir binfile
237
    global gdb_prompt
238
 
239
    set prms_id 0
240
    set bug_id 0
241
 
242
    gdb_exit
243
    gdb_start
244
    gdb_reinitialize_dir $srcdir/$subdir
245
    gdb_load $binfile
246
 
247
    gdb_test "set language c++" "" ""
248
    gdb_test "set width 0" "" ""
249
 
250
    runto_main
251
    test_ptype_of_classes
252
 
253
    gdb_breakpoint test_calls
254
    gdb_test "continue" ".*Breakpoint .* test_calls.*" ""
255
    test_virtual_calls
256
 
257
    gdb_test "next" ".*pAa->f.*" "next to pAa->f call"
258
    gdb_test "next" ".*pDe->vg.*" "next to pDe->vg call"
259
    gdb_test "step" ".*E::vg.*" "step through thunk into E::vg"
260
}
261
 
262
do_tests

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.