arm-layout.c revision 684de63867fac4ffe2f4c97756a16bfcb2d8b54b
1// RUN: %clang_cc1 -triple armv7-unknown-unknown -target-abi apcs-gnu %s -verify
2// RUN: %clang_cc1 -triple armv7-unknown-unknown -target-abi aapcs %s -verify
3
4#define check(name, cond) int _##name##_check[(cond) ? 1 : -1]
5
6struct s0 { char field0; double field1; };
7#ifdef __ARM_EABI__
8check(s0_size, sizeof(struct s0) == 16);
9#else
10check(s0_size, sizeof(struct s0) == 12);
11#endif
12
13struct s1 { char field0; long double field1; };
14#ifdef __ARM_EABI__
15check(s1_size, sizeof(struct s1) == 16);
16#else
17check(s1_size, sizeof(struct s1) == 12);
18#endif
19
20struct s2 {
21  short field0;
22  int field1 : 24;
23  char field2;
24};
25#ifdef __ARM_EABI__
26check(s2_size, sizeof(struct s2) == 8);
27check(s2_offset_0, __builtin_offsetof(struct s2, field0) == 0);
28check(s2_offset_1, __builtin_offsetof(struct s2, field2) == 7);
29#else
30check(s2_size, sizeof(struct s2) == 6);
31check(s2_offset_0, __builtin_offsetof(struct s2, field0) == 0);
32check(s2_offset_1, __builtin_offsetof(struct s2, field2) == 5);
33#endif
34
35struct s3 {
36  short field0;
37  int field1 : 24 __attribute__((aligned(4)));
38  char field2;
39};
40check(s3_size, sizeof(struct s3) == 8);
41check(s3_offset_0, __builtin_offsetof(struct s3, field0) == 0);
42check(s3_offset_1, __builtin_offsetof(struct s3, field2) == 7);
43
44struct s4 {
45  int field0 : 4
46};
47#ifdef __ARM_EABI__
48check(s4_size, sizeof(struct s4) == 4);
49check(s4_align, __alignof(struct s4) == 4);
50#else
51check(s4_size, sizeof(struct s4) == 1);
52check(s4_align, __alignof(struct s4) == 1);
53#endif
54