12d2a3ad8SAndrii Nakryiko // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
22d2a3ad8SAndrii Nakryiko 
32d2a3ad8SAndrii Nakryiko /*
42d2a3ad8SAndrii Nakryiko  * BTF-to-C dumper tests for struct packing determination.
52d2a3ad8SAndrii Nakryiko  *
62d2a3ad8SAndrii Nakryiko  * Copyright (c) 2019 Facebook
72d2a3ad8SAndrii Nakryiko  */
82d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
92d2a3ad8SAndrii Nakryiko struct packed_trailing_space {
102d2a3ad8SAndrii Nakryiko 	int a;
112d2a3ad8SAndrii Nakryiko 	short b;
122d2a3ad8SAndrii Nakryiko } __attribute__((packed));
132d2a3ad8SAndrii Nakryiko 
142d2a3ad8SAndrii Nakryiko struct non_packed_trailing_space {
152d2a3ad8SAndrii Nakryiko 	int a;
162d2a3ad8SAndrii Nakryiko 	short b;
172d2a3ad8SAndrii Nakryiko };
182d2a3ad8SAndrii Nakryiko 
192d2a3ad8SAndrii Nakryiko struct packed_fields {
202d2a3ad8SAndrii Nakryiko 	short a;
212d2a3ad8SAndrii Nakryiko 	int b;
222d2a3ad8SAndrii Nakryiko } __attribute__((packed));
232d2a3ad8SAndrii Nakryiko 
242d2a3ad8SAndrii Nakryiko struct non_packed_fields {
252d2a3ad8SAndrii Nakryiko 	short a;
262d2a3ad8SAndrii Nakryiko 	int b;
272d2a3ad8SAndrii Nakryiko };
282d2a3ad8SAndrii Nakryiko 
292d2a3ad8SAndrii Nakryiko struct nested_packed {
302d2a3ad8SAndrii Nakryiko 	char: 4;
312d2a3ad8SAndrii Nakryiko 	int a: 4;
327e3cbd34SYucong Sun 	long b;
332d2a3ad8SAndrii Nakryiko 	struct {
342d2a3ad8SAndrii Nakryiko 		char c;
352d2a3ad8SAndrii Nakryiko 		int d;
362d2a3ad8SAndrii Nakryiko 	} __attribute__((packed)) e;
372d2a3ad8SAndrii Nakryiko } __attribute__((packed));
382d2a3ad8SAndrii Nakryiko 
392d2a3ad8SAndrii Nakryiko union union_is_never_packed {
402d2a3ad8SAndrii Nakryiko 	int a: 4;
412d2a3ad8SAndrii Nakryiko 	char b;
422d2a3ad8SAndrii Nakryiko 	char c: 1;
432d2a3ad8SAndrii Nakryiko };
442d2a3ad8SAndrii Nakryiko 
452d2a3ad8SAndrii Nakryiko union union_does_not_need_packing {
462d2a3ad8SAndrii Nakryiko 	struct {
477e3cbd34SYucong Sun 		long a;
482d2a3ad8SAndrii Nakryiko 		int b;
492d2a3ad8SAndrii Nakryiko 	} __attribute__((packed));
502d2a3ad8SAndrii Nakryiko 	int c;
512d2a3ad8SAndrii Nakryiko };
522d2a3ad8SAndrii Nakryiko 
532d2a3ad8SAndrii Nakryiko union jump_code_union {
542d2a3ad8SAndrii Nakryiko 	char code[5];
552d2a3ad8SAndrii Nakryiko 	struct {
562d2a3ad8SAndrii Nakryiko 		char jump;
572d2a3ad8SAndrii Nakryiko 		int offset;
582d2a3ad8SAndrii Nakryiko 	} __attribute__((packed));
592d2a3ad8SAndrii Nakryiko };
602d2a3ad8SAndrii Nakryiko 
61b148c8b9SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
62b148c8b9SAndrii Nakryiko /*
63b148c8b9SAndrii Nakryiko  *struct nested_packed_but_aligned_struct {
64b148c8b9SAndrii Nakryiko  *	int x1;
65b148c8b9SAndrii Nakryiko  *	int x2;
66b148c8b9SAndrii Nakryiko  *};
67b148c8b9SAndrii Nakryiko  *
68b148c8b9SAndrii Nakryiko  *struct outer_implicitly_packed_struct {
69b148c8b9SAndrii Nakryiko  *	char y1;
70b148c8b9SAndrii Nakryiko  *	struct nested_packed_but_aligned_struct y2;
71b148c8b9SAndrii Nakryiko  *} __attribute__((packed));
72b148c8b9SAndrii Nakryiko  *
73b148c8b9SAndrii Nakryiko  */
742d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
752d2a3ad8SAndrii Nakryiko 
76b148c8b9SAndrii Nakryiko struct nested_packed_but_aligned_struct {
77b148c8b9SAndrii Nakryiko 	int x1;
78b148c8b9SAndrii Nakryiko 	int x2;
79b148c8b9SAndrii Nakryiko } __attribute__((packed));
80b148c8b9SAndrii Nakryiko 
81b148c8b9SAndrii Nakryiko struct outer_implicitly_packed_struct {
82b148c8b9SAndrii Nakryiko 	char y1;
83b148c8b9SAndrii Nakryiko 	struct nested_packed_but_aligned_struct y2;
84b148c8b9SAndrii Nakryiko };
85b148c8b9SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
86b148c8b9SAndrii Nakryiko /*
87b148c8b9SAndrii Nakryiko  *struct usb_ss_ep_comp_descriptor {
88b148c8b9SAndrii Nakryiko  *	char: 8;
89b148c8b9SAndrii Nakryiko  *	char bDescriptorType;
90b148c8b9SAndrii Nakryiko  *	char bMaxBurst;
91b148c8b9SAndrii Nakryiko  *	short wBytesPerInterval;
92b148c8b9SAndrii Nakryiko  *};
93b148c8b9SAndrii Nakryiko  *
94b148c8b9SAndrii Nakryiko  *struct usb_host_endpoint {
95b148c8b9SAndrii Nakryiko  *	long: 64;
96b148c8b9SAndrii Nakryiko  *	char: 8;
97b148c8b9SAndrii Nakryiko  *	struct usb_ss_ep_comp_descriptor ss_ep_comp;
98b148c8b9SAndrii Nakryiko  *	long: 0;
99b148c8b9SAndrii Nakryiko  *} __attribute__((packed));
100b148c8b9SAndrii Nakryiko  *
101b148c8b9SAndrii Nakryiko  */
102b148c8b9SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
103b148c8b9SAndrii Nakryiko 
104b148c8b9SAndrii Nakryiko struct usb_ss_ep_comp_descriptor {
105b148c8b9SAndrii Nakryiko 	char: 8;
106b148c8b9SAndrii Nakryiko 	char bDescriptorType;
107b148c8b9SAndrii Nakryiko 	char bMaxBurst;
108b148c8b9SAndrii Nakryiko 	int: 0;
109b148c8b9SAndrii Nakryiko 	short wBytesPerInterval;
110b148c8b9SAndrii Nakryiko } __attribute__((packed));
111b148c8b9SAndrii Nakryiko 
112b148c8b9SAndrii Nakryiko struct usb_host_endpoint {
113b148c8b9SAndrii Nakryiko 	long: 64;
114b148c8b9SAndrii Nakryiko 	char: 8;
115b148c8b9SAndrii Nakryiko 	struct usb_ss_ep_comp_descriptor ss_ep_comp;
116b148c8b9SAndrii Nakryiko 	long: 0;
117b148c8b9SAndrii Nakryiko };
118b148c8b9SAndrii Nakryiko 
119*4fb877aaSAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */
120*4fb877aaSAndrii Nakryiko struct nested_packed_struct {
121*4fb877aaSAndrii Nakryiko 	int a;
122*4fb877aaSAndrii Nakryiko 	char b;
123*4fb877aaSAndrii Nakryiko } __attribute__((packed));
124*4fb877aaSAndrii Nakryiko 
125*4fb877aaSAndrii Nakryiko struct outer_nonpacked_struct {
126*4fb877aaSAndrii Nakryiko 	short a;
127*4fb877aaSAndrii Nakryiko 	struct nested_packed_struct b;
128*4fb877aaSAndrii Nakryiko };
129*4fb877aaSAndrii Nakryiko 
130*4fb877aaSAndrii Nakryiko struct outer_packed_struct {
131*4fb877aaSAndrii Nakryiko 	short a;
132*4fb877aaSAndrii Nakryiko 	struct nested_packed_struct b;
133*4fb877aaSAndrii Nakryiko } __attribute__((packed));
134*4fb877aaSAndrii Nakryiko 
135*4fb877aaSAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */
136b148c8b9SAndrii Nakryiko 
f(struct{ struct packed_trailing_space _1; struct non_packed_trailing_space _2; struct packed_fields _3; struct non_packed_fields _4; struct nested_packed _5; union union_is_never_packed _6; union union_does_not_need_packing _7; union jump_code_union _8; struct outer_implicitly_packed_struct _9; struct usb_host_endpoint _10; struct outer_nonpacked_struct _11; struct outer_packed_struct _12; } * _)1372d2a3ad8SAndrii Nakryiko int f(struct {
1382d2a3ad8SAndrii Nakryiko 	struct packed_trailing_space _1;
1392d2a3ad8SAndrii Nakryiko 	struct non_packed_trailing_space _2;
1402d2a3ad8SAndrii Nakryiko 	struct packed_fields _3;
1412d2a3ad8SAndrii Nakryiko 	struct non_packed_fields _4;
1422d2a3ad8SAndrii Nakryiko 	struct nested_packed _5;
1432d2a3ad8SAndrii Nakryiko 	union union_is_never_packed _6;
1442d2a3ad8SAndrii Nakryiko 	union union_does_not_need_packing _7;
1452d2a3ad8SAndrii Nakryiko 	union jump_code_union _8;
146b148c8b9SAndrii Nakryiko 	struct outer_implicitly_packed_struct _9;
147b148c8b9SAndrii Nakryiko 	struct usb_host_endpoint _10;
148*4fb877aaSAndrii Nakryiko 	struct outer_nonpacked_struct _11;
149*4fb877aaSAndrii Nakryiko 	struct outer_packed_struct _12;
1502d2a3ad8SAndrii Nakryiko } *_)
1512d2a3ad8SAndrii Nakryiko {
1522d2a3ad8SAndrii Nakryiko 	return 0;
1532d2a3ad8SAndrii Nakryiko }
154