12d2a3ad8SAndrii Nakryiko // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
22d2a3ad8SAndrii Nakryiko 
32d2a3ad8SAndrii Nakryiko /*
42d2a3ad8SAndrii Nakryiko  * BTF-to-C dumper tests for implicit and explicit padding between fields and
52d2a3ad8SAndrii Nakryiko  * at the end of a struct.
62d2a3ad8SAndrii Nakryiko  *
72d2a3ad8SAndrii Nakryiko  * Copyright (c) 2019 Facebook
82d2a3ad8SAndrii Nakryiko  */
92d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
102d2a3ad8SAndrii Nakryiko struct padded_implicitly {
112d2a3ad8SAndrii Nakryiko 	int a;
127e3cbd34SYucong Sun 	long b;
132d2a3ad8SAndrii Nakryiko 	char c;
142d2a3ad8SAndrii Nakryiko };
152d2a3ad8SAndrii Nakryiko 
162d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
172d2a3ad8SAndrii Nakryiko 
182d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
192d2a3ad8SAndrii Nakryiko /*
202d2a3ad8SAndrii Nakryiko  *struct padded_explicitly {
212d2a3ad8SAndrii Nakryiko  *	int a;
22ea2ce1baSAndrii Nakryiko  *	long: 0;
232d2a3ad8SAndrii Nakryiko  *	int b;
242d2a3ad8SAndrii Nakryiko  *};
252d2a3ad8SAndrii Nakryiko  *
262d2a3ad8SAndrii Nakryiko  */
272d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
282d2a3ad8SAndrii Nakryiko 
292d2a3ad8SAndrii Nakryiko struct padded_explicitly {
302d2a3ad8SAndrii Nakryiko 	int a;
31ea2ce1baSAndrii Nakryiko 	int: 1; /* algo will emit aligning `long: 0;` here */
322d2a3ad8SAndrii Nakryiko 	int b;
332d2a3ad8SAndrii Nakryiko };
342d2a3ad8SAndrii Nakryiko 
352d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
362d2a3ad8SAndrii Nakryiko struct padded_a_lot {
372d2a3ad8SAndrii Nakryiko 	int a;
382d2a3ad8SAndrii Nakryiko 	long: 64;
392d2a3ad8SAndrii Nakryiko 	long: 64;
402d2a3ad8SAndrii Nakryiko 	int b;
412d2a3ad8SAndrii Nakryiko };
422d2a3ad8SAndrii Nakryiko 
43ea2ce1baSAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
44ea2ce1baSAndrii Nakryiko 
452d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
462d2a3ad8SAndrii Nakryiko /*
472d2a3ad8SAndrii Nakryiko  *struct padded_cache_line {
482d2a3ad8SAndrii Nakryiko  *	int a;
492d2a3ad8SAndrii Nakryiko  *	long: 64;
502d2a3ad8SAndrii Nakryiko  *	long: 64;
512d2a3ad8SAndrii Nakryiko  *	long: 64;
522d2a3ad8SAndrii Nakryiko  *	int b;
5376790c7cSAndrii Nakryiko  *	long: 64;
5476790c7cSAndrii Nakryiko  *	long: 64;
5576790c7cSAndrii Nakryiko  *	long: 64;
562d2a3ad8SAndrii Nakryiko  *};
572d2a3ad8SAndrii Nakryiko  *
582d2a3ad8SAndrii Nakryiko  */
592d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
602d2a3ad8SAndrii Nakryiko 
612d2a3ad8SAndrii Nakryiko struct padded_cache_line {
622d2a3ad8SAndrii Nakryiko 	int a;
632d2a3ad8SAndrii Nakryiko 	int b __attribute__((aligned(32)));
642d2a3ad8SAndrii Nakryiko };
652d2a3ad8SAndrii Nakryiko 
662d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
672d2a3ad8SAndrii Nakryiko /*
682d2a3ad8SAndrii Nakryiko  *struct zone_padding {
692d2a3ad8SAndrii Nakryiko  *	char x[0];
702d2a3ad8SAndrii Nakryiko  *};
712d2a3ad8SAndrii Nakryiko  *
722d2a3ad8SAndrii Nakryiko  *struct zone {
732d2a3ad8SAndrii Nakryiko  *	int a;
742d2a3ad8SAndrii Nakryiko  *	short b;
75ea2ce1baSAndrii Nakryiko  *	long: 0;
762d2a3ad8SAndrii Nakryiko  *	struct zone_padding __pad__;
772d2a3ad8SAndrii Nakryiko  *};
782d2a3ad8SAndrii Nakryiko  *
792d2a3ad8SAndrii Nakryiko  */
802d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
812d2a3ad8SAndrii Nakryiko 
822d2a3ad8SAndrii Nakryiko struct zone_padding {
832d2a3ad8SAndrii Nakryiko 	char x[0];
842d2a3ad8SAndrii Nakryiko } __attribute__((__aligned__(8)));
852d2a3ad8SAndrii Nakryiko 
862d2a3ad8SAndrii Nakryiko struct zone {
872d2a3ad8SAndrii Nakryiko 	int a;
882d2a3ad8SAndrii Nakryiko 	short b;
892d2a3ad8SAndrii Nakryiko 	struct zone_padding __pad__;
902d2a3ad8SAndrii Nakryiko };
912d2a3ad8SAndrii Nakryiko 
92d503f117SEduard Zingerman /* ----- START-EXPECTED-OUTPUT ----- */
93d503f117SEduard Zingerman struct padding_wo_named_members {
94d503f117SEduard Zingerman 	long: 64;
95d503f117SEduard Zingerman 	long: 64;
96d503f117SEduard Zingerman };
97d503f117SEduard Zingerman 
98ea2ce1baSAndrii Nakryiko struct padding_weird_1 {
99ea2ce1baSAndrii Nakryiko 	int a;
100ea2ce1baSAndrii Nakryiko 	long: 64;
101ea2ce1baSAndrii Nakryiko 	short: 16;
102ea2ce1baSAndrii Nakryiko 	short b;
103ea2ce1baSAndrii Nakryiko };
104ea2ce1baSAndrii Nakryiko 
105ea2ce1baSAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
106ea2ce1baSAndrii Nakryiko 
107ea2ce1baSAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
108ea2ce1baSAndrii Nakryiko /*
109ea2ce1baSAndrii Nakryiko  *struct padding_weird_2 {
110ea2ce1baSAndrii Nakryiko  *	long: 56;
111ea2ce1baSAndrii Nakryiko  *	char a;
112ea2ce1baSAndrii Nakryiko  *	long: 56;
113ea2ce1baSAndrii Nakryiko  *	char b;
114ea2ce1baSAndrii Nakryiko  *	char: 8;
115ea2ce1baSAndrii Nakryiko  *};
116ea2ce1baSAndrii Nakryiko  *
117ea2ce1baSAndrii Nakryiko  */
118ea2ce1baSAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
119ea2ce1baSAndrii Nakryiko struct padding_weird_2 {
120ea2ce1baSAndrii Nakryiko 	int: 32;	/* these paddings will be collapsed into `long: 56;` */
121ea2ce1baSAndrii Nakryiko 	short: 16;
122ea2ce1baSAndrii Nakryiko 	char: 8;
123ea2ce1baSAndrii Nakryiko 	char a;
124ea2ce1baSAndrii Nakryiko 	int: 32;	/* these paddings will be collapsed into `long: 56;` */
125ea2ce1baSAndrii Nakryiko 	short: 16;
126ea2ce1baSAndrii Nakryiko 	char: 8;
127ea2ce1baSAndrii Nakryiko 	char b;
128ea2ce1baSAndrii Nakryiko 	char: 8;
129ea2ce1baSAndrii Nakryiko };
130ea2ce1baSAndrii Nakryiko 
131*b148c8b9SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
132*b148c8b9SAndrii Nakryiko struct exact_1byte {
133*b148c8b9SAndrii Nakryiko 	char x;
134*b148c8b9SAndrii Nakryiko };
135*b148c8b9SAndrii Nakryiko 
136*b148c8b9SAndrii Nakryiko struct padded_1byte {
137*b148c8b9SAndrii Nakryiko 	char: 8;
138*b148c8b9SAndrii Nakryiko };
139*b148c8b9SAndrii Nakryiko 
140*b148c8b9SAndrii Nakryiko struct exact_2bytes {
141*b148c8b9SAndrii Nakryiko 	short x;
142*b148c8b9SAndrii Nakryiko };
143*b148c8b9SAndrii Nakryiko 
144*b148c8b9SAndrii Nakryiko struct padded_2bytes {
145*b148c8b9SAndrii Nakryiko 	short: 16;
146*b148c8b9SAndrii Nakryiko };
147*b148c8b9SAndrii Nakryiko 
148*b148c8b9SAndrii Nakryiko struct exact_4bytes {
149*b148c8b9SAndrii Nakryiko 	int x;
150*b148c8b9SAndrii Nakryiko };
151*b148c8b9SAndrii Nakryiko 
152*b148c8b9SAndrii Nakryiko struct padded_4bytes {
153*b148c8b9SAndrii Nakryiko 	int: 32;
154*b148c8b9SAndrii Nakryiko };
155*b148c8b9SAndrii Nakryiko 
156*b148c8b9SAndrii Nakryiko struct exact_8bytes {
157*b148c8b9SAndrii Nakryiko 	long x;
158*b148c8b9SAndrii Nakryiko };
159*b148c8b9SAndrii Nakryiko 
160*b148c8b9SAndrii Nakryiko struct padded_8bytes {
161*b148c8b9SAndrii Nakryiko 	long: 64;
162*b148c8b9SAndrii Nakryiko };
163*b148c8b9SAndrii Nakryiko 
164*b148c8b9SAndrii Nakryiko struct ff_periodic_effect {
165*b148c8b9SAndrii Nakryiko 	int: 32;
166*b148c8b9SAndrii Nakryiko 	short magnitude;
167*b148c8b9SAndrii Nakryiko 	long: 0;
168*b148c8b9SAndrii Nakryiko 	short phase;
169*b148c8b9SAndrii Nakryiko 	long: 0;
170*b148c8b9SAndrii Nakryiko 	int: 32;
171*b148c8b9SAndrii Nakryiko 	int custom_len;
172*b148c8b9SAndrii Nakryiko 	short *custom_data;
173*b148c8b9SAndrii Nakryiko };
174*b148c8b9SAndrii Nakryiko 
175*b148c8b9SAndrii Nakryiko struct ib_wc {
176*b148c8b9SAndrii Nakryiko 	long: 64;
177*b148c8b9SAndrii Nakryiko 	long: 64;
178*b148c8b9SAndrii Nakryiko 	int: 32;
179*b148c8b9SAndrii Nakryiko 	int byte_len;
180*b148c8b9SAndrii Nakryiko 	void *qp;
181*b148c8b9SAndrii Nakryiko 	union {} ex;
182*b148c8b9SAndrii Nakryiko 	long: 64;
183*b148c8b9SAndrii Nakryiko 	int slid;
184*b148c8b9SAndrii Nakryiko 	int wc_flags;
185*b148c8b9SAndrii Nakryiko 	long: 64;
186*b148c8b9SAndrii Nakryiko 	char smac[6];
187*b148c8b9SAndrii Nakryiko 	long: 0;
188*b148c8b9SAndrii Nakryiko 	char network_hdr_type;
189*b148c8b9SAndrii Nakryiko };
190*b148c8b9SAndrii Nakryiko 
191*b148c8b9SAndrii Nakryiko struct acpi_object_method {
192*b148c8b9SAndrii Nakryiko 	long: 64;
193*b148c8b9SAndrii Nakryiko 	char: 8;
194*b148c8b9SAndrii Nakryiko 	char type;
195*b148c8b9SAndrii Nakryiko 	short reference_count;
196*b148c8b9SAndrii Nakryiko 	char flags;
197*b148c8b9SAndrii Nakryiko 	short: 0;
198*b148c8b9SAndrii Nakryiko 	char: 8;
199*b148c8b9SAndrii Nakryiko 	char sync_level;
200*b148c8b9SAndrii Nakryiko 	long: 64;
201*b148c8b9SAndrii Nakryiko 	void *node;
202*b148c8b9SAndrii Nakryiko 	void *aml_start;
203*b148c8b9SAndrii Nakryiko 	union {} dispatch;
204*b148c8b9SAndrii Nakryiko 	long: 64;
205*b148c8b9SAndrii Nakryiko 	int aml_length;
206*b148c8b9SAndrii Nakryiko };
207*b148c8b9SAndrii Nakryiko 
208*b148c8b9SAndrii Nakryiko struct nested_unpacked {
209*b148c8b9SAndrii Nakryiko 	int x;
210*b148c8b9SAndrii Nakryiko };
211*b148c8b9SAndrii Nakryiko 
212*b148c8b9SAndrii Nakryiko struct nested_packed {
213*b148c8b9SAndrii Nakryiko 	struct nested_unpacked a;
214*b148c8b9SAndrii Nakryiko 	char c;
215*b148c8b9SAndrii Nakryiko } __attribute__((packed));
216*b148c8b9SAndrii Nakryiko 
217*b148c8b9SAndrii Nakryiko struct outer_mixed_but_unpacked {
218*b148c8b9SAndrii Nakryiko 	struct nested_packed b1;
219*b148c8b9SAndrii Nakryiko 	short a1;
220*b148c8b9SAndrii Nakryiko 	struct nested_packed b2;
221*b148c8b9SAndrii Nakryiko };
222*b148c8b9SAndrii Nakryiko 
223d503f117SEduard Zingerman /* ------ END-EXPECTED-OUTPUT ------ */
224d503f117SEduard Zingerman 
f(struct{ struct padded_implicitly _1; struct padded_explicitly _2; struct padded_a_lot _3; struct padded_cache_line _4; struct zone _5; struct padding_wo_named_members _6; struct padding_weird_1 _7; struct padding_weird_2 _8; struct exact_1byte _100; struct padded_1byte _101; struct exact_2bytes _102; struct padded_2bytes _103; struct exact_4bytes _104; struct padded_4bytes _105; struct exact_8bytes _106; struct padded_8bytes _107; struct ff_periodic_effect _200; struct ib_wc _201; struct acpi_object_method _202; struct outer_mixed_but_unpacked _203; } * _)2252d2a3ad8SAndrii Nakryiko int f(struct {
2262d2a3ad8SAndrii Nakryiko 	struct padded_implicitly _1;
2272d2a3ad8SAndrii Nakryiko 	struct padded_explicitly _2;
2282d2a3ad8SAndrii Nakryiko 	struct padded_a_lot _3;
2292d2a3ad8SAndrii Nakryiko 	struct padded_cache_line _4;
2302d2a3ad8SAndrii Nakryiko 	struct zone _5;
231d503f117SEduard Zingerman 	struct padding_wo_named_members _6;
232ea2ce1baSAndrii Nakryiko 	struct padding_weird_1 _7;
233ea2ce1baSAndrii Nakryiko 	struct padding_weird_2 _8;
234*b148c8b9SAndrii Nakryiko 	struct exact_1byte _100;
235*b148c8b9SAndrii Nakryiko 	struct padded_1byte _101;
236*b148c8b9SAndrii Nakryiko 	struct exact_2bytes _102;
237*b148c8b9SAndrii Nakryiko 	struct padded_2bytes _103;
238*b148c8b9SAndrii Nakryiko 	struct exact_4bytes _104;
239*b148c8b9SAndrii Nakryiko 	struct padded_4bytes _105;
240*b148c8b9SAndrii Nakryiko 	struct exact_8bytes _106;
241*b148c8b9SAndrii Nakryiko 	struct padded_8bytes _107;
242*b148c8b9SAndrii Nakryiko 	struct ff_periodic_effect _200;
243*b148c8b9SAndrii Nakryiko 	struct ib_wc _201;
244*b148c8b9SAndrii Nakryiko 	struct acpi_object_method _202;
245*b148c8b9SAndrii Nakryiko 	struct outer_mixed_but_unpacked _203;
2462d2a3ad8SAndrii Nakryiko } *_)
2472d2a3ad8SAndrii Nakryiko {
2482d2a3ad8SAndrii Nakryiko 	return 0;
2492d2a3ad8SAndrii Nakryiko }
250