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