OSDN Git Service

bea06e310ea60c83452b3228a78ef464ad7896b8
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.abi / vtable2.C
1 // { dg-do run  }
2 // { dg-options "-fno-strict-aliasing" }
3 // Origin: Mark Mitchell <mark@codesourcery.com>
4
5 #if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
6
7 #include <stddef.h>
8
9 struct S0
10 {
11   virtual void s0 ();
12 };
13
14 struct S1 : virtual public S0
15 {
16   virtual void s1 ();
17 };
18
19 struct S2 : virtual public S1
20 {
21   virtual void s1 ();
22   virtual void s0 ();
23 };
24
25 struct S3
26 {
27   virtual void s3 ();
28 };
29
30 struct S4 : public S3, virtual public S2
31 {
32   virtual void s1 ();
33 };
34
35 void S0::s0 ()
36 {
37 }
38
39 void S1::s1 ()
40 {
41 }
42
43 void S2::s1 ()
44 {
45 }
46
47 void S2::s0 ()
48 {
49 }
50
51 void S3::s3 ()
52 {
53 }
54
55 void S4::s1 ()
56 {
57 }
58
59 /* The vtables should look like:
60
61    S0 primary vtable
62    
63      S0 offset to top
64      S0 RTTI
65      S0::s0
66
67    =================
68
69    S1 primary vtable
70
71      S0::s0 vcall offset
72      S0 vbase offset
73      S1 offset to top
74      S1 RTTI
75      S0::s0
76      S1::s1
77
78    =================
79
80    S2 primary vtable
81    
82      S2::s1 vcall offset
83      S1 vbase offset
84      S2::s0 vcall offset
85      S0 vbase offset
86      S2 offset to top
87      S2 RTTI
88      S2::s0
89      S2::s1
90
91    =================
92
93    S3 primary vtable
94
95      S3 offset to top
96      S3 RTTI
97      S3::s3
98
99    =================
100
101    S4 primary vtable
102
103      vbase offset for S0
104      vbase offset for S1
105      vbase offset for S2
106      S4 offset to top
107      S4 RTTI
108      S3::s3
109      S4::s1
110
111    S2-in-S4 secondary vtable
112
113      S1 vbase offset
114      S4::s1 vcall offset
115      S0 vbase offset
116      S2:s0 vcall offset
117      S2 offset to top
118      S4 RTTI
119      S2::s0
120      S4::s1
121
122 */
123
124 // These are tricks to allow us to get raw function pointers for
125 // member functions.
126 extern "C" {
127   void S3_s3 () __attribute__((__alias__ ("_ZN2S32s3Ev")));
128   void S4_s1 () __attribute__((__alias__ ("_ZN2S42s1Ev")));
129 }
130
131 // IA-64 uses function descriptors not function pointers in its vtables.
132 #if defined __ia64__
133 #define CMP_VPTR(A, B)  (*(void **)(A) == *(void **)(B))
134 #ifdef _LP64
135 #define INC_VPTR(A)     ((A) += 2)
136 #define INC_VDATA(A,N)  ((A) += (N))
137 #else
138 #define INC_VPTR(A)     ((A) += 4)
139 #define INC_VDATA(A,N)  ((A) += 2*(N))
140 #endif
141 #else
142 #define CMP_VPTR(A, B)  (*(A) == (ptrdiff_t)(B))
143 #define INC_VPTR(A)     ((A) += 1)
144 #define INC_VDATA(A,N)  ((A) += (N))
145 #endif
146
147 int main ()
148 {
149   S4 s4;
150   ptrdiff_t **vptr;
151   ptrdiff_t *vtbl;
152
153   // Set vtbl to point at the beginning of S4's primary vtable.
154   vptr = (ptrdiff_t **) &s4;
155   vtbl = *vptr;
156   INC_VDATA (vtbl, -5);
157
158   if (*vtbl != ((char*) (S0*) &s4) - (char*) &s4)
159     return 1;
160   INC_VDATA (vtbl, 1);
161   if (*vtbl != ((char*) (S1*) &s4) - (char*) &s4)
162     return 2;
163   INC_VDATA (vtbl, 1);
164   if (*vtbl != ((char*) (S2*) &s4) - (char*) &s4)
165     return 3;
166   INC_VDATA (vtbl, 1);
167   if (*vtbl != 0)
168     return 4;
169   INC_VDATA (vtbl, 1);
170   // Skip the RTTI entry.
171   INC_VDATA (vtbl, 1);
172   if (! CMP_VPTR (vtbl, &S3_s3))
173     return 5;
174   INC_VPTR (vtbl);
175   if (! CMP_VPTR (vtbl, &S4_s1))
176     return 6;
177   INC_VPTR (vtbl);
178   // The S1 vbase offset.
179   if (*vtbl != 0)
180     return 7;
181   INC_VDATA (vtbl, 1);
182   // The S4::s1 vcall offset is negative; once you convert to S2, you
183   // have to convert to S4 to find the final overrider.
184   if (*vtbl != ((char*) &s4 - (char*) (S2*) &s4))
185     return 8;
186   INC_VDATA (vtbl, 1);
187   if (*vtbl != 0)
188     return 9;
189   INC_VDATA (vtbl, 1);
190   if (*vtbl != 0)
191     return 10;
192   INC_VDATA (vtbl, 1);
193   // Now we're at the S2 offset to top entry.
194   if (*vtbl != ((char*) &s4 - (char*) (S2*) &s4))
195     return 11;
196   INC_VDATA (vtbl, 1);
197   // Skip the RTTI entry.
198   INC_VDATA (vtbl, 1);
199   // Skip the remaining virtual functions -- they are thunks.
200   INC_VPTR (vtbl);
201   INC_VPTR (vtbl);
202 }
203
204 #else /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */
205
206 int main ()
207 {
208 }
209
210 #endif /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */