xref: /linux/tools/testing/selftests/bpf/progs/btf_dump_test_case_padding.c (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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 ----- */
10 struct 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 
29 struct padded_explicitly {
30 	int a;
31 	int: 1; /* algo will emit aligning `long: 0;` here */
32 	int b;
33 };
34 
35 /* ----- START-EXPECTED-OUTPUT ----- */
36 struct 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 
61 struct 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 
82 struct zone_padding {
83 	char x[0];
84 } __attribute__((__aligned__(8)));
85 
86 struct zone {
87 	int a;
88 	short b;
89 	struct zone_padding __pad__;
90 };
91 
92 /* ----- START-EXPECTED-OUTPUT ----- */
93 struct padding_wo_named_members {
94 	long: 64;
95 	long: 64;
96 };
97 
98 struct 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 ------ */
119 struct 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 ----- */
132 struct exact_1byte {
133 	char x;
134 };
135 
136 struct padded_1byte {
137 	char: 8;
138 };
139 
140 struct exact_2bytes {
141 	short x;
142 };
143 
144 struct padded_2bytes {
145 	short: 16;
146 };
147 
148 struct exact_4bytes {
149 	int x;
150 };
151 
152 struct padded_4bytes {
153 	int: 32;
154 };
155 
156 struct exact_8bytes {
157 	long x;
158 };
159 
160 struct padded_8bytes {
161 	long: 64;
162 };
163 
164 struct 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 
175 struct 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 
191 struct 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 
208 struct nested_unpacked {
209 	int x;
210 };
211 
212 struct nested_packed {
213 	struct nested_unpacked a;
214 	char c;
215 } __attribute__((packed));
216 
217 struct outer_mixed_but_unpacked {
218 	struct nested_packed b1;
219 	short a1;
220 	struct nested_packed b2;
221 };
222 
223 /* ------ END-EXPECTED-OUTPUT ------ */
224 
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; } * _)225 int 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