• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -w -fdump-record-layouts %s 2> %t.layouts
2 // RUN: %clang_cc1 -w -fdump-record-layouts-simple %s > %t.before 2>&1
3 // RUN: %clang_cc1 -w -DPACKED= -DALIGNED16= -fdump-record-layouts-simple -foverride-record-layout=%t.layouts %s > %t.after 2>&1
4 // RUN: diff %t.before %t.after
5 // RUN: FileCheck %s < %t.after
6 
7 // If not explicitly disabled, set PACKED to the packed attribute.
8 #ifndef PACKED
9 #  define PACKED __attribute__((packed))
10 #endif
11 
12 // If not explicitly disabled, set ALIGNED16 to 16-byte alignment.
13 #ifndef ALIGNED16
14 #  define ALIGNED16 __attribute__((aligned(16)))
15 #endif
16 
17 // CHECK: Type: struct X0
18 struct X0 {
19   int x[6] PACKED;
20 };
21 
22 // CHECK: Type: struct X1
23 struct X1 {
24   char x[13];
25   struct X0 y;
26 } PACKED;
27 
28 // CHECK: Type: struct X2
29 struct PACKED X2 {
30   short x;
31   int y;
32 };
33 
34 // CHECK: Type: struct X3
35 struct X3 {
36   short x PACKED;
37   int y;
38 };
39 
40 #pragma pack(push,2)
41 // CHECK: Type: struct X4
42 struct X4 {
43   int x;
44   int y;
45 };
46 #pragma pack(pop)
47 
48 // CHECK: Type: struct X5
49 struct PACKED X5 { double a[19];  signed char b; };
50 
51 // CHECK: Type: struct X6
52 struct PACKED X6 { long double a; char b; };
53 
54 // CHECK: Type: struct X7
55 struct X7 {
56         unsigned x;
57         unsigned char y;
58 } PACKED;
59 
60 // CHECK: Type: union X8
61 union X8 {
62   struct X7 x;
63   unsigned y;
64 } PACKED;
65 
66 // CHECK: Type: struct X9
67 struct X9 {
68   unsigned int x[2] PACKED;
69   unsigned int y;
70   unsigned int z PACKED;
71 };
72 
73 // CHECK: Type: struct X10
74 struct X10 {
75   unsigned int x[2] PACKED;
76   unsigned int y PACKED;
77   unsigned int z PACKED;
78 };
79 
80 // CHECK: Type: struct X11
81 struct PACKED X11 {
82   unsigned int x[2];
83   unsigned int y;
84   unsigned int z;
85 };
86 
87 // CHECK: Type: struct X12
88 struct PACKED X12 {
89   int x : 24;
90 };
91 
92 // CHECK: Type: struct X13
93 struct PACKED X13 {
94   signed x : 10;
95   signed y : 10;
96 };
97 
98 // CHECK: Type: union X14
99 union PACKED X14 {
100   unsigned long long x : 3;
101 };
102 
103 // CHECK: Type: struct X15
104 struct X15 {
105   unsigned x : 16;
106   unsigned y : 28 PACKED;
107 };
108 
109 // CHECK: Type: struct X16
110 struct ALIGNED16 X16 {
111   int a, b, c;
112   int x : 5;
113   int y : 29;
114 };
115 
use_structs()116 void use_structs() {
117   struct X0 x0;
118   x0.x[5] = sizeof(struct X0);
119 
120   struct X1 x1;
121   x1.x[5] = sizeof(struct X1);
122 
123   struct X2 x2;
124   x2.y = sizeof(struct X2);
125 
126   struct X3 x3;
127   x3.y = sizeof(struct X3);
128 
129   struct X4 x4;
130   x4.y = sizeof(struct X4);
131 
132   struct X5 x5;
133   x5.b = sizeof(struct X5);
134 
135   struct X6 x6;
136   x6.b = sizeof(struct X6);
137 
138   struct X7 x7;
139   typedef int X7array[sizeof(struct X7)];
140   x7.x = sizeof(struct X7);
141   x7.y = x7.x;
142 
143   union X8 x8;
144   typedef int X8array[sizeof(union X8)];
145   x8.y = sizeof(union X8);
146   x8.x.x = x8.y;
147 
148   struct X9 x9;
149   typedef int X9array[sizeof(struct X9)];
150   x9.y = sizeof(struct X9);
151 
152   struct X10 x10;
153   typedef int X10array[sizeof(struct X10)];
154   x10.y = sizeof(struct X10);
155 
156   struct X11 x11;
157   typedef int X11array[sizeof(struct X11)];
158   x11.y = sizeof(struct X11);
159 
160   struct X12 x12;
161   x12.x = sizeof(struct X12);
162 
163   struct X13 x13;
164   x13.x = sizeof(struct X13);
165 
166   union X14 x14;
167   x14.x = sizeof(union X14);
168 
169   struct X15 x15;
170   x15.x = sizeof(struct X15);
171 
172   struct X16 x16;
173   x16.x = sizeof(struct X16);
174 }
175