1c1f5e7ddSAndrii Nakryiko #include <stdint.h>
2c1f5e7ddSAndrii Nakryiko #include <stdbool.h>
35705d705SAndrii Nakryiko 
45705d705SAndrii Nakryiko void preserce_ptr_sz_fn(long x) {}
55705d705SAndrii Nakryiko 
65705d705SAndrii Nakryiko #define __bpf_aligned __attribute__((aligned(8)))
75705d705SAndrii Nakryiko 
8ee2eb063SAndrii Nakryiko /*
9ee2eb063SAndrii Nakryiko  * KERNEL
10ee2eb063SAndrii Nakryiko  */
11ee2eb063SAndrii Nakryiko 
12ee2eb063SAndrii Nakryiko struct core_reloc_kernel_output {
13ee2eb063SAndrii Nakryiko 	int valid[10];
14d25c5e23SAndrii Nakryiko 	char comm[sizeof("test_progs")];
15ee2eb063SAndrii Nakryiko 	int comm_len;
16ee2eb063SAndrii Nakryiko };
17c1f5e7ddSAndrii Nakryiko 
18002d3afcSAndrii Nakryiko /*
19002d3afcSAndrii Nakryiko  * FLAVORS
20002d3afcSAndrii Nakryiko  */
21002d3afcSAndrii Nakryiko struct core_reloc_flavors {
22002d3afcSAndrii Nakryiko 	int a;
23002d3afcSAndrii Nakryiko 	int b;
24002d3afcSAndrii Nakryiko 	int c;
25002d3afcSAndrii Nakryiko };
26002d3afcSAndrii Nakryiko 
27002d3afcSAndrii Nakryiko /* this is not a flavor, as it doesn't have triple underscore */
28002d3afcSAndrii Nakryiko struct core_reloc_flavors__err_wrong_name {
29002d3afcSAndrii Nakryiko 	int a;
30002d3afcSAndrii Nakryiko 	int b;
31002d3afcSAndrii Nakryiko 	int c;
32002d3afcSAndrii Nakryiko };
33ec6438a9SAndrii Nakryiko 
34ec6438a9SAndrii Nakryiko /*
35ec6438a9SAndrii Nakryiko  * NESTING
36ec6438a9SAndrii Nakryiko  */
37ec6438a9SAndrii Nakryiko /* original set up, used to record relocations in BPF program */
38ec6438a9SAndrii Nakryiko struct core_reloc_nesting_substruct {
39ec6438a9SAndrii Nakryiko 	int a;
40ec6438a9SAndrii Nakryiko };
41ec6438a9SAndrii Nakryiko 
42ec6438a9SAndrii Nakryiko union core_reloc_nesting_subunion {
43ec6438a9SAndrii Nakryiko 	int b;
44ec6438a9SAndrii Nakryiko };
45ec6438a9SAndrii Nakryiko 
46ec6438a9SAndrii Nakryiko struct core_reloc_nesting {
47ec6438a9SAndrii Nakryiko 	union {
48ec6438a9SAndrii Nakryiko 		struct core_reloc_nesting_substruct a;
49ec6438a9SAndrii Nakryiko 	} a;
50ec6438a9SAndrii Nakryiko 	struct {
51ec6438a9SAndrii Nakryiko 		union core_reloc_nesting_subunion b;
52ec6438a9SAndrii Nakryiko 	} b;
53ec6438a9SAndrii Nakryiko };
54ec6438a9SAndrii Nakryiko 
55ec6438a9SAndrii Nakryiko /* inlined anonymous struct/union instead of named structs in original */
56ec6438a9SAndrii Nakryiko struct core_reloc_nesting___anon_embed {
57ec6438a9SAndrii Nakryiko 	int __just_for_padding;
58ec6438a9SAndrii Nakryiko 	union {
59ec6438a9SAndrii Nakryiko 		struct {
60ec6438a9SAndrii Nakryiko 			int a;
61ec6438a9SAndrii Nakryiko 		} a;
62ec6438a9SAndrii Nakryiko 	} a;
63ec6438a9SAndrii Nakryiko 	struct {
64ec6438a9SAndrii Nakryiko 		union {
65ec6438a9SAndrii Nakryiko 			int b;
66ec6438a9SAndrii Nakryiko 		} b;
67ec6438a9SAndrii Nakryiko 	} b;
68ec6438a9SAndrii Nakryiko };
69ec6438a9SAndrii Nakryiko 
70ec6438a9SAndrii Nakryiko /* different mix of nested structs/unions than in original */
71ec6438a9SAndrii Nakryiko struct core_reloc_nesting___struct_union_mixup {
72ec6438a9SAndrii Nakryiko 	int __a;
73ec6438a9SAndrii Nakryiko 	struct {
74ec6438a9SAndrii Nakryiko 		int __a;
75ec6438a9SAndrii Nakryiko 		union {
76ec6438a9SAndrii Nakryiko 			char __a;
77ec6438a9SAndrii Nakryiko 			int a;
78ec6438a9SAndrii Nakryiko 		} a;
79ec6438a9SAndrii Nakryiko 	} a;
80ec6438a9SAndrii Nakryiko 	int __b;
81ec6438a9SAndrii Nakryiko 	union {
82ec6438a9SAndrii Nakryiko 		int __b;
83ec6438a9SAndrii Nakryiko 		union {
84ec6438a9SAndrii Nakryiko 			char __b;
85ec6438a9SAndrii Nakryiko 			int b;
86ec6438a9SAndrii Nakryiko 		} b;
87ec6438a9SAndrii Nakryiko 	} b;
88ec6438a9SAndrii Nakryiko };
89ec6438a9SAndrii Nakryiko 
90ec6438a9SAndrii Nakryiko /* extra anon structs/unions, but still valid a.a.a and b.b.b accessors */
91ec6438a9SAndrii Nakryiko struct core_reloc_nesting___extra_nesting {
92ec6438a9SAndrii Nakryiko 	int __padding;
93ec6438a9SAndrii Nakryiko 	struct {
94ec6438a9SAndrii Nakryiko 		struct {
95ec6438a9SAndrii Nakryiko 			struct {
96ec6438a9SAndrii Nakryiko 				struct {
97ec6438a9SAndrii Nakryiko 					union {
98ec6438a9SAndrii Nakryiko 						int a;
99ec6438a9SAndrii Nakryiko 					} a;
100ec6438a9SAndrii Nakryiko 				};
101ec6438a9SAndrii Nakryiko 			};
102ec6438a9SAndrii Nakryiko 		} a;
103ec6438a9SAndrii Nakryiko 		int __some_more;
104ec6438a9SAndrii Nakryiko 		struct {
105ec6438a9SAndrii Nakryiko 			union {
106ec6438a9SAndrii Nakryiko 				union {
107ec6438a9SAndrii Nakryiko 					union {
108ec6438a9SAndrii Nakryiko 						struct {
109ec6438a9SAndrii Nakryiko 							int b;
110ec6438a9SAndrii Nakryiko 						};
111ec6438a9SAndrii Nakryiko 					} b;
112ec6438a9SAndrii Nakryiko 				};
113ec6438a9SAndrii Nakryiko 			} b;
114ec6438a9SAndrii Nakryiko 		};
115ec6438a9SAndrii Nakryiko 	};
116ec6438a9SAndrii Nakryiko };
117ec6438a9SAndrii Nakryiko 
118ec6438a9SAndrii Nakryiko /* three flavors of same struct with different structure but same layout for
119ec6438a9SAndrii Nakryiko  * a.a.a and b.b.b, thus successfully resolved and relocatable */
120ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types {
121ec6438a9SAndrii Nakryiko 	char __just_for_padding;
122ec6438a9SAndrii Nakryiko 	/* 3 more bytes of padding */
123ec6438a9SAndrii Nakryiko 	struct {
124ec6438a9SAndrii Nakryiko 		struct {
125ec6438a9SAndrii Nakryiko 			int a; /* offset 4 */
126ec6438a9SAndrii Nakryiko 		} a;
127ec6438a9SAndrii Nakryiko 	} a;
128ec6438a9SAndrii Nakryiko 	long long __more_padding;
129ec6438a9SAndrii Nakryiko 	struct {
130ec6438a9SAndrii Nakryiko 		struct {
131ec6438a9SAndrii Nakryiko 			int b; /* offset 16 */
132ec6438a9SAndrii Nakryiko 		} b;
133ec6438a9SAndrii Nakryiko 	} b;
134ec6438a9SAndrii Nakryiko };
135ec6438a9SAndrii Nakryiko 
136ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types__2 {
137ec6438a9SAndrii Nakryiko 	int __aligned_padding;
138ec6438a9SAndrii Nakryiko 	struct {
139ec6438a9SAndrii Nakryiko 		int __trickier_noop[0];
140ec6438a9SAndrii Nakryiko 		struct {
141ec6438a9SAndrii Nakryiko 			char __some_more_noops[0];
142ec6438a9SAndrii Nakryiko 			int a; /* offset 4 */
143ec6438a9SAndrii Nakryiko 		} a;
144ec6438a9SAndrii Nakryiko 	} a;
145ec6438a9SAndrii Nakryiko 	int __more_padding;
146ec6438a9SAndrii Nakryiko 	struct {
147ec6438a9SAndrii Nakryiko 		struct {
148ec6438a9SAndrii Nakryiko 			struct {
149ec6438a9SAndrii Nakryiko 				int __critical_padding;
150ec6438a9SAndrii Nakryiko 				int b; /* offset 16 */
151ec6438a9SAndrii Nakryiko 			} b;
152ec6438a9SAndrii Nakryiko 			int __does_not_matter;
153ec6438a9SAndrii Nakryiko 		};
154ec6438a9SAndrii Nakryiko 	} b;
155ec6438a9SAndrii Nakryiko 	int __more_irrelevant_stuff;
156ec6438a9SAndrii Nakryiko };
157ec6438a9SAndrii Nakryiko 
158ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types__3 {
159ec6438a9SAndrii Nakryiko 	char __correct_padding[4];
160ec6438a9SAndrii Nakryiko 	struct {
161ec6438a9SAndrii Nakryiko 		struct {
162ec6438a9SAndrii Nakryiko 			int a; /* offset 4 */
163ec6438a9SAndrii Nakryiko 		} a;
164ec6438a9SAndrii Nakryiko 	} a;
165ec6438a9SAndrii Nakryiko 	/* 8 byte padding due to next struct's alignment */
166ec6438a9SAndrii Nakryiko 	struct {
167ec6438a9SAndrii Nakryiko 		struct {
168ec6438a9SAndrii Nakryiko 			int b;
169ec6438a9SAndrii Nakryiko 		} b;
170ec6438a9SAndrii Nakryiko 	} b __attribute__((aligned(16)));
171ec6438a9SAndrii Nakryiko };
172ec6438a9SAndrii Nakryiko 
173ec6438a9SAndrii Nakryiko /* b.b.b field is missing */
174ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_missing_field {
175ec6438a9SAndrii Nakryiko 	struct {
176ec6438a9SAndrii Nakryiko 		struct {
177ec6438a9SAndrii Nakryiko 			int a;
178ec6438a9SAndrii Nakryiko 		} a;
179ec6438a9SAndrii Nakryiko 	} a;
180ec6438a9SAndrii Nakryiko 	struct {
181ec6438a9SAndrii Nakryiko 		struct {
182ec6438a9SAndrii Nakryiko 			int x;
183ec6438a9SAndrii Nakryiko 		} b;
184ec6438a9SAndrii Nakryiko 	} b;
185ec6438a9SAndrii Nakryiko };
186ec6438a9SAndrii Nakryiko 
187ec6438a9SAndrii Nakryiko /* b.b.b field is an array of integers instead of plain int */
188ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_array_field {
189ec6438a9SAndrii Nakryiko 	struct {
190ec6438a9SAndrii Nakryiko 		struct {
191ec6438a9SAndrii Nakryiko 			int a;
192ec6438a9SAndrii Nakryiko 		} a;
193ec6438a9SAndrii Nakryiko 	} a;
194ec6438a9SAndrii Nakryiko 	struct {
195ec6438a9SAndrii Nakryiko 		struct {
196ec6438a9SAndrii Nakryiko 			int b[1];
197ec6438a9SAndrii Nakryiko 		} b;
198ec6438a9SAndrii Nakryiko 	} b;
199ec6438a9SAndrii Nakryiko };
200ec6438a9SAndrii Nakryiko 
201ec6438a9SAndrii Nakryiko /* middle b container is missing */
202ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_missing_container {
203ec6438a9SAndrii Nakryiko 	struct {
204ec6438a9SAndrii Nakryiko 		struct {
205ec6438a9SAndrii Nakryiko 			int a;
206ec6438a9SAndrii Nakryiko 		} a;
207ec6438a9SAndrii Nakryiko 	} a;
208ec6438a9SAndrii Nakryiko 	struct {
209ec6438a9SAndrii Nakryiko 		int x;
210ec6438a9SAndrii Nakryiko 	} b;
211ec6438a9SAndrii Nakryiko };
212ec6438a9SAndrii Nakryiko 
213ec6438a9SAndrii Nakryiko /* middle b container is referenced through pointer instead of being embedded */
214ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_nonstruct_container {
215ec6438a9SAndrii Nakryiko 	struct {
216ec6438a9SAndrii Nakryiko 		struct {
217ec6438a9SAndrii Nakryiko 			int a;
218ec6438a9SAndrii Nakryiko 		} a;
219ec6438a9SAndrii Nakryiko 	} a;
220ec6438a9SAndrii Nakryiko 	struct {
221ec6438a9SAndrii Nakryiko 		struct {
222ec6438a9SAndrii Nakryiko 			int b;
223ec6438a9SAndrii Nakryiko 		} *b;
224ec6438a9SAndrii Nakryiko 	} b;
225ec6438a9SAndrii Nakryiko };
226ec6438a9SAndrii Nakryiko 
227ec6438a9SAndrii Nakryiko /* middle b container is an array of structs instead of plain struct */
228ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_array_container {
229ec6438a9SAndrii Nakryiko 	struct {
230ec6438a9SAndrii Nakryiko 		struct {
231ec6438a9SAndrii Nakryiko 			int a;
232ec6438a9SAndrii Nakryiko 		} a;
233ec6438a9SAndrii Nakryiko 	} a;
234ec6438a9SAndrii Nakryiko 	struct {
235ec6438a9SAndrii Nakryiko 		struct {
236ec6438a9SAndrii Nakryiko 			int b;
237ec6438a9SAndrii Nakryiko 		} b[1];
238ec6438a9SAndrii Nakryiko 	} b;
239ec6438a9SAndrii Nakryiko };
240ec6438a9SAndrii Nakryiko 
241ec6438a9SAndrii Nakryiko /* two flavors of same struct with incompatible layout for b.b.b */
242ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_dup_incompat_types__1 {
243ec6438a9SAndrii Nakryiko 	struct {
244ec6438a9SAndrii Nakryiko 		struct {
245ec6438a9SAndrii Nakryiko 			int a; /* offset 0 */
246ec6438a9SAndrii Nakryiko 		} a;
247ec6438a9SAndrii Nakryiko 	} a;
248ec6438a9SAndrii Nakryiko 	struct {
249ec6438a9SAndrii Nakryiko 		struct {
250ec6438a9SAndrii Nakryiko 			int b; /* offset 4 */
251ec6438a9SAndrii Nakryiko 		} b;
252ec6438a9SAndrii Nakryiko 	} b;
253ec6438a9SAndrii Nakryiko };
254ec6438a9SAndrii Nakryiko 
255ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_dup_incompat_types__2 {
256ec6438a9SAndrii Nakryiko 	struct {
257ec6438a9SAndrii Nakryiko 		struct {
258ec6438a9SAndrii Nakryiko 			int a; /* offset 0 */
259ec6438a9SAndrii Nakryiko 		} a;
260ec6438a9SAndrii Nakryiko 	} a;
261ec6438a9SAndrii Nakryiko 	int __extra_padding;
262ec6438a9SAndrii Nakryiko 	struct {
263ec6438a9SAndrii Nakryiko 		struct {
264ec6438a9SAndrii Nakryiko 			int b; /* offset 8 (!) */
265ec6438a9SAndrii Nakryiko 		} b;
266ec6438a9SAndrii Nakryiko 	} b;
267ec6438a9SAndrii Nakryiko };
268ec6438a9SAndrii Nakryiko 
269ec6438a9SAndrii Nakryiko /* two flavors of same struct having one of a.a.a and b.b.b, but not both */
270ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_partial_match_dups__a {
271ec6438a9SAndrii Nakryiko 	struct {
272ec6438a9SAndrii Nakryiko 		struct {
273ec6438a9SAndrii Nakryiko 			int a;
274ec6438a9SAndrii Nakryiko 		} a;
275ec6438a9SAndrii Nakryiko 	} a;
276ec6438a9SAndrii Nakryiko };
277ec6438a9SAndrii Nakryiko 
278ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_partial_match_dups__b {
279ec6438a9SAndrii Nakryiko 	struct {
280ec6438a9SAndrii Nakryiko 		struct {
281ec6438a9SAndrii Nakryiko 			int b;
282ec6438a9SAndrii Nakryiko 		} b;
283ec6438a9SAndrii Nakryiko 	} b;
284ec6438a9SAndrii Nakryiko };
285ec6438a9SAndrii Nakryiko 
286ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_too_deep {
287ec6438a9SAndrii Nakryiko 	struct {
288ec6438a9SAndrii Nakryiko 		struct {
289ec6438a9SAndrii Nakryiko 			int a;
290ec6438a9SAndrii Nakryiko 		} a;
291ec6438a9SAndrii Nakryiko 	} a;
292ec6438a9SAndrii Nakryiko 	/* 65 levels of nestedness for b.b.b */
293ec6438a9SAndrii Nakryiko 	struct {
294ec6438a9SAndrii Nakryiko 		struct {
295ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
296ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
297ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
298ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
299ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
300ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
301ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
302ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
303ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
304ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
305ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
306ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
307ec6438a9SAndrii Nakryiko 				/* this one is one too much */
308ec6438a9SAndrii Nakryiko 				struct {
309ec6438a9SAndrii Nakryiko 					int b;
310ec6438a9SAndrii Nakryiko 				};
311ec6438a9SAndrii Nakryiko 			}; }; }; }; };
312ec6438a9SAndrii Nakryiko 			}; }; }; }; };
313ec6438a9SAndrii Nakryiko 			}; }; }; }; };
314ec6438a9SAndrii Nakryiko 			}; }; }; }; };
315ec6438a9SAndrii Nakryiko 			}; }; }; }; };
316ec6438a9SAndrii Nakryiko 			}; }; }; }; };
317ec6438a9SAndrii Nakryiko 			}; }; }; }; };
318ec6438a9SAndrii Nakryiko 			}; }; }; }; };
319ec6438a9SAndrii Nakryiko 			}; }; }; }; };
320ec6438a9SAndrii Nakryiko 			}; }; }; }; };
321ec6438a9SAndrii Nakryiko 			}; }; }; }; };
322ec6438a9SAndrii Nakryiko 			}; }; }; }; };
323ec6438a9SAndrii Nakryiko 		} b;
324ec6438a9SAndrii Nakryiko 	} b;
325ec6438a9SAndrii Nakryiko };
32620a9ad2eSAndrii Nakryiko 
32720a9ad2eSAndrii Nakryiko /*
32820a9ad2eSAndrii Nakryiko  * ARRAYS
32920a9ad2eSAndrii Nakryiko  */
33020a9ad2eSAndrii Nakryiko struct core_reloc_arrays_output {
33120a9ad2eSAndrii Nakryiko 	int a2;
33220a9ad2eSAndrii Nakryiko 	char b123;
33320a9ad2eSAndrii Nakryiko 	int c1c;
33420a9ad2eSAndrii Nakryiko 	int d00d;
3355f2eecefSAndrii Nakryiko 	int f10c;
33620a9ad2eSAndrii Nakryiko };
33720a9ad2eSAndrii Nakryiko 
33820a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct {
33920a9ad2eSAndrii Nakryiko 	int c;
34020a9ad2eSAndrii Nakryiko 	int d;
34120a9ad2eSAndrii Nakryiko };
34220a9ad2eSAndrii Nakryiko 
34320a9ad2eSAndrii Nakryiko struct core_reloc_arrays {
34420a9ad2eSAndrii Nakryiko 	int a[5];
34520a9ad2eSAndrii Nakryiko 	char b[2][3][4];
34620a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
34720a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
3485f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
34920a9ad2eSAndrii Nakryiko };
35020a9ad2eSAndrii Nakryiko 
35120a9ad2eSAndrii Nakryiko /* bigger array dimensions */
35220a9ad2eSAndrii Nakryiko struct core_reloc_arrays___diff_arr_dim {
35320a9ad2eSAndrii Nakryiko 	int a[7];
35420a9ad2eSAndrii Nakryiko 	char b[3][4][5];
35520a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[4];
35620a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[2][3];
3575f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[1][3];
35820a9ad2eSAndrii Nakryiko };
35920a9ad2eSAndrii Nakryiko 
36020a9ad2eSAndrii Nakryiko /* different size of array's value (struct) */
36120a9ad2eSAndrii Nakryiko struct core_reloc_arrays___diff_arr_val_sz {
36220a9ad2eSAndrii Nakryiko 	int a[5];
36320a9ad2eSAndrii Nakryiko 	char b[2][3][4];
36420a9ad2eSAndrii Nakryiko 	struct {
36520a9ad2eSAndrii Nakryiko 		int __padding1;
36620a9ad2eSAndrii Nakryiko 		int c;
36720a9ad2eSAndrii Nakryiko 		int __padding2;
36820a9ad2eSAndrii Nakryiko 	} c[3];
36920a9ad2eSAndrii Nakryiko 	struct {
37020a9ad2eSAndrii Nakryiko 		int __padding1;
37120a9ad2eSAndrii Nakryiko 		int d;
37220a9ad2eSAndrii Nakryiko 		int __padding2;
37320a9ad2eSAndrii Nakryiko 	} d[1][2];
3745f2eecefSAndrii Nakryiko 	struct {
3755f2eecefSAndrii Nakryiko 		int __padding1;
3765f2eecefSAndrii Nakryiko 		int c;
3775f2eecefSAndrii Nakryiko 		int __padding2;
3785f2eecefSAndrii Nakryiko 	} f[][2];
3795f2eecefSAndrii Nakryiko };
3805f2eecefSAndrii Nakryiko 
3815f2eecefSAndrii Nakryiko struct core_reloc_arrays___equiv_zero_sz_arr {
3825f2eecefSAndrii Nakryiko 	int a[5];
3835f2eecefSAndrii Nakryiko 	char b[2][3][4];
3845f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
3855f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
3865f2eecefSAndrii Nakryiko 	/* equivalent to flexible array */
387385bbf7bSGustavo A. R. Silva 	struct core_reloc_arrays_substruct f[][2];
3885f2eecefSAndrii Nakryiko };
3895f2eecefSAndrii Nakryiko 
3905f2eecefSAndrii Nakryiko struct core_reloc_arrays___fixed_arr {
3915f2eecefSAndrii Nakryiko 	int a[5];
3925f2eecefSAndrii Nakryiko 	char b[2][3][4];
3935f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
3945f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
3955f2eecefSAndrii Nakryiko 	/* not a flexible array anymore, but within access bounds */
3965f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[1][2];
39720a9ad2eSAndrii Nakryiko };
39820a9ad2eSAndrii Nakryiko 
39920a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_too_small {
40020a9ad2eSAndrii Nakryiko 	int a[2]; /* this one is too small */
40120a9ad2eSAndrii Nakryiko 	char b[2][3][4];
40220a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
40320a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4045f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
40520a9ad2eSAndrii Nakryiko };
40620a9ad2eSAndrii Nakryiko 
40720a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_too_shallow {
40820a9ad2eSAndrii Nakryiko 	int a[5];
40920a9ad2eSAndrii Nakryiko 	char b[2][3]; /* this one lacks one dimension */
41020a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
41120a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4125f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
41320a9ad2eSAndrii Nakryiko };
41420a9ad2eSAndrii Nakryiko 
41520a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_non_array {
41620a9ad2eSAndrii Nakryiko 	int a; /* not an array */
41720a9ad2eSAndrii Nakryiko 	char b[2][3][4];
41820a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
41920a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4205f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
42120a9ad2eSAndrii Nakryiko };
42220a9ad2eSAndrii Nakryiko 
42342765edeSAndrii Nakryiko struct core_reloc_arrays___err_wrong_val_type {
42420a9ad2eSAndrii Nakryiko 	int a[5];
42520a9ad2eSAndrii Nakryiko 	char b[2][3][4];
42620a9ad2eSAndrii Nakryiko 	int c[3]; /* value is not a struct */
42720a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4285f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
4295f2eecefSAndrii Nakryiko };
4305f2eecefSAndrii Nakryiko 
4315f2eecefSAndrii Nakryiko struct core_reloc_arrays___err_bad_zero_sz_arr {
4325f2eecefSAndrii Nakryiko 	/* zero-sized array, but not at the end */
4335f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[0][2];
4345f2eecefSAndrii Nakryiko 	int a[5];
4355f2eecefSAndrii Nakryiko 	char b[2][3][4];
4365f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
4375f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
43820a9ad2eSAndrii Nakryiko };
439d9db3550SAndrii Nakryiko 
440d9db3550SAndrii Nakryiko /*
441d9db3550SAndrii Nakryiko  * PRIMITIVES
442d9db3550SAndrii Nakryiko  */
443d9db3550SAndrii Nakryiko enum core_reloc_primitives_enum {
444d9db3550SAndrii Nakryiko 	A = 0,
445d9db3550SAndrii Nakryiko 	B = 1,
446d9db3550SAndrii Nakryiko };
447d9db3550SAndrii Nakryiko 
448d9db3550SAndrii Nakryiko struct core_reloc_primitives {
449d9db3550SAndrii Nakryiko 	char a;
450d9db3550SAndrii Nakryiko 	int b;
451d9db3550SAndrii Nakryiko 	enum core_reloc_primitives_enum c;
4525705d705SAndrii Nakryiko 	void *d __bpf_aligned;
4535705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
454d9db3550SAndrii Nakryiko };
455d9db3550SAndrii Nakryiko 
456d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_enum_def {
457d9db3550SAndrii Nakryiko 	char a;
458d9db3550SAndrii Nakryiko 	int b;
4595705d705SAndrii Nakryiko 	void *d __bpf_aligned;
4605705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
461d9db3550SAndrii Nakryiko 	enum {
462d9db3550SAndrii Nakryiko 		X = 100,
463d9db3550SAndrii Nakryiko 		Y = 200,
4645705d705SAndrii Nakryiko 	} c __bpf_aligned; /* inline enum def with differing set of values */
465d9db3550SAndrii Nakryiko };
466d9db3550SAndrii Nakryiko 
467d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_func_proto {
4685705d705SAndrii Nakryiko 	void (*f)(int) __bpf_aligned; /* incompatible function prototype */
4695705d705SAndrii Nakryiko 	void *d __bpf_aligned;
4705705d705SAndrii Nakryiko 	enum core_reloc_primitives_enum c __bpf_aligned;
471d9db3550SAndrii Nakryiko 	int b;
472d9db3550SAndrii Nakryiko 	char a;
473d9db3550SAndrii Nakryiko };
474d9db3550SAndrii Nakryiko 
475d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_ptr_type {
4765705d705SAndrii Nakryiko 	const char * const d __bpf_aligned; /* different pointee type + modifiers */
4775705d705SAndrii Nakryiko 	char a __bpf_aligned;
478d9db3550SAndrii Nakryiko 	int b;
479d9db3550SAndrii Nakryiko 	enum core_reloc_primitives_enum c;
4805705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
481d9db3550SAndrii Nakryiko };
482d9db3550SAndrii Nakryiko 
483d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_enum {
484d9db3550SAndrii Nakryiko 	char a[1];
485d9db3550SAndrii Nakryiko 	int b;
486d9db3550SAndrii Nakryiko 	int c; /* int instead of enum */
4875705d705SAndrii Nakryiko 	void *d __bpf_aligned;
4885705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
489d9db3550SAndrii Nakryiko };
490d9db3550SAndrii Nakryiko 
491d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_int {
492d9db3550SAndrii Nakryiko 	char a[1];
4935705d705SAndrii Nakryiko 	int *b __bpf_aligned; /* ptr instead of int */
4945705d705SAndrii Nakryiko 	enum core_reloc_primitives_enum c __bpf_aligned;
4955705d705SAndrii Nakryiko 	void *d __bpf_aligned;
4965705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
497d9db3550SAndrii Nakryiko };
498d9db3550SAndrii Nakryiko 
499d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_ptr {
500d9db3550SAndrii Nakryiko 	char a[1];
501d9db3550SAndrii Nakryiko 	int b;
502d9db3550SAndrii Nakryiko 	enum core_reloc_primitives_enum c;
503d9db3550SAndrii Nakryiko 	int d; /* int instead of ptr */
5045705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
505d9db3550SAndrii Nakryiko };
5069654e2aeSAndrii Nakryiko 
5079654e2aeSAndrii Nakryiko /*
5089654e2aeSAndrii Nakryiko  * MODS
5099654e2aeSAndrii Nakryiko  */
5109654e2aeSAndrii Nakryiko struct core_reloc_mods_output {
5119654e2aeSAndrii Nakryiko 	int a, b, c, d, e, f, g, h;
5129654e2aeSAndrii Nakryiko };
5139654e2aeSAndrii Nakryiko 
5149654e2aeSAndrii Nakryiko typedef const int int_t;
5155705d705SAndrii Nakryiko typedef const char *char_ptr_t __bpf_aligned;
5169654e2aeSAndrii Nakryiko typedef const int arr_t[7];
5179654e2aeSAndrii Nakryiko 
5189654e2aeSAndrii Nakryiko struct core_reloc_mods_substruct {
5199654e2aeSAndrii Nakryiko 	int x;
5209654e2aeSAndrii Nakryiko 	int y;
5219654e2aeSAndrii Nakryiko };
5229654e2aeSAndrii Nakryiko 
5239654e2aeSAndrii Nakryiko typedef struct {
5249654e2aeSAndrii Nakryiko 	int x;
5259654e2aeSAndrii Nakryiko 	int y;
5269654e2aeSAndrii Nakryiko } core_reloc_mods_substruct_t;
5279654e2aeSAndrii Nakryiko 
5289654e2aeSAndrii Nakryiko struct core_reloc_mods {
5299654e2aeSAndrii Nakryiko 	int a;
5309654e2aeSAndrii Nakryiko 	int_t b;
5315705d705SAndrii Nakryiko 	char *c __bpf_aligned;
5329654e2aeSAndrii Nakryiko 	char_ptr_t d;
5335705d705SAndrii Nakryiko 	int e[3] __bpf_aligned;
5349654e2aeSAndrii Nakryiko 	arr_t f;
5359654e2aeSAndrii Nakryiko 	struct core_reloc_mods_substruct g;
5369654e2aeSAndrii Nakryiko 	core_reloc_mods_substruct_t h;
5379654e2aeSAndrii Nakryiko };
5389654e2aeSAndrii Nakryiko 
5399654e2aeSAndrii Nakryiko /* a/b, c/d, e/f, and g/h pairs are swapped */
5409654e2aeSAndrii Nakryiko struct core_reloc_mods___mod_swap {
5419654e2aeSAndrii Nakryiko 	int b;
5429654e2aeSAndrii Nakryiko 	int_t a;
5435705d705SAndrii Nakryiko 	char *d __bpf_aligned;
5449654e2aeSAndrii Nakryiko 	char_ptr_t c;
5455705d705SAndrii Nakryiko 	int f[3] __bpf_aligned;
5469654e2aeSAndrii Nakryiko 	arr_t e;
5479654e2aeSAndrii Nakryiko 	struct {
5489654e2aeSAndrii Nakryiko 		int y;
5499654e2aeSAndrii Nakryiko 		int x;
5509654e2aeSAndrii Nakryiko 	} h;
5519654e2aeSAndrii Nakryiko 	core_reloc_mods_substruct_t g;
5529654e2aeSAndrii Nakryiko };
5539654e2aeSAndrii Nakryiko 
5549654e2aeSAndrii Nakryiko typedef int int1_t;
5559654e2aeSAndrii Nakryiko typedef int1_t int2_t;
5569654e2aeSAndrii Nakryiko typedef int2_t int3_t;
5579654e2aeSAndrii Nakryiko 
5589654e2aeSAndrii Nakryiko typedef int arr1_t[5];
5599654e2aeSAndrii Nakryiko typedef arr1_t arr2_t;
5609654e2aeSAndrii Nakryiko typedef arr2_t arr3_t;
5619654e2aeSAndrii Nakryiko typedef arr3_t arr4_t;
5629654e2aeSAndrii Nakryiko 
5635705d705SAndrii Nakryiko typedef const char * const volatile fancy_char_ptr_t __bpf_aligned;
5649654e2aeSAndrii Nakryiko 
5659654e2aeSAndrii Nakryiko typedef core_reloc_mods_substruct_t core_reloc_mods_substruct_tt;
5669654e2aeSAndrii Nakryiko 
5679654e2aeSAndrii Nakryiko /* we need more typedefs */
5689654e2aeSAndrii Nakryiko struct core_reloc_mods___typedefs {
5699654e2aeSAndrii Nakryiko 	core_reloc_mods_substruct_tt g;
5709654e2aeSAndrii Nakryiko 	core_reloc_mods_substruct_tt h;
5719654e2aeSAndrii Nakryiko 	arr4_t f;
5729654e2aeSAndrii Nakryiko 	arr4_t e;
5739654e2aeSAndrii Nakryiko 	fancy_char_ptr_t d;
5749654e2aeSAndrii Nakryiko 	fancy_char_ptr_t c;
5755705d705SAndrii Nakryiko 	int3_t b __bpf_aligned;
5769654e2aeSAndrii Nakryiko 	int3_t a;
5779654e2aeSAndrii Nakryiko };
578d698f9dbSAndrii Nakryiko 
579d698f9dbSAndrii Nakryiko /*
580d698f9dbSAndrii Nakryiko  * PTR_AS_ARR
581d698f9dbSAndrii Nakryiko  */
582d698f9dbSAndrii Nakryiko struct core_reloc_ptr_as_arr {
583d698f9dbSAndrii Nakryiko 	int a;
584d698f9dbSAndrii Nakryiko };
585d698f9dbSAndrii Nakryiko 
586d698f9dbSAndrii Nakryiko struct core_reloc_ptr_as_arr___diff_sz {
587d698f9dbSAndrii Nakryiko 	int :32; /* padding */
588d698f9dbSAndrii Nakryiko 	char __some_more_padding;
589d698f9dbSAndrii Nakryiko 	int a;
590d698f9dbSAndrii Nakryiko };
591c1f5e7ddSAndrii Nakryiko 
592c1f5e7ddSAndrii Nakryiko /*
593c1f5e7ddSAndrii Nakryiko  * INTS
594c1f5e7ddSAndrii Nakryiko  */
595c1f5e7ddSAndrii Nakryiko struct core_reloc_ints {
596c1f5e7ddSAndrii Nakryiko 	uint8_t		u8_field;
597c1f5e7ddSAndrii Nakryiko 	int8_t		s8_field;
598c1f5e7ddSAndrii Nakryiko 	uint16_t	u16_field;
599c1f5e7ddSAndrii Nakryiko 	int16_t		s16_field;
600c1f5e7ddSAndrii Nakryiko 	uint32_t	u32_field;
601c1f5e7ddSAndrii Nakryiko 	int32_t		s32_field;
602c1f5e7ddSAndrii Nakryiko 	uint64_t	u64_field;
603c1f5e7ddSAndrii Nakryiko 	int64_t		s64_field;
604c1f5e7ddSAndrii Nakryiko };
605c1f5e7ddSAndrii Nakryiko 
606c1f5e7ddSAndrii Nakryiko /* signed/unsigned types swap */
607c1f5e7ddSAndrii Nakryiko struct core_reloc_ints___reverse_sign {
608c1f5e7ddSAndrii Nakryiko 	int8_t		u8_field;
609c1f5e7ddSAndrii Nakryiko 	uint8_t		s8_field;
610c1f5e7ddSAndrii Nakryiko 	int16_t		u16_field;
611c1f5e7ddSAndrii Nakryiko 	uint16_t	s16_field;
612c1f5e7ddSAndrii Nakryiko 	int32_t		u32_field;
613c1f5e7ddSAndrii Nakryiko 	uint32_t	s32_field;
614c1f5e7ddSAndrii Nakryiko 	int64_t		u64_field;
615c1f5e7ddSAndrii Nakryiko 	uint64_t	s64_field;
616c1f5e7ddSAndrii Nakryiko };
617c1f5e7ddSAndrii Nakryiko 
618c1f5e7ddSAndrii Nakryiko struct core_reloc_ints___bool {
619c1f5e7ddSAndrii Nakryiko 	bool		u8_field; /* bool instead of uint8 */
620c1f5e7ddSAndrii Nakryiko 	int8_t		s8_field;
621c1f5e7ddSAndrii Nakryiko 	uint16_t	u16_field;
622c1f5e7ddSAndrii Nakryiko 	int16_t		s16_field;
623c1f5e7ddSAndrii Nakryiko 	uint32_t	u32_field;
624c1f5e7ddSAndrii Nakryiko 	int32_t		s32_field;
625c1f5e7ddSAndrii Nakryiko 	uint64_t	u64_field;
626c1f5e7ddSAndrii Nakryiko 	int64_t		s64_field;
627c1f5e7ddSAndrii Nakryiko };
628c1f5e7ddSAndrii Nakryiko 
62929e1c668SAndrii Nakryiko /*
63029e1c668SAndrii Nakryiko  * MISC
63129e1c668SAndrii Nakryiko  */
63229e1c668SAndrii Nakryiko struct core_reloc_misc_output {
63329e1c668SAndrii Nakryiko 	int a, b, c;
63429e1c668SAndrii Nakryiko };
63529e1c668SAndrii Nakryiko 
63629e1c668SAndrii Nakryiko struct core_reloc_misc___a {
63729e1c668SAndrii Nakryiko 	int a1;
63829e1c668SAndrii Nakryiko 	int a2;
63929e1c668SAndrii Nakryiko };
64029e1c668SAndrii Nakryiko 
64129e1c668SAndrii Nakryiko struct core_reloc_misc___b {
64229e1c668SAndrii Nakryiko 	int b1;
64329e1c668SAndrii Nakryiko 	int b2;
64429e1c668SAndrii Nakryiko };
64529e1c668SAndrii Nakryiko 
64629e1c668SAndrii Nakryiko /* this one extends core_reloc_misc_extensible struct from BPF prog */
64729e1c668SAndrii Nakryiko struct core_reloc_misc_extensible {
64829e1c668SAndrii Nakryiko 	int a;
64929e1c668SAndrii Nakryiko 	int b;
65029e1c668SAndrii Nakryiko 	int c;
65129e1c668SAndrii Nakryiko 	int d;
65229e1c668SAndrii Nakryiko };
653c7566a69SAndrii Nakryiko 
654c7566a69SAndrii Nakryiko /*
655c7566a69SAndrii Nakryiko  * EXISTENCE
656c7566a69SAndrii Nakryiko  */
657c7566a69SAndrii Nakryiko struct core_reloc_existence_output {
658c7566a69SAndrii Nakryiko 	int a_exists;
659c7566a69SAndrii Nakryiko 	int a_value;
660c7566a69SAndrii Nakryiko 	int b_exists;
661c7566a69SAndrii Nakryiko 	int b_value;
662c7566a69SAndrii Nakryiko 	int c_exists;
663c7566a69SAndrii Nakryiko 	int c_value;
664c7566a69SAndrii Nakryiko 	int arr_exists;
665c7566a69SAndrii Nakryiko 	int arr_value;
666c7566a69SAndrii Nakryiko 	int s_exists;
667c7566a69SAndrii Nakryiko 	int s_value;
668c7566a69SAndrii Nakryiko };
669c7566a69SAndrii Nakryiko 
670c7566a69SAndrii Nakryiko struct core_reloc_existence {
671c7566a69SAndrii Nakryiko 	int a;
672c7566a69SAndrii Nakryiko 	struct {
673c7566a69SAndrii Nakryiko 		int b;
674c7566a69SAndrii Nakryiko 	};
675c7566a69SAndrii Nakryiko 	int c;
676c7566a69SAndrii Nakryiko 	int arr[1];
677c7566a69SAndrii Nakryiko 	struct {
678c7566a69SAndrii Nakryiko 		int x;
679c7566a69SAndrii Nakryiko 	} s;
680c7566a69SAndrii Nakryiko };
681c7566a69SAndrii Nakryiko 
682c7566a69SAndrii Nakryiko struct core_reloc_existence___minimal {
683c7566a69SAndrii Nakryiko 	int a;
684c7566a69SAndrii Nakryiko };
685c7566a69SAndrii Nakryiko 
686c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_int_sz {
687c7566a69SAndrii Nakryiko 	short a;
688c7566a69SAndrii Nakryiko };
689c7566a69SAndrii Nakryiko 
690c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_int_type {
691c7566a69SAndrii Nakryiko 	int b[1];
692c7566a69SAndrii Nakryiko };
693c7566a69SAndrii Nakryiko 
694c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_int_kind {
695c7566a69SAndrii Nakryiko 	struct{ int x; } c;
696c7566a69SAndrii Nakryiko };
697c7566a69SAndrii Nakryiko 
698c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_arr_kind {
699c7566a69SAndrii Nakryiko 	int arr;
700c7566a69SAndrii Nakryiko };
701c7566a69SAndrii Nakryiko 
702c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_arr_value_type {
703c7566a69SAndrii Nakryiko 	short arr[1];
704c7566a69SAndrii Nakryiko };
705c7566a69SAndrii Nakryiko 
706c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_struct_type {
707c7566a69SAndrii Nakryiko 	int s;
708c7566a69SAndrii Nakryiko };
7098b1cb1c9SAndrii Nakryiko 
7108b1cb1c9SAndrii Nakryiko /*
7118b1cb1c9SAndrii Nakryiko  * BITFIELDS
7128b1cb1c9SAndrii Nakryiko  */
7138b1cb1c9SAndrii Nakryiko /* bitfield read results, all as plain integers */
7148b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields_output {
7158b1cb1c9SAndrii Nakryiko 	int64_t		ub1;
7168b1cb1c9SAndrii Nakryiko 	int64_t		ub2;
7178b1cb1c9SAndrii Nakryiko 	int64_t		ub7;
7188b1cb1c9SAndrii Nakryiko 	int64_t		sb4;
7198b1cb1c9SAndrii Nakryiko 	int64_t		sb20;
7208b1cb1c9SAndrii Nakryiko 	int64_t		u32;
7218b1cb1c9SAndrii Nakryiko 	int64_t		s32;
7228b1cb1c9SAndrii Nakryiko };
7238b1cb1c9SAndrii Nakryiko 
7248b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields {
7258b1cb1c9SAndrii Nakryiko 	/* unsigned bitfields */
7268b1cb1c9SAndrii Nakryiko 	uint8_t		ub1: 1;
7278b1cb1c9SAndrii Nakryiko 	uint8_t		ub2: 2;
7288b1cb1c9SAndrii Nakryiko 	uint32_t	ub7: 7;
7298b1cb1c9SAndrii Nakryiko 	/* signed bitfields */
7308b1cb1c9SAndrii Nakryiko 	int8_t		sb4: 4;
7318b1cb1c9SAndrii Nakryiko 	int32_t		sb20: 20;
7328b1cb1c9SAndrii Nakryiko 	/* non-bitfields */
7338b1cb1c9SAndrii Nakryiko 	uint32_t	u32;
7348b1cb1c9SAndrii Nakryiko 	int32_t		s32;
7358b1cb1c9SAndrii Nakryiko };
7368b1cb1c9SAndrii Nakryiko 
7378b1cb1c9SAndrii Nakryiko /* different bit sizes (both up and down) */
7388b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___bit_sz_change {
7398b1cb1c9SAndrii Nakryiko 	/* unsigned bitfields */
7408b1cb1c9SAndrii Nakryiko 	uint16_t	ub1: 3;		/*  1 ->  3 */
7418b1cb1c9SAndrii Nakryiko 	uint32_t	ub2: 20;	/*  2 -> 20 */
7428b1cb1c9SAndrii Nakryiko 	uint8_t		ub7: 1;		/*  7 ->  1 */
7438b1cb1c9SAndrii Nakryiko 	/* signed bitfields */
7448b1cb1c9SAndrii Nakryiko 	int8_t		sb4: 1;		/*  4 ->  1 */
7458b1cb1c9SAndrii Nakryiko 	int32_t		sb20: 30;	/* 20 -> 30 */
7468b1cb1c9SAndrii Nakryiko 	/* non-bitfields */
7478b1cb1c9SAndrii Nakryiko 	uint16_t	u32;			/* 32 -> 16 */
7485705d705SAndrii Nakryiko 	int64_t		s32 __bpf_aligned;	/* 32 -> 64 */
7498b1cb1c9SAndrii Nakryiko };
7508b1cb1c9SAndrii Nakryiko 
7518b1cb1c9SAndrii Nakryiko /* turn bitfield into non-bitfield and vice versa */
7528b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___bitfield_vs_int {
7538b1cb1c9SAndrii Nakryiko 	uint64_t	ub1;		/*  3 -> 64 non-bitfield */
7548b1cb1c9SAndrii Nakryiko 	uint8_t		ub2;		/* 20 ->  8 non-bitfield */
7555705d705SAndrii Nakryiko 	int64_t		ub7 __bpf_aligned;	/*  7 -> 64 non-bitfield signed */
7565705d705SAndrii Nakryiko 	int64_t		sb4 __bpf_aligned;	/*  4 -> 64 non-bitfield signed */
7575705d705SAndrii Nakryiko 	uint64_t	sb20 __bpf_aligned;	/* 20 -> 16 non-bitfield unsigned */
7588b1cb1c9SAndrii Nakryiko 	int32_t		u32: 20;		/* 32 non-bitfield -> 20 bitfield */
7595705d705SAndrii Nakryiko 	uint64_t	s32: 60 __bpf_aligned;	/* 32 non-bitfield -> 60 bitfield */
7608b1cb1c9SAndrii Nakryiko };
7618b1cb1c9SAndrii Nakryiko 
7628b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___just_big_enough {
7638b1cb1c9SAndrii Nakryiko 	uint64_t	ub1: 4;
7648b1cb1c9SAndrii Nakryiko 	uint64_t	ub2: 60; /* packed tightly */
7658b1cb1c9SAndrii Nakryiko 	uint32_t	ub7;
7668b1cb1c9SAndrii Nakryiko 	uint32_t	sb4;
7678b1cb1c9SAndrii Nakryiko 	uint32_t	sb20;
7688b1cb1c9SAndrii Nakryiko 	uint32_t	u32;
7698b1cb1c9SAndrii Nakryiko 	uint32_t	s32;
7708b1cb1c9SAndrii Nakryiko } __attribute__((packed)) ;
7718b1cb1c9SAndrii Nakryiko 
7728b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___err_too_big_bitfield {
7738b1cb1c9SAndrii Nakryiko 	uint64_t	ub1: 4;
7748b1cb1c9SAndrii Nakryiko 	uint64_t	ub2: 61; /* packed tightly */
7758b1cb1c9SAndrii Nakryiko 	uint32_t	ub7;
7768b1cb1c9SAndrii Nakryiko 	uint32_t	sb4;
7778b1cb1c9SAndrii Nakryiko 	uint32_t	sb20;
7788b1cb1c9SAndrii Nakryiko 	uint32_t	u32;
7798b1cb1c9SAndrii Nakryiko 	uint32_t	s32;
7808b1cb1c9SAndrii Nakryiko } __attribute__((packed)) ;
7810b163565SAndrii Nakryiko 
7820b163565SAndrii Nakryiko /*
7830b163565SAndrii Nakryiko  * SIZE
7840b163565SAndrii Nakryiko  */
7850b163565SAndrii Nakryiko struct core_reloc_size_output {
7860b163565SAndrii Nakryiko 	int int_sz;
7870b163565SAndrii Nakryiko 	int struct_sz;
7880b163565SAndrii Nakryiko 	int union_sz;
7890b163565SAndrii Nakryiko 	int arr_sz;
7900b163565SAndrii Nakryiko 	int arr_elem_sz;
7910b163565SAndrii Nakryiko 	int ptr_sz;
7920b163565SAndrii Nakryiko 	int enum_sz;
7930b163565SAndrii Nakryiko };
7940b163565SAndrii Nakryiko 
7950b163565SAndrii Nakryiko struct core_reloc_size {
7960b163565SAndrii Nakryiko 	int int_field;
7970b163565SAndrii Nakryiko 	struct { int x; } struct_field;
7980b163565SAndrii Nakryiko 	union { int x; } union_field;
7990b163565SAndrii Nakryiko 	int arr_field[4];
8000b163565SAndrii Nakryiko 	void *ptr_field;
8010b163565SAndrii Nakryiko 	enum { VALUE = 123 } enum_field;
8020b163565SAndrii Nakryiko };
8030b163565SAndrii Nakryiko 
8040b163565SAndrii Nakryiko struct core_reloc_size___diff_sz {
8050b163565SAndrii Nakryiko 	uint64_t int_field;
8060b163565SAndrii Nakryiko 	struct { int x; int y; int z; } struct_field;
8070b163565SAndrii Nakryiko 	union { int x; char bla[123]; } union_field;
8080b163565SAndrii Nakryiko 	char arr_field[10];
8090b163565SAndrii Nakryiko 	void *ptr_field;
8100b163565SAndrii Nakryiko 	enum { OTHER_VALUE = 0xFFFFFFFFFFFFFFFF } enum_field;
8110b163565SAndrii Nakryiko };
812