annotate gcc/testsuite/gcc.dg/bf-ms-layout.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* bf-ms-layout.c */
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 /* Test for MS bitfield layout */
kono
parents:
diff changeset
4 /* Adapted from Donn Terry <donnte@microsoft.com> testcase
kono
parents:
diff changeset
5 posted to GCC-patches
kono
parents:
diff changeset
6 http://gcc.gnu.org/ml/gcc-patches/2000-08/msg00577.html */
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
kono
parents:
diff changeset
9 /* { dg-options "-mms-bitfields -D_TEST_MS_LAYOUT" } */
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 #include <stddef.h>
kono
parents:
diff changeset
12 #include <string.h>
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 extern void abort();
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 #pragma pack(8)
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 struct one {
kono
parents:
diff changeset
19 int d;
kono
parents:
diff changeset
20 unsigned char a;
kono
parents:
diff changeset
21 unsigned short b:7;
kono
parents:
diff changeset
22 char c;
kono
parents:
diff changeset
23 } ;
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 struct two {
kono
parents:
diff changeset
26 int d;
kono
parents:
diff changeset
27 unsigned char a;
kono
parents:
diff changeset
28 unsigned int b:7;
kono
parents:
diff changeset
29 char c;
kono
parents:
diff changeset
30 } ;
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 struct three {
kono
parents:
diff changeset
33 short d;
kono
parents:
diff changeset
34 unsigned short a:3;
kono
parents:
diff changeset
35 unsigned short b:9;
kono
parents:
diff changeset
36 unsigned char c:7;
kono
parents:
diff changeset
37 } ;
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 /* Bitfields of size 0 have some truly odd behaviors. */
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 struct four {
kono
parents:
diff changeset
43 unsigned short a:3;
kono
parents:
diff changeset
44 unsigned short b:9;
kono
parents:
diff changeset
45 unsigned int :0; /* forces struct alignment to int */
kono
parents:
diff changeset
46 unsigned char c:7;
kono
parents:
diff changeset
47 } ;
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 struct five {
kono
parents:
diff changeset
50 char a;
kono
parents:
diff changeset
51 int :0; /* ignored; prior field is not a bitfield. */
kono
parents:
diff changeset
52 char b;
kono
parents:
diff changeset
53 char c;
kono
parents:
diff changeset
54 } ;
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 struct six {
kono
parents:
diff changeset
57 char a :8;
kono
parents:
diff changeset
58 int :0; /* not ignored; prior field IS a bitfield, causes
kono
parents:
diff changeset
59 struct alignment as well. */
kono
parents:
diff changeset
60 char b;
kono
parents:
diff changeset
61 char c;
kono
parents:
diff changeset
62 } ;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 struct seven {
kono
parents:
diff changeset
65 char a:8;
kono
parents:
diff changeset
66 char :0;
kono
parents:
diff changeset
67 int :0; /* Ignored; prior field is zero size bitfield. */
kono
parents:
diff changeset
68 char b;
kono
parents:
diff changeset
69 char c;
kono
parents:
diff changeset
70 } ;
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 struct eight { /* ms size 4 */
kono
parents:
diff changeset
73 short b:3;
kono
parents:
diff changeset
74 char c;
kono
parents:
diff changeset
75 } ;
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 #ifdef _MSC_VER
kono
parents:
diff changeset
78 #define LONGLONG __int64
kono
parents:
diff changeset
79 #else
kono
parents:
diff changeset
80 #define LONGLONG long long
kono
parents:
diff changeset
81 #endif
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 union nine { /* ms size 8 */
kono
parents:
diff changeset
84 LONGLONG a:3;
kono
parents:
diff changeset
85 char c;
kono
parents:
diff changeset
86 } ;
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 struct ten { /* ms size 16 */
kono
parents:
diff changeset
89 LONGLONG a:3;
kono
parents:
diff changeset
90 LONGLONG b:3;
kono
parents:
diff changeset
91 char c;
kono
parents:
diff changeset
92 } ;
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 #define val(s,f) (s.f)
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 #define check_struct(_X) \
kono
parents:
diff changeset
98 { \
kono
parents:
diff changeset
99 if (sizeof (struct _X) != exp_sizeof_##_X ) \
kono
parents:
diff changeset
100 abort(); \
kono
parents:
diff changeset
101 memcpy(&test_##_X, filler, sizeof(test_##_X));\
kono
parents:
diff changeset
102 if (val(test_##_X,c) != exp_##_X##_c) \
kono
parents:
diff changeset
103 abort(); \
kono
parents:
diff changeset
104 }
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 #define check_union(_X) \
kono
parents:
diff changeset
107 { \
kono
parents:
diff changeset
108 if (sizeof (union _X) != exp_sizeof_##_X ) \
kono
parents:
diff changeset
109 abort(); \
kono
parents:
diff changeset
110 memcpy(&test_##_X, filler, sizeof(test_##_X));\
kono
parents:
diff changeset
111 if (val(test_##_X,c) != exp_##_X##_c) \
kono
parents:
diff changeset
112 abort(); \
kono
parents:
diff changeset
113 }
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 #define check_struct_size(_X) \
kono
parents:
diff changeset
116 { \
kono
parents:
diff changeset
117 if (sizeof (struct _X) != exp_sizeof_##_X ) \
kono
parents:
diff changeset
118 abort(); \
kono
parents:
diff changeset
119 }
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 #define check_struct_off(_X) \
kono
parents:
diff changeset
122 { \
kono
parents:
diff changeset
123 memcpy(&test_##_X, filler, sizeof(test_##_X));\
kono
parents:
diff changeset
124 if (val(test_##_X,c) != exp_##_X##_c) \
kono
parents:
diff changeset
125 abort(); \
kono
parents:
diff changeset
126 }
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 #define check_union_size(_X) \
kono
parents:
diff changeset
129 { \
kono
parents:
diff changeset
130 if (sizeof (union _X) != exp_sizeof_##_X ) \
kono
parents:
diff changeset
131 abort(); \
kono
parents:
diff changeset
132 }
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 #define check_union_off(_X) \
kono
parents:
diff changeset
135 { \
kono
parents:
diff changeset
136 memcpy(&test_##_X, filler, sizeof(test_##_X));\
kono
parents:
diff changeset
137 if (val(test_##_X,c) != exp_##_X##_c) \
kono
parents:
diff changeset
138 abort(); \
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 int main(){
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 unsigned char filler[16];
kono
parents:
diff changeset
144 struct one test_one;
kono
parents:
diff changeset
145 struct two test_two;
kono
parents:
diff changeset
146 struct three test_three;
kono
parents:
diff changeset
147 struct four test_four;
kono
parents:
diff changeset
148 struct five test_five;
kono
parents:
diff changeset
149 struct six test_six;
kono
parents:
diff changeset
150 struct seven test_seven;
kono
parents:
diff changeset
151 struct eight test_eight;
kono
parents:
diff changeset
152 union nine test_nine;
kono
parents:
diff changeset
153 struct ten test_ten;
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 #if defined (_TEST_MS_LAYOUT) || defined (_MSC_VER)
kono
parents:
diff changeset
156 size_t exp_sizeof_one = 8;
kono
parents:
diff changeset
157 size_t exp_sizeof_two = 12;
kono
parents:
diff changeset
158 size_t exp_sizeof_three =6;
kono
parents:
diff changeset
159 size_t exp_sizeof_four = 8;
kono
parents:
diff changeset
160 size_t exp_sizeof_five = 3;
kono
parents:
diff changeset
161 size_t exp_sizeof_six = 8;
kono
parents:
diff changeset
162 size_t exp_sizeof_seven = 3;
kono
parents:
diff changeset
163 size_t exp_sizeof_eight = 2;
kono
parents:
diff changeset
164 size_t exp_sizeof_nine = 8;
kono
parents:
diff changeset
165 size_t exp_sizeof_ten = 8;
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 unsigned char exp_one_c = 7;
kono
parents:
diff changeset
168 unsigned char exp_two_c = 9;
kono
parents:
diff changeset
169 unsigned char exp_three_c = 4;
kono
parents:
diff changeset
170 unsigned char exp_four_c = 4;
kono
parents:
diff changeset
171 char exp_five_c = 2;
kono
parents:
diff changeset
172 char exp_six_c = 5;
kono
parents:
diff changeset
173 char exp_seven_c = 2;
kono
parents:
diff changeset
174 char exp_eight_c = 1;
kono
parents:
diff changeset
175 char exp_nine_c = 0;
kono
parents:
diff changeset
176 char exp_ten_c = 1;
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 #else /* testing -mno-ms-bitfields */
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 size_t exp_sizeof_one = 8;
kono
parents:
diff changeset
181 size_t exp_sizeof_two = 8;
kono
parents:
diff changeset
182 size_t exp_sizeof_three = 6;
kono
parents:
diff changeset
183 size_t exp_sizeof_four = 6;
kono
parents:
diff changeset
184 size_t exp_sizeof_five = 6;
kono
parents:
diff changeset
185 size_t exp_sizeof_six = 6;
kono
parents:
diff changeset
186 size_t exp_sizeof_seven = 6;
kono
parents:
diff changeset
187 size_t exp_sizeof_eight = 2;
kono
parents:
diff changeset
188 size_t exp_sizeof_nine = 8;
kono
parents:
diff changeset
189 size_t exp_sizeof_ten = 8;
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 unsigned short exp_one_c = 6;
kono
parents:
diff changeset
192 unsigned int exp_two_c = 6;
kono
parents:
diff changeset
193 unsigned char exp_three_c = 64;
kono
parents:
diff changeset
194 unsigned char exp_four_c = 4;
kono
parents:
diff changeset
195 char exp_five_c = 5;
kono
parents:
diff changeset
196 char exp_six_c = 5;
kono
parents:
diff changeset
197 char exp_seven_c = 5;
kono
parents:
diff changeset
198 char exp_eight_c = 1;
kono
parents:
diff changeset
199 char exp_nine_c = 0;
kono
parents:
diff changeset
200 char exp_ten_c = 1;
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 #endif
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 unsigned char i;
kono
parents:
diff changeset
205 for ( i = 0; i < 16; i++ )
kono
parents:
diff changeset
206 filler[i] = i;
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 check_struct_off (one);
kono
parents:
diff changeset
209 check_struct_off (two);
kono
parents:
diff changeset
210 check_struct_off (three);
kono
parents:
diff changeset
211 check_struct_off (four);
kono
parents:
diff changeset
212 check_struct_off (five);
kono
parents:
diff changeset
213 check_struct_off (six);
kono
parents:
diff changeset
214 check_struct_off (seven);
kono
parents:
diff changeset
215 check_struct_off (eight);
kono
parents:
diff changeset
216 check_union_off (nine);
kono
parents:
diff changeset
217 check_struct_off (ten);
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 check_struct_size (one);
kono
parents:
diff changeset
220 check_struct_size (two);
kono
parents:
diff changeset
221 check_struct_size (three);
kono
parents:
diff changeset
222 check_struct_size (four);
kono
parents:
diff changeset
223 check_struct_size (five);
kono
parents:
diff changeset
224 check_struct_size (six);
kono
parents:
diff changeset
225 check_struct_size (seven);
kono
parents:
diff changeset
226 check_struct_size (eight);
kono
parents:
diff changeset
227 check_union_size (nine);
kono
parents:
diff changeset
228 check_struct_size (ten);
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 return 0;
kono
parents:
diff changeset
231 };