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

source code of linux/tools/testing/selftests/bpf/progs/btf_dump_test_case_padding.c