1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2 
3 /*
4  * BTF-to-C dumper tests for struct packing determination.
5  *
6  * Copyright (c) 2019 Facebook
7  */
8 /* ----- START-EXPECTED-OUTPUT ----- */
9 struct packed_trailing_space {
10 	int a;
11 	short b;
12 } __attribute__((packed));
13 
14 struct non_packed_trailing_space {
15 	int a;
16 	short b;
17 };
18 
19 struct packed_fields {
20 	short a;
21 	int b;
22 } __attribute__((packed));
23 
24 struct non_packed_fields {
25 	short a;
26 	int b;
27 };
28 
29 struct nested_packed {
30 	char: 4;
31 	int a: 4;
32 	long b;
33 	struct {
34 		char c;
35 		int d;
36 	} __attribute__((packed)) e;
37 } __attribute__((packed));
38 
39 union union_is_never_packed {
40 	int a: 4;
41 	char b;
42 	char c: 1;
43 };
44 
45 union union_does_not_need_packing {
46 	struct {
47 		long a;
48 		int b;
49 	} __attribute__((packed));
50 	int c;
51 };
52 
53 union jump_code_union {
54 	char code[5];
55 	struct {
56 		char jump;
57 		int offset;
58 	} __attribute__((packed));
59 };
60 
61 /* ----- START-EXPECTED-OUTPUT ----- */
62 /*
63  *struct nested_packed_but_aligned_struct {
64  *	int x1;
65  *	int x2;
66  *};
67  *
68  *struct outer_implicitly_packed_struct {
69  *	char y1;
70  *	struct nested_packed_but_aligned_struct y2;
71  *} __attribute__((packed));
72  *
73  */
74 /* ------ END-EXPECTED-OUTPUT ------ */
75 
76 struct nested_packed_but_aligned_struct {
77 	int x1;
78 	int x2;
79 } __attribute__((packed));
80 
81 struct outer_implicitly_packed_struct {
82 	char y1;
83 	struct nested_packed_but_aligned_struct y2;
84 };
85 /* ----- START-EXPECTED-OUTPUT ----- */
86 /*
87  *struct usb_ss_ep_comp_descriptor {
88  *	char: 8;
89  *	char bDescriptorType;
90  *	char bMaxBurst;
91  *	short wBytesPerInterval;
92  *};
93  *
94  *struct usb_host_endpoint {
95  *	long: 64;
96  *	char: 8;
97  *	struct usb_ss_ep_comp_descriptor ss_ep_comp;
98  *	long: 0;
99  *} __attribute__((packed));
100  *
101  */
102 /* ------ END-EXPECTED-OUTPUT ------ */
103 
104 struct usb_ss_ep_comp_descriptor {
105 	char: 8;
106 	char bDescriptorType;
107 	char bMaxBurst;
108 	int: 0;
109 	short wBytesPerInterval;
110 } __attribute__((packed));
111 
112 struct usb_host_endpoint {
113 	long: 64;
114 	char: 8;
115 	struct usb_ss_ep_comp_descriptor ss_ep_comp;
116 	long: 0;
117 };
118 
119 /* ----- START-EXPECTED-OUTPUT ----- */
120 struct nested_packed_struct {
121 	int a;
122 	char b;
123 } __attribute__((packed));
124 
125 struct outer_nonpacked_struct {
126 	short a;
127 	struct nested_packed_struct b;
128 };
129 
130 struct outer_packed_struct {
131 	short a;
132 	struct nested_packed_struct b;
133 } __attribute__((packed));
134 
135 /* ------ END-EXPECTED-OUTPUT ------ */
136 
137 int f(struct {
138 	struct packed_trailing_space _1;
139 	struct non_packed_trailing_space _2;
140 	struct packed_fields _3;
141 	struct non_packed_fields _4;
142 	struct nested_packed _5;
143 	union union_is_never_packed _6;
144 	union union_does_not_need_packing _7;
145 	union jump_code_union _8;
146 	struct outer_implicitly_packed_struct _9;
147 	struct usb_host_endpoint _10;
148 	struct outer_nonpacked_struct _11;
149 	struct outer_packed_struct _12;
150 } *_)
151 {
152 	return 0;
153 }
154