1// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2
3/*
4 * BTF-to-C dumper tests for implicit and explicit padding between fields and
5 * at the end of a struct.
6 *
7 * Copyright (c) 2019 Facebook
8 */
9/* ----- START-EXPECTED-OUTPUT ----- */
10struct padded_implicitly {
11	int a;
12	long b;
13	char c;
14};
15
16/* ------ END-EXPECTED-OUTPUT ------ */
17
18/* ----- START-EXPECTED-OUTPUT ----- */
19/*
20 *struct padded_explicitly {
21 *	int a;
22 *	long: 0;
23 *	int b;
24 *};
25 *
26 */
27/* ------ END-EXPECTED-OUTPUT ------ */
28
29struct padded_explicitly {
30	int a;
31	int: 1; /* algo will emit aligning `long: 0;` here */
32	int b;
33};
34
35/* ----- START-EXPECTED-OUTPUT ----- */
36struct padded_a_lot {
37	int a;
38	long: 64;
39	long: 64;
40	int b;
41};
42
43/* ------ END-EXPECTED-OUTPUT ------ */
44
45/* ----- START-EXPECTED-OUTPUT ----- */
46/*
47 *struct padded_cache_line {
48 *	int a;
49 *	long: 64;
50 *	long: 64;
51 *	long: 64;
52 *	int b;
53 *	long: 64;
54 *	long: 64;
55 *	long: 64;
56 *};
57 *
58 */
59/* ------ END-EXPECTED-OUTPUT ------ */
60
61struct padded_cache_line {
62	int a;
63	int b __attribute__((aligned(32)));
64};
65
66/* ----- START-EXPECTED-OUTPUT ----- */
67/*
68 *struct zone_padding {
69 *	char x[0];
70 *};
71 *
72 *struct zone {
73 *	int a;
74 *	short b;
75 *	long: 0;
76 *	struct zone_padding __pad__;
77 *};
78 *
79 */
80/* ------ END-EXPECTED-OUTPUT ------ */
81
82struct zone_padding {
83	char x[0];
84} __attribute__((__aligned__(8)));
85
86struct zone {
87	int a;
88	short b;
89	struct zone_padding __pad__;
90};
91
92/* ----- START-EXPECTED-OUTPUT ----- */
93struct padding_wo_named_members {
94	long: 64;
95	long: 64;
96};
97
98struct padding_weird_1 {
99	int a;
100	long: 64;
101	short: 16;
102	short b;
103};
104
105/* ------ END-EXPECTED-OUTPUT ------ */
106
107/* ----- START-EXPECTED-OUTPUT ----- */
108/*
109 *struct padding_weird_2 {
110 *	long: 56;
111 *	char a;
112 *	long: 56;
113 *	char b;
114 *	char: 8;
115 *};
116 *
117 */
118/* ------ END-EXPECTED-OUTPUT ------ */
119struct padding_weird_2 {
120	int: 32;	/* these paddings will be collapsed into `long: 56;` */
121	short: 16;
122	char: 8;
123	char a;
124	int: 32;	/* these paddings will be collapsed into `long: 56;` */
125	short: 16;
126	char: 8;
127	char b;
128	char: 8;
129};
130
131/* ----- START-EXPECTED-OUTPUT ----- */
132struct exact_1byte {
133	char x;
134};
135
136struct padded_1byte {
137	char: 8;
138};
139
140struct exact_2bytes {
141	short x;
142};
143
144struct padded_2bytes {
145	short: 16;
146};
147
148struct exact_4bytes {
149	int x;
150};
151
152struct padded_4bytes {
153	int: 32;
154};
155
156struct exact_8bytes {
157	long x;
158};
159
160struct padded_8bytes {
161	long: 64;
162};
163
164struct ff_periodic_effect {
165	int: 32;
166	short magnitude;
167	long: 0;
168	short phase;
169	long: 0;
170	int: 32;
171	int custom_len;
172	short *custom_data;
173};
174
175struct ib_wc {
176	long: 64;
177	long: 64;
178	int: 32;
179	int byte_len;
180	void *qp;
181	union {} ex;
182	long: 64;
183	int slid;
184	int wc_flags;
185	long: 64;
186	char smac[6];
187	long: 0;
188	char network_hdr_type;
189};
190
191struct acpi_object_method {
192	long: 64;
193	char: 8;
194	char type;
195	short reference_count;
196	char flags;
197	short: 0;
198	char: 8;
199	char sync_level;
200	long: 64;
201	void *node;
202	void *aml_start;
203	union {} dispatch;
204	long: 64;
205	int aml_length;
206};
207
208struct nested_unpacked {
209	int x;
210};
211
212struct nested_packed {
213	struct nested_unpacked a;
214	char c;
215} __attribute__((packed));
216
217struct outer_mixed_but_unpacked {
218	struct nested_packed b1;
219	short a1;
220	struct nested_packed b2;
221};
222
223/* ------ END-EXPECTED-OUTPUT ------ */
224
225int f(struct {
226	struct padded_implicitly _1;
227	struct padded_explicitly _2;
228	struct padded_a_lot _3;
229	struct padded_cache_line _4;
230	struct zone _5;
231	struct padding_wo_named_members _6;
232	struct padding_weird_1 _7;
233	struct padding_weird_2 _8;
234	struct exact_1byte _100;
235	struct padded_1byte _101;
236	struct exact_2bytes _102;
237	struct padded_2bytes _103;
238	struct exact_4bytes _104;
239	struct padded_4bytes _105;
240	struct exact_8bytes _106;
241	struct padded_8bytes _107;
242	struct ff_periodic_effect _200;
243	struct ib_wc _201;
244	struct acpi_object_method _202;
245	struct outer_mixed_but_unpacked _203;
246} *_)
247{
248	return 0;
249}
250