1c1f5e7ddSAndrii Nakryiko #include <stdint.h>
2c1f5e7ddSAndrii Nakryiko #include <stdbool.h>
35705d705SAndrii Nakryiko 
preserce_ptr_sz_fn(long x)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;
16950b3477SDaniel Müller 	bool local_task_struct_matches;
17ee2eb063SAndrii Nakryiko };
18c1f5e7ddSAndrii Nakryiko 
19002d3afcSAndrii Nakryiko /*
206bcd39d3SAndrii Nakryiko  * MODULE
216bcd39d3SAndrii Nakryiko  */
226bcd39d3SAndrii Nakryiko 
236bcd39d3SAndrii Nakryiko struct core_reloc_module_output {
246bcd39d3SAndrii Nakryiko 	long long len;
256bcd39d3SAndrii Nakryiko 	long long off;
266bcd39d3SAndrii Nakryiko 	int read_ctx_sz;
276bcd39d3SAndrii Nakryiko 	bool read_ctx_exists;
286bcd39d3SAndrii Nakryiko 	bool buf_exists;
296bcd39d3SAndrii Nakryiko 	bool len_exists;
306bcd39d3SAndrii Nakryiko 	bool off_exists;
316bcd39d3SAndrii Nakryiko 	/* we have test_progs[-flavor], so cut flavor part */
326bcd39d3SAndrii Nakryiko 	char comm[sizeof("test_progs")];
336bcd39d3SAndrii Nakryiko 	int comm_len;
346bcd39d3SAndrii Nakryiko };
356bcd39d3SAndrii Nakryiko 
366bcd39d3SAndrii Nakryiko /*
37002d3afcSAndrii Nakryiko  * FLAVORS
38002d3afcSAndrii Nakryiko  */
39002d3afcSAndrii Nakryiko struct core_reloc_flavors {
40002d3afcSAndrii Nakryiko 	int a;
41002d3afcSAndrii Nakryiko 	int b;
42002d3afcSAndrii Nakryiko 	int c;
43002d3afcSAndrii Nakryiko };
44002d3afcSAndrii Nakryiko 
45002d3afcSAndrii Nakryiko /* this is not a flavor, as it doesn't have triple underscore */
46002d3afcSAndrii Nakryiko struct core_reloc_flavors__err_wrong_name {
47002d3afcSAndrii Nakryiko 	int a;
48002d3afcSAndrii Nakryiko 	int b;
49002d3afcSAndrii Nakryiko 	int c;
50002d3afcSAndrii Nakryiko };
51ec6438a9SAndrii Nakryiko 
52ec6438a9SAndrii Nakryiko /*
53ec6438a9SAndrii Nakryiko  * NESTING
54ec6438a9SAndrii Nakryiko  */
55ec6438a9SAndrii Nakryiko /* original set up, used to record relocations in BPF program */
56ec6438a9SAndrii Nakryiko struct core_reloc_nesting_substruct {
57ec6438a9SAndrii Nakryiko 	int a;
58ec6438a9SAndrii Nakryiko };
59ec6438a9SAndrii Nakryiko 
60ec6438a9SAndrii Nakryiko union core_reloc_nesting_subunion {
61ec6438a9SAndrii Nakryiko 	int b;
62ec6438a9SAndrii Nakryiko };
63ec6438a9SAndrii Nakryiko 
64ec6438a9SAndrii Nakryiko struct core_reloc_nesting {
65ec6438a9SAndrii Nakryiko 	union {
66ec6438a9SAndrii Nakryiko 		struct core_reloc_nesting_substruct a;
67ec6438a9SAndrii Nakryiko 	} a;
68ec6438a9SAndrii Nakryiko 	struct {
69ec6438a9SAndrii Nakryiko 		union core_reloc_nesting_subunion b;
70ec6438a9SAndrii Nakryiko 	} b;
71ec6438a9SAndrii Nakryiko };
72ec6438a9SAndrii Nakryiko 
73ec6438a9SAndrii Nakryiko /* inlined anonymous struct/union instead of named structs in original */
74ec6438a9SAndrii Nakryiko struct core_reloc_nesting___anon_embed {
75ec6438a9SAndrii Nakryiko 	int __just_for_padding;
76ec6438a9SAndrii Nakryiko 	union {
77ec6438a9SAndrii Nakryiko 		struct {
78ec6438a9SAndrii Nakryiko 			int a;
79ec6438a9SAndrii Nakryiko 		} a;
80ec6438a9SAndrii Nakryiko 	} a;
81ec6438a9SAndrii Nakryiko 	struct {
82ec6438a9SAndrii Nakryiko 		union {
83ec6438a9SAndrii Nakryiko 			int b;
84ec6438a9SAndrii Nakryiko 		} b;
85ec6438a9SAndrii Nakryiko 	} b;
86ec6438a9SAndrii Nakryiko };
87ec6438a9SAndrii Nakryiko 
88ec6438a9SAndrii Nakryiko /* different mix of nested structs/unions than in original */
89ec6438a9SAndrii Nakryiko struct core_reloc_nesting___struct_union_mixup {
90ec6438a9SAndrii Nakryiko 	int __a;
91ec6438a9SAndrii Nakryiko 	struct {
92ec6438a9SAndrii Nakryiko 		int __a;
93ec6438a9SAndrii Nakryiko 		union {
94ec6438a9SAndrii Nakryiko 			char __a;
95ec6438a9SAndrii Nakryiko 			int a;
96ec6438a9SAndrii Nakryiko 		} a;
97ec6438a9SAndrii Nakryiko 	} a;
98ec6438a9SAndrii Nakryiko 	int __b;
99ec6438a9SAndrii Nakryiko 	union {
100ec6438a9SAndrii Nakryiko 		int __b;
101ec6438a9SAndrii Nakryiko 		union {
102ec6438a9SAndrii Nakryiko 			char __b;
103ec6438a9SAndrii Nakryiko 			int b;
104ec6438a9SAndrii Nakryiko 		} b;
105ec6438a9SAndrii Nakryiko 	} b;
106ec6438a9SAndrii Nakryiko };
107ec6438a9SAndrii Nakryiko 
108ec6438a9SAndrii Nakryiko /* extra anon structs/unions, but still valid a.a.a and b.b.b accessors */
109ec6438a9SAndrii Nakryiko struct core_reloc_nesting___extra_nesting {
110ec6438a9SAndrii Nakryiko 	int __padding;
111ec6438a9SAndrii Nakryiko 	struct {
112ec6438a9SAndrii Nakryiko 		struct {
113ec6438a9SAndrii Nakryiko 			struct {
114ec6438a9SAndrii Nakryiko 				struct {
115ec6438a9SAndrii Nakryiko 					union {
116ec6438a9SAndrii Nakryiko 						int a;
117ec6438a9SAndrii Nakryiko 					} a;
118ec6438a9SAndrii Nakryiko 				};
119ec6438a9SAndrii Nakryiko 			};
120ec6438a9SAndrii Nakryiko 		} a;
121ec6438a9SAndrii Nakryiko 		int __some_more;
122ec6438a9SAndrii Nakryiko 		struct {
123ec6438a9SAndrii Nakryiko 			union {
124ec6438a9SAndrii Nakryiko 				union {
125ec6438a9SAndrii Nakryiko 					union {
126ec6438a9SAndrii Nakryiko 						struct {
127ec6438a9SAndrii Nakryiko 							int b;
128ec6438a9SAndrii Nakryiko 						};
129ec6438a9SAndrii Nakryiko 					} b;
130ec6438a9SAndrii Nakryiko 				};
131ec6438a9SAndrii Nakryiko 			} b;
132ec6438a9SAndrii Nakryiko 		};
133ec6438a9SAndrii Nakryiko 	};
134ec6438a9SAndrii Nakryiko };
135ec6438a9SAndrii Nakryiko 
136ec6438a9SAndrii Nakryiko /* three flavors of same struct with different structure but same layout for
137ec6438a9SAndrii Nakryiko  * a.a.a and b.b.b, thus successfully resolved and relocatable */
138ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types {
139ec6438a9SAndrii Nakryiko 	char __just_for_padding;
140ec6438a9SAndrii Nakryiko 	/* 3 more bytes of padding */
141ec6438a9SAndrii Nakryiko 	struct {
142ec6438a9SAndrii Nakryiko 		struct {
143ec6438a9SAndrii Nakryiko 			int a; /* offset 4 */
144ec6438a9SAndrii Nakryiko 		} a;
145ec6438a9SAndrii Nakryiko 	} a;
146ec6438a9SAndrii Nakryiko 	long long __more_padding;
147ec6438a9SAndrii Nakryiko 	struct {
148ec6438a9SAndrii Nakryiko 		struct {
149ec6438a9SAndrii Nakryiko 			int b; /* offset 16 */
150ec6438a9SAndrii Nakryiko 		} b;
151ec6438a9SAndrii Nakryiko 	} b;
152ec6438a9SAndrii Nakryiko };
153ec6438a9SAndrii Nakryiko 
154ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types__2 {
155ec6438a9SAndrii Nakryiko 	int __aligned_padding;
156ec6438a9SAndrii Nakryiko 	struct {
157ec6438a9SAndrii Nakryiko 		int __trickier_noop[0];
158ec6438a9SAndrii Nakryiko 		struct {
159ec6438a9SAndrii Nakryiko 			char __some_more_noops[0];
160ec6438a9SAndrii Nakryiko 			int a; /* offset 4 */
161ec6438a9SAndrii Nakryiko 		} a;
162ec6438a9SAndrii Nakryiko 	} a;
163ec6438a9SAndrii Nakryiko 	int __more_padding;
164ec6438a9SAndrii Nakryiko 	struct {
165ec6438a9SAndrii Nakryiko 		struct {
166ec6438a9SAndrii Nakryiko 			struct {
167ec6438a9SAndrii Nakryiko 				int __critical_padding;
168ec6438a9SAndrii Nakryiko 				int b; /* offset 16 */
169ec6438a9SAndrii Nakryiko 			} b;
170ec6438a9SAndrii Nakryiko 			int __does_not_matter;
171ec6438a9SAndrii Nakryiko 		};
172ec6438a9SAndrii Nakryiko 	} b;
173ec6438a9SAndrii Nakryiko 	int __more_irrelevant_stuff;
174ec6438a9SAndrii Nakryiko };
175ec6438a9SAndrii Nakryiko 
176ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types__3 {
177ec6438a9SAndrii Nakryiko 	char __correct_padding[4];
178ec6438a9SAndrii Nakryiko 	struct {
179ec6438a9SAndrii Nakryiko 		struct {
180ec6438a9SAndrii Nakryiko 			int a; /* offset 4 */
181ec6438a9SAndrii Nakryiko 		} a;
182ec6438a9SAndrii Nakryiko 	} a;
183ec6438a9SAndrii Nakryiko 	/* 8 byte padding due to next struct's alignment */
184ec6438a9SAndrii Nakryiko 	struct {
185ec6438a9SAndrii Nakryiko 		struct {
186ec6438a9SAndrii Nakryiko 			int b;
187ec6438a9SAndrii Nakryiko 		} b;
188ec6438a9SAndrii Nakryiko 	} b __attribute__((aligned(16)));
189ec6438a9SAndrii Nakryiko };
190ec6438a9SAndrii Nakryiko 
191ec6438a9SAndrii Nakryiko /* b.b.b field is missing */
192ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_missing_field {
193ec6438a9SAndrii Nakryiko 	struct {
194ec6438a9SAndrii Nakryiko 		struct {
195ec6438a9SAndrii Nakryiko 			int a;
196ec6438a9SAndrii Nakryiko 		} a;
197ec6438a9SAndrii Nakryiko 	} a;
198ec6438a9SAndrii Nakryiko 	struct {
199ec6438a9SAndrii Nakryiko 		struct {
200ec6438a9SAndrii Nakryiko 			int x;
201ec6438a9SAndrii Nakryiko 		} b;
202ec6438a9SAndrii Nakryiko 	} b;
203ec6438a9SAndrii Nakryiko };
204ec6438a9SAndrii Nakryiko 
205ec6438a9SAndrii Nakryiko /* b.b.b field is an array of integers instead of plain int */
206ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_array_field {
207ec6438a9SAndrii Nakryiko 	struct {
208ec6438a9SAndrii Nakryiko 		struct {
209ec6438a9SAndrii Nakryiko 			int a;
210ec6438a9SAndrii Nakryiko 		} a;
211ec6438a9SAndrii Nakryiko 	} a;
212ec6438a9SAndrii Nakryiko 	struct {
213ec6438a9SAndrii Nakryiko 		struct {
214ec6438a9SAndrii Nakryiko 			int b[1];
215ec6438a9SAndrii Nakryiko 		} b;
216ec6438a9SAndrii Nakryiko 	} b;
217ec6438a9SAndrii Nakryiko };
218ec6438a9SAndrii Nakryiko 
219ec6438a9SAndrii Nakryiko /* middle b container is missing */
220ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_missing_container {
221ec6438a9SAndrii Nakryiko 	struct {
222ec6438a9SAndrii Nakryiko 		struct {
223ec6438a9SAndrii Nakryiko 			int a;
224ec6438a9SAndrii Nakryiko 		} a;
225ec6438a9SAndrii Nakryiko 	} a;
226ec6438a9SAndrii Nakryiko 	struct {
227ec6438a9SAndrii Nakryiko 		int x;
228ec6438a9SAndrii Nakryiko 	} b;
229ec6438a9SAndrii Nakryiko };
230ec6438a9SAndrii Nakryiko 
231ec6438a9SAndrii Nakryiko /* middle b container is referenced through pointer instead of being embedded */
232ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_nonstruct_container {
233ec6438a9SAndrii Nakryiko 	struct {
234ec6438a9SAndrii Nakryiko 		struct {
235ec6438a9SAndrii Nakryiko 			int a;
236ec6438a9SAndrii Nakryiko 		} a;
237ec6438a9SAndrii Nakryiko 	} a;
238ec6438a9SAndrii Nakryiko 	struct {
239ec6438a9SAndrii Nakryiko 		struct {
240ec6438a9SAndrii Nakryiko 			int b;
241ec6438a9SAndrii Nakryiko 		} *b;
242ec6438a9SAndrii Nakryiko 	} b;
243ec6438a9SAndrii Nakryiko };
244ec6438a9SAndrii Nakryiko 
245ec6438a9SAndrii Nakryiko /* middle b container is an array of structs instead of plain struct */
246ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_array_container {
247ec6438a9SAndrii Nakryiko 	struct {
248ec6438a9SAndrii Nakryiko 		struct {
249ec6438a9SAndrii Nakryiko 			int a;
250ec6438a9SAndrii Nakryiko 		} a;
251ec6438a9SAndrii Nakryiko 	} a;
252ec6438a9SAndrii Nakryiko 	struct {
253ec6438a9SAndrii Nakryiko 		struct {
254ec6438a9SAndrii Nakryiko 			int b;
255ec6438a9SAndrii Nakryiko 		} b[1];
256ec6438a9SAndrii Nakryiko 	} b;
257ec6438a9SAndrii Nakryiko };
258ec6438a9SAndrii Nakryiko 
259ec6438a9SAndrii Nakryiko /* two flavors of same struct with incompatible layout for b.b.b */
260ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_dup_incompat_types__1 {
261ec6438a9SAndrii Nakryiko 	struct {
262ec6438a9SAndrii Nakryiko 		struct {
263ec6438a9SAndrii Nakryiko 			int a; /* offset 0 */
264ec6438a9SAndrii Nakryiko 		} a;
265ec6438a9SAndrii Nakryiko 	} a;
266ec6438a9SAndrii Nakryiko 	struct {
267ec6438a9SAndrii Nakryiko 		struct {
268ec6438a9SAndrii Nakryiko 			int b; /* offset 4 */
269ec6438a9SAndrii Nakryiko 		} b;
270ec6438a9SAndrii Nakryiko 	} b;
271ec6438a9SAndrii Nakryiko };
272ec6438a9SAndrii Nakryiko 
273ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_dup_incompat_types__2 {
274ec6438a9SAndrii Nakryiko 	struct {
275ec6438a9SAndrii Nakryiko 		struct {
276ec6438a9SAndrii Nakryiko 			int a; /* offset 0 */
277ec6438a9SAndrii Nakryiko 		} a;
278ec6438a9SAndrii Nakryiko 	} a;
279ec6438a9SAndrii Nakryiko 	int __extra_padding;
280ec6438a9SAndrii Nakryiko 	struct {
281ec6438a9SAndrii Nakryiko 		struct {
282ec6438a9SAndrii Nakryiko 			int b; /* offset 8 (!) */
283ec6438a9SAndrii Nakryiko 		} b;
284ec6438a9SAndrii Nakryiko 	} b;
285ec6438a9SAndrii Nakryiko };
286ec6438a9SAndrii Nakryiko 
287ec6438a9SAndrii Nakryiko /* two flavors of same struct having one of a.a.a and b.b.b, but not both */
288ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_partial_match_dups__a {
289ec6438a9SAndrii Nakryiko 	struct {
290ec6438a9SAndrii Nakryiko 		struct {
291ec6438a9SAndrii Nakryiko 			int a;
292ec6438a9SAndrii Nakryiko 		} a;
293ec6438a9SAndrii Nakryiko 	} a;
294ec6438a9SAndrii Nakryiko };
295ec6438a9SAndrii Nakryiko 
296ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_partial_match_dups__b {
297ec6438a9SAndrii Nakryiko 	struct {
298ec6438a9SAndrii Nakryiko 		struct {
299ec6438a9SAndrii Nakryiko 			int b;
300ec6438a9SAndrii Nakryiko 		} b;
301ec6438a9SAndrii Nakryiko 	} b;
302ec6438a9SAndrii Nakryiko };
303ec6438a9SAndrii Nakryiko 
304ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_too_deep {
305ec6438a9SAndrii Nakryiko 	struct {
306ec6438a9SAndrii Nakryiko 		struct {
307ec6438a9SAndrii Nakryiko 			int a;
308ec6438a9SAndrii Nakryiko 		} a;
309ec6438a9SAndrii Nakryiko 	} a;
310ec6438a9SAndrii Nakryiko 	/* 65 levels of nestedness for b.b.b */
311ec6438a9SAndrii Nakryiko 	struct {
312ec6438a9SAndrii Nakryiko 		struct {
313ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
314ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
315ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
316ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
317ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
318ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
319ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
320ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
321ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
322ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
323ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
324ec6438a9SAndrii Nakryiko 			struct { struct { struct { struct { struct {
325ec6438a9SAndrii Nakryiko 				/* this one is one too much */
326ec6438a9SAndrii Nakryiko 				struct {
327ec6438a9SAndrii Nakryiko 					int b;
328ec6438a9SAndrii Nakryiko 				};
329ec6438a9SAndrii Nakryiko 			}; }; }; }; };
330ec6438a9SAndrii Nakryiko 			}; }; }; }; };
331ec6438a9SAndrii Nakryiko 			}; }; }; }; };
332ec6438a9SAndrii Nakryiko 			}; }; }; }; };
333ec6438a9SAndrii Nakryiko 			}; }; }; }; };
334ec6438a9SAndrii Nakryiko 			}; }; }; }; };
335ec6438a9SAndrii Nakryiko 			}; }; }; }; };
336ec6438a9SAndrii Nakryiko 			}; }; }; }; };
337ec6438a9SAndrii Nakryiko 			}; }; }; }; };
338ec6438a9SAndrii Nakryiko 			}; }; }; }; };
339ec6438a9SAndrii Nakryiko 			}; }; }; }; };
340ec6438a9SAndrii Nakryiko 			}; }; }; }; };
341ec6438a9SAndrii Nakryiko 		} b;
342ec6438a9SAndrii Nakryiko 	} b;
343ec6438a9SAndrii Nakryiko };
34420a9ad2eSAndrii Nakryiko 
34520a9ad2eSAndrii Nakryiko /*
34620a9ad2eSAndrii Nakryiko  * ARRAYS
34720a9ad2eSAndrii Nakryiko  */
34820a9ad2eSAndrii Nakryiko struct core_reloc_arrays_output {
34920a9ad2eSAndrii Nakryiko 	int a2;
35020a9ad2eSAndrii Nakryiko 	char b123;
35120a9ad2eSAndrii Nakryiko 	int c1c;
35220a9ad2eSAndrii Nakryiko 	int d00d;
3535f2eecefSAndrii Nakryiko 	int f10c;
35420a9ad2eSAndrii Nakryiko };
35520a9ad2eSAndrii Nakryiko 
35620a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct {
35720a9ad2eSAndrii Nakryiko 	int c;
35820a9ad2eSAndrii Nakryiko 	int d;
35920a9ad2eSAndrii Nakryiko };
36020a9ad2eSAndrii Nakryiko 
36120a9ad2eSAndrii Nakryiko struct core_reloc_arrays {
36220a9ad2eSAndrii Nakryiko 	int a[5];
36320a9ad2eSAndrii Nakryiko 	char b[2][3][4];
36420a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
36520a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
3665f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
36720a9ad2eSAndrii Nakryiko };
36820a9ad2eSAndrii Nakryiko 
36920a9ad2eSAndrii Nakryiko /* bigger array dimensions */
37020a9ad2eSAndrii Nakryiko struct core_reloc_arrays___diff_arr_dim {
37120a9ad2eSAndrii Nakryiko 	int a[7];
37220a9ad2eSAndrii Nakryiko 	char b[3][4][5];
37320a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[4];
37420a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[2][3];
3755f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[1][3];
37620a9ad2eSAndrii Nakryiko };
37720a9ad2eSAndrii Nakryiko 
37820a9ad2eSAndrii Nakryiko /* different size of array's value (struct) */
37920a9ad2eSAndrii Nakryiko struct core_reloc_arrays___diff_arr_val_sz {
38020a9ad2eSAndrii Nakryiko 	int a[5];
38120a9ad2eSAndrii Nakryiko 	char b[2][3][4];
38220a9ad2eSAndrii Nakryiko 	struct {
38320a9ad2eSAndrii Nakryiko 		int __padding1;
38420a9ad2eSAndrii Nakryiko 		int c;
38520a9ad2eSAndrii Nakryiko 		int __padding2;
38620a9ad2eSAndrii Nakryiko 	} c[3];
38720a9ad2eSAndrii Nakryiko 	struct {
38820a9ad2eSAndrii Nakryiko 		int __padding1;
38920a9ad2eSAndrii Nakryiko 		int d;
39020a9ad2eSAndrii Nakryiko 		int __padding2;
39120a9ad2eSAndrii Nakryiko 	} d[1][2];
3925f2eecefSAndrii Nakryiko 	struct {
3935f2eecefSAndrii Nakryiko 		int __padding1;
3945f2eecefSAndrii Nakryiko 		int c;
3955f2eecefSAndrii Nakryiko 		int __padding2;
3965f2eecefSAndrii Nakryiko 	} f[][2];
3975f2eecefSAndrii Nakryiko };
3985f2eecefSAndrii Nakryiko 
3995f2eecefSAndrii Nakryiko struct core_reloc_arrays___equiv_zero_sz_arr {
4005f2eecefSAndrii Nakryiko 	int a[5];
4015f2eecefSAndrii Nakryiko 	char b[2][3][4];
4025f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
4035f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4045f2eecefSAndrii Nakryiko 	/* equivalent to flexible array */
405385bbf7bSGustavo A. R. Silva 	struct core_reloc_arrays_substruct f[][2];
4065f2eecefSAndrii Nakryiko };
4075f2eecefSAndrii Nakryiko 
4085f2eecefSAndrii Nakryiko struct core_reloc_arrays___fixed_arr {
4095f2eecefSAndrii Nakryiko 	int a[5];
4105f2eecefSAndrii Nakryiko 	char b[2][3][4];
4115f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
4125f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4135f2eecefSAndrii Nakryiko 	/* not a flexible array anymore, but within access bounds */
4145f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[1][2];
41520a9ad2eSAndrii Nakryiko };
41620a9ad2eSAndrii Nakryiko 
41720a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_too_small {
41820a9ad2eSAndrii Nakryiko 	int a[2]; /* this one is too small */
41920a9ad2eSAndrii Nakryiko 	char b[2][3][4];
42020a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
42120a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4225f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
42320a9ad2eSAndrii Nakryiko };
42420a9ad2eSAndrii Nakryiko 
42520a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_too_shallow {
42620a9ad2eSAndrii Nakryiko 	int a[5];
42720a9ad2eSAndrii Nakryiko 	char b[2][3]; /* this one lacks one dimension */
42820a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
42920a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4305f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
43120a9ad2eSAndrii Nakryiko };
43220a9ad2eSAndrii Nakryiko 
43320a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_non_array {
43420a9ad2eSAndrii Nakryiko 	int a; /* not an array */
43520a9ad2eSAndrii Nakryiko 	char b[2][3][4];
43620a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
43720a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4385f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
43920a9ad2eSAndrii Nakryiko };
44020a9ad2eSAndrii Nakryiko 
44142765edeSAndrii Nakryiko struct core_reloc_arrays___err_wrong_val_type {
44220a9ad2eSAndrii Nakryiko 	int a[5];
44320a9ad2eSAndrii Nakryiko 	char b[2][3][4];
44420a9ad2eSAndrii Nakryiko 	int c[3]; /* value is not a struct */
44520a9ad2eSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
4465f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[][2];
4475f2eecefSAndrii Nakryiko };
4485f2eecefSAndrii Nakryiko 
4495f2eecefSAndrii Nakryiko struct core_reloc_arrays___err_bad_zero_sz_arr {
4505f2eecefSAndrii Nakryiko 	/* zero-sized array, but not at the end */
4515f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct f[0][2];
4525f2eecefSAndrii Nakryiko 	int a[5];
4535f2eecefSAndrii Nakryiko 	char b[2][3][4];
4545f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct c[3];
4555f2eecefSAndrii Nakryiko 	struct core_reloc_arrays_substruct d[1][2];
45620a9ad2eSAndrii Nakryiko };
457d9db3550SAndrii Nakryiko 
458d9db3550SAndrii Nakryiko /*
459d9db3550SAndrii Nakryiko  * PRIMITIVES
460d9db3550SAndrii Nakryiko  */
461d9db3550SAndrii Nakryiko enum core_reloc_primitives_enum {
462d9db3550SAndrii Nakryiko 	A = 0,
463d9db3550SAndrii Nakryiko 	B = 1,
464d9db3550SAndrii Nakryiko };
465d9db3550SAndrii Nakryiko 
466d9db3550SAndrii Nakryiko struct core_reloc_primitives {
467d9db3550SAndrii Nakryiko 	char a;
468d9db3550SAndrii Nakryiko 	int b;
469d9db3550SAndrii Nakryiko 	enum core_reloc_primitives_enum c;
4705705d705SAndrii Nakryiko 	void *d __bpf_aligned;
4715705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
472d9db3550SAndrii Nakryiko };
473d9db3550SAndrii Nakryiko 
474d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_enum_def {
475d9db3550SAndrii Nakryiko 	char a;
476d9db3550SAndrii Nakryiko 	int b;
4775705d705SAndrii Nakryiko 	void *d __bpf_aligned;
4785705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
479d9db3550SAndrii Nakryiko 	enum {
480d9db3550SAndrii Nakryiko 		X = 100,
481d9db3550SAndrii Nakryiko 		Y = 200,
4825705d705SAndrii Nakryiko 	} c __bpf_aligned; /* inline enum def with differing set of values */
483d9db3550SAndrii Nakryiko };
484d9db3550SAndrii Nakryiko 
485d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_func_proto {
4865705d705SAndrii Nakryiko 	void (*f)(int) __bpf_aligned; /* incompatible function prototype */
4875705d705SAndrii Nakryiko 	void *d __bpf_aligned;
4885705d705SAndrii Nakryiko 	enum core_reloc_primitives_enum c __bpf_aligned;
489d9db3550SAndrii Nakryiko 	int b;
490d9db3550SAndrii Nakryiko 	char a;
491d9db3550SAndrii Nakryiko };
492d9db3550SAndrii Nakryiko 
493d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_ptr_type {
4945705d705SAndrii Nakryiko 	const char * const d __bpf_aligned; /* different pointee type + modifiers */
4955705d705SAndrii Nakryiko 	char a __bpf_aligned;
496d9db3550SAndrii Nakryiko 	int b;
497d9db3550SAndrii Nakryiko 	enum core_reloc_primitives_enum c;
4985705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
499d9db3550SAndrii Nakryiko };
500d9db3550SAndrii Nakryiko 
501d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_enum {
502d9db3550SAndrii Nakryiko 	char a[1];
503d9db3550SAndrii Nakryiko 	int b;
504d9db3550SAndrii Nakryiko 	int c; /* int instead of enum */
5055705d705SAndrii Nakryiko 	void *d __bpf_aligned;
5065705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
507d9db3550SAndrii Nakryiko };
508d9db3550SAndrii Nakryiko 
509d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_int {
510d9db3550SAndrii Nakryiko 	char a[1];
5115705d705SAndrii Nakryiko 	int *b __bpf_aligned; /* ptr instead of int */
5125705d705SAndrii Nakryiko 	enum core_reloc_primitives_enum c __bpf_aligned;
5135705d705SAndrii Nakryiko 	void *d __bpf_aligned;
5145705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
515d9db3550SAndrii Nakryiko };
516d9db3550SAndrii Nakryiko 
517d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_ptr {
518d9db3550SAndrii Nakryiko 	char a[1];
519d9db3550SAndrii Nakryiko 	int b;
520d9db3550SAndrii Nakryiko 	enum core_reloc_primitives_enum c;
521d9db3550SAndrii Nakryiko 	int d; /* int instead of ptr */
5225705d705SAndrii Nakryiko 	int (*f)(const char *) __bpf_aligned;
523d9db3550SAndrii Nakryiko };
5249654e2aeSAndrii Nakryiko 
5259654e2aeSAndrii Nakryiko /*
5269654e2aeSAndrii Nakryiko  * MODS
5279654e2aeSAndrii Nakryiko  */
5289654e2aeSAndrii Nakryiko struct core_reloc_mods_output {
5299654e2aeSAndrii Nakryiko 	int a, b, c, d, e, f, g, h;
5309654e2aeSAndrii Nakryiko };
5319654e2aeSAndrii Nakryiko 
5329654e2aeSAndrii Nakryiko typedef const int int_t;
5335705d705SAndrii Nakryiko typedef const char *char_ptr_t __bpf_aligned;
5349654e2aeSAndrii Nakryiko typedef const int arr_t[7];
5359654e2aeSAndrii Nakryiko 
5369654e2aeSAndrii Nakryiko struct core_reloc_mods_substruct {
5379654e2aeSAndrii Nakryiko 	int x;
5389654e2aeSAndrii Nakryiko 	int y;
5399654e2aeSAndrii Nakryiko };
5409654e2aeSAndrii Nakryiko 
5419654e2aeSAndrii Nakryiko typedef struct {
5429654e2aeSAndrii Nakryiko 	int x;
5439654e2aeSAndrii Nakryiko 	int y;
5449654e2aeSAndrii Nakryiko } core_reloc_mods_substruct_t;
5459654e2aeSAndrii Nakryiko 
5469654e2aeSAndrii Nakryiko struct core_reloc_mods {
5479654e2aeSAndrii Nakryiko 	int a;
5489654e2aeSAndrii Nakryiko 	int_t b;
5495705d705SAndrii Nakryiko 	char *c __bpf_aligned;
5509654e2aeSAndrii Nakryiko 	char_ptr_t d;
5515705d705SAndrii Nakryiko 	int e[3] __bpf_aligned;
5529654e2aeSAndrii Nakryiko 	arr_t f;
5539654e2aeSAndrii Nakryiko 	struct core_reloc_mods_substruct g;
5549654e2aeSAndrii Nakryiko 	core_reloc_mods_substruct_t h;
5559654e2aeSAndrii Nakryiko };
5569654e2aeSAndrii Nakryiko 
5579654e2aeSAndrii Nakryiko /* a/b, c/d, e/f, and g/h pairs are swapped */
5589654e2aeSAndrii Nakryiko struct core_reloc_mods___mod_swap {
5599654e2aeSAndrii Nakryiko 	int b;
5609654e2aeSAndrii Nakryiko 	int_t a;
5615705d705SAndrii Nakryiko 	char *d __bpf_aligned;
5629654e2aeSAndrii Nakryiko 	char_ptr_t c;
5635705d705SAndrii Nakryiko 	int f[3] __bpf_aligned;
5649654e2aeSAndrii Nakryiko 	arr_t e;
5659654e2aeSAndrii Nakryiko 	struct {
5669654e2aeSAndrii Nakryiko 		int y;
5679654e2aeSAndrii Nakryiko 		int x;
5689654e2aeSAndrii Nakryiko 	} h;
5699654e2aeSAndrii Nakryiko 	core_reloc_mods_substruct_t g;
5709654e2aeSAndrii Nakryiko };
5719654e2aeSAndrii Nakryiko 
5729654e2aeSAndrii Nakryiko typedef int int1_t;
5739654e2aeSAndrii Nakryiko typedef int1_t int2_t;
5749654e2aeSAndrii Nakryiko typedef int2_t int3_t;
5759654e2aeSAndrii Nakryiko 
5769654e2aeSAndrii Nakryiko typedef int arr1_t[5];
5779654e2aeSAndrii Nakryiko typedef arr1_t arr2_t;
5789654e2aeSAndrii Nakryiko typedef arr2_t arr3_t;
5799654e2aeSAndrii Nakryiko typedef arr3_t arr4_t;
5809654e2aeSAndrii Nakryiko 
5815705d705SAndrii Nakryiko typedef const char * const volatile fancy_char_ptr_t __bpf_aligned;
5829654e2aeSAndrii Nakryiko 
5839654e2aeSAndrii Nakryiko typedef core_reloc_mods_substruct_t core_reloc_mods_substruct_tt;
5849654e2aeSAndrii Nakryiko 
5859654e2aeSAndrii Nakryiko /* we need more typedefs */
5869654e2aeSAndrii Nakryiko struct core_reloc_mods___typedefs {
5879654e2aeSAndrii Nakryiko 	core_reloc_mods_substruct_tt g;
5889654e2aeSAndrii Nakryiko 	core_reloc_mods_substruct_tt h;
5899654e2aeSAndrii Nakryiko 	arr4_t f;
5909654e2aeSAndrii Nakryiko 	arr4_t e;
5919654e2aeSAndrii Nakryiko 	fancy_char_ptr_t d;
5929654e2aeSAndrii Nakryiko 	fancy_char_ptr_t c;
5935705d705SAndrii Nakryiko 	int3_t b __bpf_aligned;
5949654e2aeSAndrii Nakryiko 	int3_t a;
5959654e2aeSAndrii Nakryiko };
596d698f9dbSAndrii Nakryiko 
597d698f9dbSAndrii Nakryiko /*
598d698f9dbSAndrii Nakryiko  * PTR_AS_ARR
599d698f9dbSAndrii Nakryiko  */
600d698f9dbSAndrii Nakryiko struct core_reloc_ptr_as_arr {
601d698f9dbSAndrii Nakryiko 	int a;
602d698f9dbSAndrii Nakryiko };
603d698f9dbSAndrii Nakryiko 
604d698f9dbSAndrii Nakryiko struct core_reloc_ptr_as_arr___diff_sz {
605d698f9dbSAndrii Nakryiko 	int :32; /* padding */
606d698f9dbSAndrii Nakryiko 	char __some_more_padding;
607d698f9dbSAndrii Nakryiko 	int a;
608d698f9dbSAndrii Nakryiko };
609c1f5e7ddSAndrii Nakryiko 
610c1f5e7ddSAndrii Nakryiko /*
611c1f5e7ddSAndrii Nakryiko  * INTS
612c1f5e7ddSAndrii Nakryiko  */
613c1f5e7ddSAndrii Nakryiko struct core_reloc_ints {
614c1f5e7ddSAndrii Nakryiko 	uint8_t		u8_field;
615c1f5e7ddSAndrii Nakryiko 	int8_t		s8_field;
616c1f5e7ddSAndrii Nakryiko 	uint16_t	u16_field;
617c1f5e7ddSAndrii Nakryiko 	int16_t		s16_field;
618c1f5e7ddSAndrii Nakryiko 	uint32_t	u32_field;
619c1f5e7ddSAndrii Nakryiko 	int32_t		s32_field;
620c1f5e7ddSAndrii Nakryiko 	uint64_t	u64_field;
621c1f5e7ddSAndrii Nakryiko 	int64_t		s64_field;
622c1f5e7ddSAndrii Nakryiko };
623c1f5e7ddSAndrii Nakryiko 
624c1f5e7ddSAndrii Nakryiko /* signed/unsigned types swap */
625c1f5e7ddSAndrii Nakryiko struct core_reloc_ints___reverse_sign {
626c1f5e7ddSAndrii Nakryiko 	int8_t		u8_field;
627c1f5e7ddSAndrii Nakryiko 	uint8_t		s8_field;
628c1f5e7ddSAndrii Nakryiko 	int16_t		u16_field;
629c1f5e7ddSAndrii Nakryiko 	uint16_t	s16_field;
630c1f5e7ddSAndrii Nakryiko 	int32_t		u32_field;
631c1f5e7ddSAndrii Nakryiko 	uint32_t	s32_field;
632c1f5e7ddSAndrii Nakryiko 	int64_t		u64_field;
633c1f5e7ddSAndrii Nakryiko 	uint64_t	s64_field;
634c1f5e7ddSAndrii Nakryiko };
635c1f5e7ddSAndrii Nakryiko 
636c1f5e7ddSAndrii Nakryiko struct core_reloc_ints___bool {
637c1f5e7ddSAndrii Nakryiko 	bool		u8_field; /* bool instead of uint8 */
638c1f5e7ddSAndrii Nakryiko 	int8_t		s8_field;
639c1f5e7ddSAndrii Nakryiko 	uint16_t	u16_field;
640c1f5e7ddSAndrii Nakryiko 	int16_t		s16_field;
641c1f5e7ddSAndrii Nakryiko 	uint32_t	u32_field;
642c1f5e7ddSAndrii Nakryiko 	int32_t		s32_field;
643c1f5e7ddSAndrii Nakryiko 	uint64_t	u64_field;
644c1f5e7ddSAndrii Nakryiko 	int64_t		s64_field;
645c1f5e7ddSAndrii Nakryiko };
646c1f5e7ddSAndrii Nakryiko 
64729e1c668SAndrii Nakryiko /*
64829e1c668SAndrii Nakryiko  * MISC
64929e1c668SAndrii Nakryiko  */
65029e1c668SAndrii Nakryiko struct core_reloc_misc_output {
65129e1c668SAndrii Nakryiko 	int a, b, c;
65229e1c668SAndrii Nakryiko };
65329e1c668SAndrii Nakryiko 
65429e1c668SAndrii Nakryiko struct core_reloc_misc___a {
65529e1c668SAndrii Nakryiko 	int a1;
65629e1c668SAndrii Nakryiko 	int a2;
65729e1c668SAndrii Nakryiko };
65829e1c668SAndrii Nakryiko 
65929e1c668SAndrii Nakryiko struct core_reloc_misc___b {
66029e1c668SAndrii Nakryiko 	int b1;
66129e1c668SAndrii Nakryiko 	int b2;
66229e1c668SAndrii Nakryiko };
66329e1c668SAndrii Nakryiko 
66429e1c668SAndrii Nakryiko /* this one extends core_reloc_misc_extensible struct from BPF prog */
66529e1c668SAndrii Nakryiko struct core_reloc_misc_extensible {
66629e1c668SAndrii Nakryiko 	int a;
66729e1c668SAndrii Nakryiko 	int b;
66829e1c668SAndrii Nakryiko 	int c;
66929e1c668SAndrii Nakryiko 	int d;
67029e1c668SAndrii Nakryiko };
671c7566a69SAndrii Nakryiko 
672c7566a69SAndrii Nakryiko /*
673124a892dSAndrii Nakryiko  * FIELD EXISTENCE
674c7566a69SAndrii Nakryiko  */
675c7566a69SAndrii Nakryiko struct core_reloc_existence_output {
676c7566a69SAndrii Nakryiko 	int a_exists;
677c7566a69SAndrii Nakryiko 	int a_value;
678c7566a69SAndrii Nakryiko 	int b_exists;
679c7566a69SAndrii Nakryiko 	int b_value;
680c7566a69SAndrii Nakryiko 	int c_exists;
681c7566a69SAndrii Nakryiko 	int c_value;
682c7566a69SAndrii Nakryiko 	int arr_exists;
683c7566a69SAndrii Nakryiko 	int arr_value;
684c7566a69SAndrii Nakryiko 	int s_exists;
685c7566a69SAndrii Nakryiko 	int s_value;
686c7566a69SAndrii Nakryiko };
687c7566a69SAndrii Nakryiko 
688c7566a69SAndrii Nakryiko struct core_reloc_existence {
689c7566a69SAndrii Nakryiko 	int a;
690c7566a69SAndrii Nakryiko 	struct {
691c7566a69SAndrii Nakryiko 		int b;
692c7566a69SAndrii Nakryiko 	};
693c7566a69SAndrii Nakryiko 	int c;
694c7566a69SAndrii Nakryiko 	int arr[1];
695c7566a69SAndrii Nakryiko 	struct {
696c7566a69SAndrii Nakryiko 		int x;
697c7566a69SAndrii Nakryiko 	} s;
698c7566a69SAndrii Nakryiko };
699c7566a69SAndrii Nakryiko 
700c7566a69SAndrii Nakryiko struct core_reloc_existence___minimal {
701c7566a69SAndrii Nakryiko 	int a;
702c7566a69SAndrii Nakryiko };
703c7566a69SAndrii Nakryiko 
7045a30eb23SAndrii Nakryiko struct core_reloc_existence___wrong_field_defs {
7055a30eb23SAndrii Nakryiko 	void *a;
706c7566a69SAndrii Nakryiko 	int b[1];
707c7566a69SAndrii Nakryiko 	struct{ int x; } c;
708c7566a69SAndrii Nakryiko 	int arr;
709c7566a69SAndrii Nakryiko 	int s;
710c7566a69SAndrii Nakryiko };
7118b1cb1c9SAndrii Nakryiko 
7128b1cb1c9SAndrii Nakryiko /*
7138b1cb1c9SAndrii Nakryiko  * BITFIELDS
7148b1cb1c9SAndrii Nakryiko  */
7158b1cb1c9SAndrii Nakryiko /* bitfield read results, all as plain integers */
7168b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields_output {
7178b1cb1c9SAndrii Nakryiko 	int64_t		ub1;
7188b1cb1c9SAndrii Nakryiko 	int64_t		ub2;
7198b1cb1c9SAndrii Nakryiko 	int64_t		ub7;
7208b1cb1c9SAndrii Nakryiko 	int64_t		sb4;
7218b1cb1c9SAndrii Nakryiko 	int64_t		sb20;
7228b1cb1c9SAndrii Nakryiko 	int64_t		u32;
7238b1cb1c9SAndrii Nakryiko 	int64_t		s32;
7248b1cb1c9SAndrii Nakryiko };
7258b1cb1c9SAndrii Nakryiko 
7268b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields {
7278b1cb1c9SAndrii Nakryiko 	/* unsigned bitfields */
7288b1cb1c9SAndrii Nakryiko 	uint8_t		ub1: 1;
7298b1cb1c9SAndrii Nakryiko 	uint8_t		ub2: 2;
7308b1cb1c9SAndrii Nakryiko 	uint32_t	ub7: 7;
7318b1cb1c9SAndrii Nakryiko 	/* signed bitfields */
7328b1cb1c9SAndrii Nakryiko 	int8_t		sb4: 4;
7338b1cb1c9SAndrii Nakryiko 	int32_t		sb20: 20;
7348b1cb1c9SAndrii Nakryiko 	/* non-bitfields */
7358b1cb1c9SAndrii Nakryiko 	uint32_t	u32;
7368b1cb1c9SAndrii Nakryiko 	int32_t		s32;
7378b1cb1c9SAndrii Nakryiko };
7388b1cb1c9SAndrii Nakryiko 
7398b1cb1c9SAndrii Nakryiko /* different bit sizes (both up and down) */
7408b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___bit_sz_change {
7418b1cb1c9SAndrii Nakryiko 	/* unsigned bitfields */
7428b1cb1c9SAndrii Nakryiko 	uint16_t	ub1: 3;		/*  1 ->  3 */
7438b1cb1c9SAndrii Nakryiko 	uint32_t	ub2: 20;	/*  2 -> 20 */
7448b1cb1c9SAndrii Nakryiko 	uint8_t		ub7: 1;		/*  7 ->  1 */
7458b1cb1c9SAndrii Nakryiko 	/* signed bitfields */
7468b1cb1c9SAndrii Nakryiko 	int8_t		sb4: 1;		/*  4 ->  1 */
7478b1cb1c9SAndrii Nakryiko 	int32_t		sb20: 30;	/* 20 -> 30 */
7488b1cb1c9SAndrii Nakryiko 	/* non-bitfields */
7498b1cb1c9SAndrii Nakryiko 	uint16_t	u32;			/* 32 -> 16 */
7505705d705SAndrii Nakryiko 	int64_t		s32 __bpf_aligned;	/* 32 -> 64 */
7518b1cb1c9SAndrii Nakryiko };
7528b1cb1c9SAndrii Nakryiko 
7538b1cb1c9SAndrii Nakryiko /* turn bitfield into non-bitfield and vice versa */
7548b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___bitfield_vs_int {
7558b1cb1c9SAndrii Nakryiko 	uint64_t	ub1;		/*  3 -> 64 non-bitfield */
7568b1cb1c9SAndrii Nakryiko 	uint8_t		ub2;		/* 20 ->  8 non-bitfield */
7575705d705SAndrii Nakryiko 	int64_t		ub7 __bpf_aligned;	/*  7 -> 64 non-bitfield signed */
7585705d705SAndrii Nakryiko 	int64_t		sb4 __bpf_aligned;	/*  4 -> 64 non-bitfield signed */
7595705d705SAndrii Nakryiko 	uint64_t	sb20 __bpf_aligned;	/* 20 -> 16 non-bitfield unsigned */
7608b1cb1c9SAndrii Nakryiko 	int32_t		u32: 20;		/* 32 non-bitfield -> 20 bitfield */
7615705d705SAndrii Nakryiko 	uint64_t	s32: 60 __bpf_aligned;	/* 32 non-bitfield -> 60 bitfield */
7628b1cb1c9SAndrii Nakryiko };
7638b1cb1c9SAndrii Nakryiko 
7648b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___just_big_enough {
7658b1cb1c9SAndrii Nakryiko 	uint64_t	ub1: 4;
7668b1cb1c9SAndrii Nakryiko 	uint64_t	ub2: 60; /* packed tightly */
7678b1cb1c9SAndrii Nakryiko 	uint32_t	ub7;
7688b1cb1c9SAndrii Nakryiko 	uint32_t	sb4;
7698b1cb1c9SAndrii Nakryiko 	uint32_t	sb20;
7708b1cb1c9SAndrii Nakryiko 	uint32_t	u32;
7718b1cb1c9SAndrii Nakryiko 	uint32_t	s32;
7728b1cb1c9SAndrii Nakryiko } __attribute__((packed)) ;
7738b1cb1c9SAndrii Nakryiko 
7748b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___err_too_big_bitfield {
7758b1cb1c9SAndrii Nakryiko 	uint64_t	ub1: 4;
7768b1cb1c9SAndrii Nakryiko 	uint64_t	ub2: 61; /* packed tightly */
7778b1cb1c9SAndrii Nakryiko 	uint32_t	ub7;
7788b1cb1c9SAndrii Nakryiko 	uint32_t	sb4;
7798b1cb1c9SAndrii Nakryiko 	uint32_t	sb20;
7808b1cb1c9SAndrii Nakryiko 	uint32_t	u32;
7818b1cb1c9SAndrii Nakryiko 	uint32_t	s32;
7828b1cb1c9SAndrii Nakryiko } __attribute__((packed)) ;
7830b163565SAndrii Nakryiko 
7840b163565SAndrii Nakryiko /*
7850b163565SAndrii Nakryiko  * SIZE
7860b163565SAndrii Nakryiko  */
7870b163565SAndrii Nakryiko struct core_reloc_size_output {
7880b163565SAndrii Nakryiko 	int int_sz;
789785c3342SAndrii Nakryiko 	int int_off;
7900b163565SAndrii Nakryiko 	int struct_sz;
791785c3342SAndrii Nakryiko 	int struct_off;
7920b163565SAndrii Nakryiko 	int union_sz;
793785c3342SAndrii Nakryiko 	int union_off;
7940b163565SAndrii Nakryiko 	int arr_sz;
795785c3342SAndrii Nakryiko 	int arr_off;
7960b163565SAndrii Nakryiko 	int arr_elem_sz;
797785c3342SAndrii Nakryiko 	int arr_elem_off;
7980b163565SAndrii Nakryiko 	int ptr_sz;
799785c3342SAndrii Nakryiko 	int ptr_off;
8000b163565SAndrii Nakryiko 	int enum_sz;
801785c3342SAndrii Nakryiko 	int enum_off;
8023fcd50d6SIlya Leoshkevich 	int float_sz;
803785c3342SAndrii Nakryiko 	int float_off;
8040b163565SAndrii Nakryiko };
8050b163565SAndrii Nakryiko 
8060b163565SAndrii Nakryiko struct core_reloc_size {
8070b163565SAndrii Nakryiko 	int int_field;
8080b163565SAndrii Nakryiko 	struct { int x; } struct_field;
8090b163565SAndrii Nakryiko 	union { int x; } union_field;
8100b163565SAndrii Nakryiko 	int arr_field[4];
8110b163565SAndrii Nakryiko 	void *ptr_field;
8120b163565SAndrii Nakryiko 	enum { VALUE = 123 } enum_field;
8133fcd50d6SIlya Leoshkevich 	float float_field;
8140b163565SAndrii Nakryiko };
8150b163565SAndrii Nakryiko 
8160b163565SAndrii Nakryiko struct core_reloc_size___diff_sz {
8170b163565SAndrii Nakryiko 	uint64_t int_field;
8180b163565SAndrii Nakryiko 	struct { int x; int y; int z; } struct_field;
8190b163565SAndrii Nakryiko 	union { int x; char bla[123]; } union_field;
8200b163565SAndrii Nakryiko 	char arr_field[10];
8210b163565SAndrii Nakryiko 	void *ptr_field;
8220b163565SAndrii Nakryiko 	enum { OTHER_VALUE = 0xFFFFFFFFFFFFFFFF } enum_field;
8233fcd50d6SIlya Leoshkevich 	double float_field;
8240b163565SAndrii Nakryiko };
82500b2e953SAndrii Nakryiko 
826785c3342SAndrii Nakryiko struct core_reloc_size___diff_offs {
827785c3342SAndrii Nakryiko 	float float_field;
828785c3342SAndrii Nakryiko 	enum { YET_OTHER_VALUE = 123 } enum_field;
829785c3342SAndrii Nakryiko 	void *ptr_field;
830785c3342SAndrii Nakryiko 	int arr_field[4];
831785c3342SAndrii Nakryiko 	union { int x; } union_field;
832785c3342SAndrii Nakryiko 	struct { int x; } struct_field;
833785c3342SAndrii Nakryiko 	int int_field;
834785c3342SAndrii Nakryiko };
835785c3342SAndrii Nakryiko 
83600b2e953SAndrii Nakryiko /* Error case of two candidates with the fields (int_field) at the same
83700b2e953SAndrii Nakryiko  * offset, but with differing final relocation values: size 4 vs size 1
83800b2e953SAndrii Nakryiko  */
83900b2e953SAndrii Nakryiko struct core_reloc_size___err_ambiguous1 {
84000b2e953SAndrii Nakryiko 	/* int at offset 0 */
84100b2e953SAndrii Nakryiko 	int int_field;
84200b2e953SAndrii Nakryiko 
84300b2e953SAndrii Nakryiko 	struct { int x; } struct_field;
84400b2e953SAndrii Nakryiko 	union { int x; } union_field;
84500b2e953SAndrii Nakryiko 	int arr_field[4];
84600b2e953SAndrii Nakryiko 	void *ptr_field;
84700b2e953SAndrii Nakryiko 	enum { VALUE___1 = 123 } enum_field;
8483fcd50d6SIlya Leoshkevich 	float float_field;
84900b2e953SAndrii Nakryiko };
85000b2e953SAndrii Nakryiko 
85100b2e953SAndrii Nakryiko struct core_reloc_size___err_ambiguous2 {
85200b2e953SAndrii Nakryiko 	/* char at offset 0 */
85300b2e953SAndrii Nakryiko 	char int_field;
85400b2e953SAndrii Nakryiko 
85500b2e953SAndrii Nakryiko 	struct { int x; } struct_field;
85600b2e953SAndrii Nakryiko 	union { int x; } union_field;
85700b2e953SAndrii Nakryiko 	int arr_field[4];
85800b2e953SAndrii Nakryiko 	void *ptr_field;
85900b2e953SAndrii Nakryiko 	enum { VALUE___2 = 123 } enum_field;
8603fcd50d6SIlya Leoshkevich 	float float_field;
86100b2e953SAndrii Nakryiko };
862124a892dSAndrii Nakryiko 
863124a892dSAndrii Nakryiko /*
86467d8ed42SDaniel Müller  * TYPE EXISTENCE, MATCH & SIZE
865124a892dSAndrii Nakryiko  */
866124a892dSAndrii Nakryiko struct core_reloc_type_based_output {
867124a892dSAndrii Nakryiko 	bool struct_exists;
868537905c4SDaniel Müller 	bool complex_struct_exists;
869124a892dSAndrii Nakryiko 	bool union_exists;
870124a892dSAndrii Nakryiko 	bool enum_exists;
871124a892dSAndrii Nakryiko 	bool typedef_named_struct_exists;
872124a892dSAndrii Nakryiko 	bool typedef_anon_struct_exists;
873124a892dSAndrii Nakryiko 	bool typedef_struct_ptr_exists;
874124a892dSAndrii Nakryiko 	bool typedef_int_exists;
875124a892dSAndrii Nakryiko 	bool typedef_enum_exists;
876124a892dSAndrii Nakryiko 	bool typedef_void_ptr_exists;
877*32e0d9b3SDaniel Müller 	bool typedef_restrict_ptr_exists;
878124a892dSAndrii Nakryiko 	bool typedef_func_proto_exists;
879124a892dSAndrii Nakryiko 	bool typedef_arr_exists;
880124a892dSAndrii Nakryiko 
88167d8ed42SDaniel Müller 	bool struct_matches;
882537905c4SDaniel Müller 	bool complex_struct_matches;
88367d8ed42SDaniel Müller 	bool union_matches;
88467d8ed42SDaniel Müller 	bool enum_matches;
88567d8ed42SDaniel Müller 	bool typedef_named_struct_matches;
88667d8ed42SDaniel Müller 	bool typedef_anon_struct_matches;
88767d8ed42SDaniel Müller 	bool typedef_struct_ptr_matches;
88867d8ed42SDaniel Müller 	bool typedef_int_matches;
88967d8ed42SDaniel Müller 	bool typedef_enum_matches;
89067d8ed42SDaniel Müller 	bool typedef_void_ptr_matches;
891*32e0d9b3SDaniel Müller 	bool typedef_restrict_ptr_matches;
89267d8ed42SDaniel Müller 	bool typedef_func_proto_matches;
89367d8ed42SDaniel Müller 	bool typedef_arr_matches;
89467d8ed42SDaniel Müller 
895124a892dSAndrii Nakryiko 	int struct_sz;
896124a892dSAndrii Nakryiko 	int union_sz;
897124a892dSAndrii Nakryiko 	int enum_sz;
898124a892dSAndrii Nakryiko 	int typedef_named_struct_sz;
899124a892dSAndrii Nakryiko 	int typedef_anon_struct_sz;
900124a892dSAndrii Nakryiko 	int typedef_struct_ptr_sz;
901124a892dSAndrii Nakryiko 	int typedef_int_sz;
902124a892dSAndrii Nakryiko 	int typedef_enum_sz;
903124a892dSAndrii Nakryiko 	int typedef_void_ptr_sz;
904124a892dSAndrii Nakryiko 	int typedef_func_proto_sz;
905124a892dSAndrii Nakryiko 	int typedef_arr_sz;
906124a892dSAndrii Nakryiko };
907124a892dSAndrii Nakryiko 
908124a892dSAndrii Nakryiko struct a_struct {
909124a892dSAndrii Nakryiko 	int x;
910124a892dSAndrii Nakryiko };
911124a892dSAndrii Nakryiko 
912537905c4SDaniel Müller struct a_complex_struct {
913537905c4SDaniel Müller 	union {
914537905c4SDaniel Müller 		struct a_struct * restrict a;
915537905c4SDaniel Müller 		void *b;
916537905c4SDaniel Müller 	} x;
917537905c4SDaniel Müller 	volatile long y;
918537905c4SDaniel Müller };
919537905c4SDaniel Müller 
920124a892dSAndrii Nakryiko union a_union {
921124a892dSAndrii Nakryiko 	int y;
922124a892dSAndrii Nakryiko 	int z;
923124a892dSAndrii Nakryiko };
924124a892dSAndrii Nakryiko 
925124a892dSAndrii Nakryiko typedef struct a_struct named_struct_typedef;
926124a892dSAndrii Nakryiko 
927124a892dSAndrii Nakryiko typedef struct { int x, y, z; } anon_struct_typedef;
928124a892dSAndrii Nakryiko 
929124a892dSAndrii Nakryiko typedef struct {
930124a892dSAndrii Nakryiko 	int a, b, c;
931124a892dSAndrii Nakryiko } *struct_ptr_typedef;
932124a892dSAndrii Nakryiko 
933124a892dSAndrii Nakryiko enum an_enum {
934124a892dSAndrii Nakryiko 	AN_ENUM_VAL1 = 1,
935124a892dSAndrii Nakryiko 	AN_ENUM_VAL2 = 2,
936124a892dSAndrii Nakryiko 	AN_ENUM_VAL3 = 3,
937124a892dSAndrii Nakryiko };
938124a892dSAndrii Nakryiko 
939124a892dSAndrii Nakryiko typedef int int_typedef;
940124a892dSAndrii Nakryiko 
941124a892dSAndrii Nakryiko typedef enum { TYPEDEF_ENUM_VAL1, TYPEDEF_ENUM_VAL2 } enum_typedef;
942124a892dSAndrii Nakryiko 
943124a892dSAndrii Nakryiko typedef void *void_ptr_typedef;
944*32e0d9b3SDaniel Müller typedef int *restrict restrict_ptr_typedef;
945124a892dSAndrii Nakryiko 
946124a892dSAndrii Nakryiko typedef int (*func_proto_typedef)(long);
947124a892dSAndrii Nakryiko 
948124a892dSAndrii Nakryiko typedef char arr_typedef[20];
949124a892dSAndrii Nakryiko 
950124a892dSAndrii Nakryiko struct core_reloc_type_based {
951124a892dSAndrii Nakryiko 	struct a_struct f1;
952537905c4SDaniel Müller 	struct a_complex_struct f2;
953537905c4SDaniel Müller 	union a_union f3;
954537905c4SDaniel Müller 	enum an_enum f4;
955537905c4SDaniel Müller 	named_struct_typedef f5;
956537905c4SDaniel Müller 	anon_struct_typedef f6;
957537905c4SDaniel Müller 	struct_ptr_typedef f7;
958537905c4SDaniel Müller 	int_typedef f8;
959537905c4SDaniel Müller 	enum_typedef f9;
960537905c4SDaniel Müller 	void_ptr_typedef f10;
961*32e0d9b3SDaniel Müller 	restrict_ptr_typedef f11;
962*32e0d9b3SDaniel Müller 	func_proto_typedef f12;
963*32e0d9b3SDaniel Müller 	arr_typedef f13;
964124a892dSAndrii Nakryiko };
965124a892dSAndrii Nakryiko 
966124a892dSAndrii Nakryiko /* no types in target */
967124a892dSAndrii Nakryiko struct core_reloc_type_based___all_missing {
968124a892dSAndrii Nakryiko };
969124a892dSAndrii Nakryiko 
970bed56a6dSDaniel Müller /* different member orders, enum variant values, signedness, etc */
971bed56a6dSDaniel Müller struct a_struct___diff {
972bed56a6dSDaniel Müller 	int x;
973bed56a6dSDaniel Müller 	int a;
974bed56a6dSDaniel Müller };
975bed56a6dSDaniel Müller 
976537905c4SDaniel Müller struct a_struct___forward;
977537905c4SDaniel Müller 
978537905c4SDaniel Müller struct a_complex_struct___diff {
979537905c4SDaniel Müller 	union {
980537905c4SDaniel Müller 		struct a_struct___forward *a;
981537905c4SDaniel Müller 		void *b;
982537905c4SDaniel Müller 	} x;
983537905c4SDaniel Müller 	volatile long y;
984537905c4SDaniel Müller };
985537905c4SDaniel Müller 
986bed56a6dSDaniel Müller union a_union___diff {
987bed56a6dSDaniel Müller 	int z;
988bed56a6dSDaniel Müller 	int y;
989bed56a6dSDaniel Müller };
990bed56a6dSDaniel Müller 
991bed56a6dSDaniel Müller typedef struct a_struct___diff named_struct_typedef___diff;
992bed56a6dSDaniel Müller 
993bed56a6dSDaniel Müller typedef struct { int z, x, y; } anon_struct_typedef___diff;
994bed56a6dSDaniel Müller 
995bed56a6dSDaniel Müller typedef struct {
996bed56a6dSDaniel Müller 	int c;
997bed56a6dSDaniel Müller 	int b;
998bed56a6dSDaniel Müller 	int a;
999bed56a6dSDaniel Müller } *struct_ptr_typedef___diff;
1000bed56a6dSDaniel Müller 
1001bed56a6dSDaniel Müller enum an_enum___diff {
1002bed56a6dSDaniel Müller 	AN_ENUM_VAL2___diff = 0,
1003bed56a6dSDaniel Müller 	AN_ENUM_VAL1___diff = 42,
1004bed56a6dSDaniel Müller 	AN_ENUM_VAL3___diff = 1,
1005bed56a6dSDaniel Müller };
1006bed56a6dSDaniel Müller 
1007bed56a6dSDaniel Müller typedef unsigned int int_typedef___diff;
1008bed56a6dSDaniel Müller 
1009bed56a6dSDaniel Müller typedef enum { TYPEDEF_ENUM_VAL2___diff, TYPEDEF_ENUM_VAL1___diff = 50 } enum_typedef___diff;
1010bed56a6dSDaniel Müller 
1011bed56a6dSDaniel Müller typedef const void *void_ptr_typedef___diff;
1012bed56a6dSDaniel Müller 
1013bed56a6dSDaniel Müller typedef int_typedef___diff (*func_proto_typedef___diff)(long);
1014bed56a6dSDaniel Müller 
1015bed56a6dSDaniel Müller typedef char arr_typedef___diff[3];
1016bed56a6dSDaniel Müller 
1017bed56a6dSDaniel Müller struct core_reloc_type_based___diff {
1018bed56a6dSDaniel Müller 	struct a_struct___diff f1;
1019537905c4SDaniel Müller 	struct a_complex_struct___diff f2;
1020537905c4SDaniel Müller 	union a_union___diff f3;
1021537905c4SDaniel Müller 	enum an_enum___diff f4;
1022537905c4SDaniel Müller 	named_struct_typedef___diff f5;
1023537905c4SDaniel Müller 	anon_struct_typedef___diff f6;
1024537905c4SDaniel Müller 	struct_ptr_typedef___diff f7;
1025537905c4SDaniel Müller 	int_typedef___diff f8;
1026537905c4SDaniel Müller 	enum_typedef___diff f9;
1027537905c4SDaniel Müller 	void_ptr_typedef___diff f10;
1028537905c4SDaniel Müller 	func_proto_typedef___diff f11;
1029537905c4SDaniel Müller 	arr_typedef___diff f12;
1030bed56a6dSDaniel Müller };
1031bed56a6dSDaniel Müller 
1032124a892dSAndrii Nakryiko /* different type sizes, extra modifiers, anon vs named enums, etc */
1033124a892dSAndrii Nakryiko struct a_struct___diff_sz {
1034124a892dSAndrii Nakryiko 	long x;
1035124a892dSAndrii Nakryiko 	int y;
1036124a892dSAndrii Nakryiko 	char z;
1037124a892dSAndrii Nakryiko };
1038124a892dSAndrii Nakryiko 
1039124a892dSAndrii Nakryiko union a_union___diff_sz {
1040124a892dSAndrii Nakryiko 	char yy;
1041124a892dSAndrii Nakryiko 	char zz;
1042124a892dSAndrii Nakryiko };
1043124a892dSAndrii Nakryiko 
1044124a892dSAndrii Nakryiko typedef struct a_struct___diff_sz named_struct_typedef___diff_sz;
1045124a892dSAndrii Nakryiko 
1046124a892dSAndrii Nakryiko typedef struct { long xx, yy, zzz; } anon_struct_typedef___diff_sz;
1047124a892dSAndrii Nakryiko 
1048124a892dSAndrii Nakryiko typedef struct {
1049124a892dSAndrii Nakryiko 	char aa[1], bb[2], cc[3];
1050124a892dSAndrii Nakryiko } *struct_ptr_typedef___diff_sz;
1051124a892dSAndrii Nakryiko 
1052124a892dSAndrii Nakryiko enum an_enum___diff_sz {
1053124a892dSAndrii Nakryiko 	AN_ENUM_VAL1___diff_sz = 0x123412341234,
1054124a892dSAndrii Nakryiko 	AN_ENUM_VAL2___diff_sz = 2,
1055124a892dSAndrii Nakryiko };
1056124a892dSAndrii Nakryiko 
1057124a892dSAndrii Nakryiko typedef unsigned long int_typedef___diff_sz;
1058124a892dSAndrii Nakryiko 
1059124a892dSAndrii Nakryiko typedef enum an_enum___diff_sz enum_typedef___diff_sz;
1060124a892dSAndrii Nakryiko 
1061124a892dSAndrii Nakryiko typedef const void * const void_ptr_typedef___diff_sz;
1062124a892dSAndrii Nakryiko 
1063124a892dSAndrii Nakryiko typedef int_typedef___diff_sz (*func_proto_typedef___diff_sz)(char);
1064124a892dSAndrii Nakryiko 
1065124a892dSAndrii Nakryiko typedef int arr_typedef___diff_sz[2];
1066124a892dSAndrii Nakryiko 
1067124a892dSAndrii Nakryiko struct core_reloc_type_based___diff_sz {
1068124a892dSAndrii Nakryiko 	struct a_struct___diff_sz f1;
1069124a892dSAndrii Nakryiko 	union a_union___diff_sz f2;
1070124a892dSAndrii Nakryiko 	enum an_enum___diff_sz f3;
1071124a892dSAndrii Nakryiko 	named_struct_typedef___diff_sz f4;
1072124a892dSAndrii Nakryiko 	anon_struct_typedef___diff_sz f5;
1073124a892dSAndrii Nakryiko 	struct_ptr_typedef___diff_sz f6;
1074124a892dSAndrii Nakryiko 	int_typedef___diff_sz f7;
1075124a892dSAndrii Nakryiko 	enum_typedef___diff_sz f8;
1076124a892dSAndrii Nakryiko 	void_ptr_typedef___diff_sz f9;
1077124a892dSAndrii Nakryiko 	func_proto_typedef___diff_sz f10;
1078124a892dSAndrii Nakryiko 	arr_typedef___diff_sz f11;
1079124a892dSAndrii Nakryiko };
1080124a892dSAndrii Nakryiko 
1081124a892dSAndrii Nakryiko /* incompatibilities between target and local types */
1082124a892dSAndrii Nakryiko union a_struct___incompat { /* union instead of struct */
1083124a892dSAndrii Nakryiko 	int x;
1084124a892dSAndrii Nakryiko };
1085124a892dSAndrii Nakryiko 
1086124a892dSAndrii Nakryiko struct a_union___incompat { /* struct instead of union */
1087124a892dSAndrii Nakryiko 	int y;
1088124a892dSAndrii Nakryiko 	int z;
1089124a892dSAndrii Nakryiko };
1090124a892dSAndrii Nakryiko 
1091124a892dSAndrii Nakryiko /* typedef to union, not to struct */
1092124a892dSAndrii Nakryiko typedef union a_struct___incompat named_struct_typedef___incompat;
1093124a892dSAndrii Nakryiko 
1094124a892dSAndrii Nakryiko /* typedef to void pointer, instead of struct */
1095124a892dSAndrii Nakryiko typedef void *anon_struct_typedef___incompat;
1096124a892dSAndrii Nakryiko 
1097124a892dSAndrii Nakryiko /* extra pointer indirection */
1098124a892dSAndrii Nakryiko typedef struct {
1099124a892dSAndrii Nakryiko 	int a, b, c;
1100124a892dSAndrii Nakryiko } **struct_ptr_typedef___incompat;
1101124a892dSAndrii Nakryiko 
1102124a892dSAndrii Nakryiko /* typedef of a struct with int, instead of int */
1103124a892dSAndrii Nakryiko typedef struct { int x; } int_typedef___incompat;
1104124a892dSAndrii Nakryiko 
1105124a892dSAndrii Nakryiko /* typedef to func_proto, instead of enum */
1106124a892dSAndrii Nakryiko typedef int (*enum_typedef___incompat)(void);
1107124a892dSAndrii Nakryiko 
1108124a892dSAndrii Nakryiko /* pointer to char instead of void */
1109124a892dSAndrii Nakryiko typedef char *void_ptr_typedef___incompat;
1110124a892dSAndrii Nakryiko 
1111124a892dSAndrii Nakryiko /* void return type instead of int */
1112124a892dSAndrii Nakryiko typedef void (*func_proto_typedef___incompat)(long);
1113124a892dSAndrii Nakryiko 
1114124a892dSAndrii Nakryiko /* multi-dimensional array instead of a single-dimensional */
1115124a892dSAndrii Nakryiko typedef int arr_typedef___incompat[20][2];
1116124a892dSAndrii Nakryiko 
1117124a892dSAndrii Nakryiko struct core_reloc_type_based___incompat {
1118124a892dSAndrii Nakryiko 	union a_struct___incompat f1;
1119124a892dSAndrii Nakryiko 	struct a_union___incompat f2;
1120124a892dSAndrii Nakryiko 	/* the only valid one is enum, to check that something still succeeds */
1121124a892dSAndrii Nakryiko 	enum an_enum f3;
1122124a892dSAndrii Nakryiko 	named_struct_typedef___incompat f4;
1123124a892dSAndrii Nakryiko 	anon_struct_typedef___incompat f5;
1124124a892dSAndrii Nakryiko 	struct_ptr_typedef___incompat f6;
1125124a892dSAndrii Nakryiko 	int_typedef___incompat f7;
1126124a892dSAndrii Nakryiko 	enum_typedef___incompat f8;
1127124a892dSAndrii Nakryiko 	void_ptr_typedef___incompat f9;
1128124a892dSAndrii Nakryiko 	func_proto_typedef___incompat f10;
1129124a892dSAndrii Nakryiko 	arr_typedef___incompat f11;
1130124a892dSAndrii Nakryiko };
1131124a892dSAndrii Nakryiko 
1132124a892dSAndrii Nakryiko /* func_proto with incompatible signature */
1133124a892dSAndrii Nakryiko typedef void (*func_proto_typedef___fn_wrong_ret1)(long);
1134124a892dSAndrii Nakryiko typedef int * (*func_proto_typedef___fn_wrong_ret2)(long);
1135124a892dSAndrii Nakryiko typedef struct { int x; } int_struct_typedef;
1136124a892dSAndrii Nakryiko typedef int_struct_typedef (*func_proto_typedef___fn_wrong_ret3)(long);
1137124a892dSAndrii Nakryiko typedef int (*func_proto_typedef___fn_wrong_arg)(void *);
1138124a892dSAndrii Nakryiko typedef int (*func_proto_typedef___fn_wrong_arg_cnt1)(long, long);
1139124a892dSAndrii Nakryiko typedef int (*func_proto_typedef___fn_wrong_arg_cnt2)(void);
1140124a892dSAndrii Nakryiko 
1141124a892dSAndrii Nakryiko struct core_reloc_type_based___fn_wrong_args {
1142124a892dSAndrii Nakryiko 	/* one valid type to make sure relos still work */
1143124a892dSAndrii Nakryiko 	struct a_struct f1;
1144124a892dSAndrii Nakryiko 	func_proto_typedef___fn_wrong_ret1 f2;
1145124a892dSAndrii Nakryiko 	func_proto_typedef___fn_wrong_ret2 f3;
1146124a892dSAndrii Nakryiko 	func_proto_typedef___fn_wrong_ret3 f4;
1147124a892dSAndrii Nakryiko 	func_proto_typedef___fn_wrong_arg f5;
1148124a892dSAndrii Nakryiko 	func_proto_typedef___fn_wrong_arg_cnt1 f6;
1149124a892dSAndrii Nakryiko 	func_proto_typedef___fn_wrong_arg_cnt2 f7;
1150124a892dSAndrii Nakryiko };
11514836bf5eSAndrii Nakryiko 
11524836bf5eSAndrii Nakryiko /*
11534836bf5eSAndrii Nakryiko  * TYPE ID MAPPING (LOCAL AND TARGET)
11544836bf5eSAndrii Nakryiko  */
11554836bf5eSAndrii Nakryiko struct core_reloc_type_id_output {
11564836bf5eSAndrii Nakryiko 	int local_anon_struct;
11574836bf5eSAndrii Nakryiko 	int local_anon_union;
11584836bf5eSAndrii Nakryiko 	int local_anon_enum;
11594836bf5eSAndrii Nakryiko 	int local_anon_func_proto_ptr;
11604836bf5eSAndrii Nakryiko 	int local_anon_void_ptr;
11614836bf5eSAndrii Nakryiko 	int local_anon_arr;
11624836bf5eSAndrii Nakryiko 
11634836bf5eSAndrii Nakryiko 	int local_struct;
11644836bf5eSAndrii Nakryiko 	int local_union;
11654836bf5eSAndrii Nakryiko 	int local_enum;
11664836bf5eSAndrii Nakryiko 	int local_int;
11674836bf5eSAndrii Nakryiko 	int local_struct_typedef;
11684836bf5eSAndrii Nakryiko 	int local_func_proto_typedef;
11694836bf5eSAndrii Nakryiko 	int local_arr_typedef;
11704836bf5eSAndrii Nakryiko 
11714836bf5eSAndrii Nakryiko 	int targ_struct;
11724836bf5eSAndrii Nakryiko 	int targ_union;
11734836bf5eSAndrii Nakryiko 	int targ_enum;
11744836bf5eSAndrii Nakryiko 	int targ_int;
11754836bf5eSAndrii Nakryiko 	int targ_struct_typedef;
11764836bf5eSAndrii Nakryiko 	int targ_func_proto_typedef;
11774836bf5eSAndrii Nakryiko 	int targ_arr_typedef;
11784836bf5eSAndrii Nakryiko };
11794836bf5eSAndrii Nakryiko 
11804836bf5eSAndrii Nakryiko struct core_reloc_type_id {
11814836bf5eSAndrii Nakryiko 	struct a_struct f1;
11824836bf5eSAndrii Nakryiko 	union a_union f2;
11834836bf5eSAndrii Nakryiko 	enum an_enum f3;
11844836bf5eSAndrii Nakryiko 	named_struct_typedef f4;
11854836bf5eSAndrii Nakryiko 	func_proto_typedef f5;
11864836bf5eSAndrii Nakryiko 	arr_typedef f6;
11874836bf5eSAndrii Nakryiko };
11884836bf5eSAndrii Nakryiko 
11894836bf5eSAndrii Nakryiko struct core_reloc_type_id___missing_targets {
11904836bf5eSAndrii Nakryiko 	/* nothing */
11914836bf5eSAndrii Nakryiko };
119233574905SAndrii Nakryiko 
119333574905SAndrii Nakryiko /*
119433574905SAndrii Nakryiko  * ENUMERATOR VALUE EXISTENCE AND VALUE RELOCATION
119533574905SAndrii Nakryiko  */
119633574905SAndrii Nakryiko struct core_reloc_enumval_output {
119733574905SAndrii Nakryiko 	bool named_val1_exists;
119833574905SAndrii Nakryiko 	bool named_val2_exists;
119933574905SAndrii Nakryiko 	bool named_val3_exists;
120033574905SAndrii Nakryiko 	bool anon_val1_exists;
120133574905SAndrii Nakryiko 	bool anon_val2_exists;
120233574905SAndrii Nakryiko 	bool anon_val3_exists;
120333574905SAndrii Nakryiko 
120433574905SAndrii Nakryiko 	int named_val1;
120533574905SAndrii Nakryiko 	int named_val2;
120633574905SAndrii Nakryiko 	int anon_val1;
120733574905SAndrii Nakryiko 	int anon_val2;
120833574905SAndrii Nakryiko };
120933574905SAndrii Nakryiko 
1210f4db3dd5SYonghong Song struct core_reloc_enum64val_output {
1211f4db3dd5SYonghong Song 	bool unsigned_val1_exists;
1212f4db3dd5SYonghong Song 	bool unsigned_val2_exists;
1213f4db3dd5SYonghong Song 	bool unsigned_val3_exists;
1214f4db3dd5SYonghong Song 	bool signed_val1_exists;
1215f4db3dd5SYonghong Song 	bool signed_val2_exists;
1216f4db3dd5SYonghong Song 	bool signed_val3_exists;
1217f4db3dd5SYonghong Song 
1218f4db3dd5SYonghong Song 	long unsigned_val1;
1219f4db3dd5SYonghong Song 	long unsigned_val2;
1220f4db3dd5SYonghong Song 	long signed_val1;
1221f4db3dd5SYonghong Song 	long signed_val2;
1222f4db3dd5SYonghong Song };
1223f4db3dd5SYonghong Song 
122433574905SAndrii Nakryiko enum named_enum {
122533574905SAndrii Nakryiko 	NAMED_ENUM_VAL1 = 1,
122633574905SAndrii Nakryiko 	NAMED_ENUM_VAL2 = 2,
122733574905SAndrii Nakryiko 	NAMED_ENUM_VAL3 = 3,
122833574905SAndrii Nakryiko };
122933574905SAndrii Nakryiko 
123033574905SAndrii Nakryiko typedef enum {
123133574905SAndrii Nakryiko 	ANON_ENUM_VAL1 = 0x10,
123233574905SAndrii Nakryiko 	ANON_ENUM_VAL2 = 0x20,
123333574905SAndrii Nakryiko 	ANON_ENUM_VAL3 = 0x30,
123433574905SAndrii Nakryiko } anon_enum;
123533574905SAndrii Nakryiko 
123633574905SAndrii Nakryiko struct core_reloc_enumval {
123733574905SAndrii Nakryiko 	enum named_enum f1;
123833574905SAndrii Nakryiko 	anon_enum f2;
123933574905SAndrii Nakryiko };
124033574905SAndrii Nakryiko 
1241f4db3dd5SYonghong Song enum named_unsigned_enum64 {
1242f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL1 = 0x1ffffffffULL,
1243f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL2 = 0x2,
1244f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL3 = 0x3ffffffffULL,
1245f4db3dd5SYonghong Song };
1246f4db3dd5SYonghong Song 
1247f4db3dd5SYonghong Song enum named_signed_enum64 {
1248f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL1 = 0x1ffffffffLL,
1249f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL2 = -2,
1250f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL3 = 0x3ffffffffLL,
1251f4db3dd5SYonghong Song };
1252f4db3dd5SYonghong Song 
1253f4db3dd5SYonghong Song struct core_reloc_enum64val {
1254f4db3dd5SYonghong Song 	enum named_unsigned_enum64 f1;
1255f4db3dd5SYonghong Song 	enum named_signed_enum64 f2;
1256f4db3dd5SYonghong Song };
1257f4db3dd5SYonghong Song 
125833574905SAndrii Nakryiko /* differing enumerator values */
125933574905SAndrii Nakryiko enum named_enum___diff {
126033574905SAndrii Nakryiko 	NAMED_ENUM_VAL1___diff = 101,
126133574905SAndrii Nakryiko 	NAMED_ENUM_VAL2___diff = 202,
126233574905SAndrii Nakryiko 	NAMED_ENUM_VAL3___diff = 303,
126333574905SAndrii Nakryiko };
126433574905SAndrii Nakryiko 
126533574905SAndrii Nakryiko typedef enum {
126633574905SAndrii Nakryiko 	ANON_ENUM_VAL1___diff = 0x11,
126733574905SAndrii Nakryiko 	ANON_ENUM_VAL2___diff = 0x22,
126833574905SAndrii Nakryiko 	ANON_ENUM_VAL3___diff = 0x33,
126933574905SAndrii Nakryiko } anon_enum___diff;
127033574905SAndrii Nakryiko 
127133574905SAndrii Nakryiko struct core_reloc_enumval___diff {
127233574905SAndrii Nakryiko 	enum named_enum___diff f1;
127333574905SAndrii Nakryiko 	anon_enum___diff f2;
127433574905SAndrii Nakryiko };
127533574905SAndrii Nakryiko 
1276f4db3dd5SYonghong Song enum named_unsigned_enum64___diff {
1277f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL1___diff = 0x101ffffffffULL,
1278f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL2___diff = 0x202ffffffffULL,
1279f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL3___diff = 0x303ffffffffULL,
1280f4db3dd5SYonghong Song };
1281f4db3dd5SYonghong Song 
1282f4db3dd5SYonghong Song enum named_signed_enum64___diff {
1283f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL1___diff = -101,
1284f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL2___diff = -202,
1285f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL3___diff = -303,
1286f4db3dd5SYonghong Song };
1287f4db3dd5SYonghong Song 
1288f4db3dd5SYonghong Song struct core_reloc_enum64val___diff {
1289f4db3dd5SYonghong Song 	enum named_unsigned_enum64___diff f1;
1290f4db3dd5SYonghong Song 	enum named_signed_enum64___diff f2;
1291f4db3dd5SYonghong Song };
1292f4db3dd5SYonghong Song 
129333574905SAndrii Nakryiko /* missing (optional) third enum value */
129433574905SAndrii Nakryiko enum named_enum___val3_missing {
129533574905SAndrii Nakryiko 	NAMED_ENUM_VAL1___val3_missing = 111,
129633574905SAndrii Nakryiko 	NAMED_ENUM_VAL2___val3_missing = 222,
129733574905SAndrii Nakryiko };
129833574905SAndrii Nakryiko 
129933574905SAndrii Nakryiko typedef enum {
130033574905SAndrii Nakryiko 	ANON_ENUM_VAL1___val3_missing = 0x111,
130133574905SAndrii Nakryiko 	ANON_ENUM_VAL2___val3_missing = 0x222,
130233574905SAndrii Nakryiko } anon_enum___val3_missing;
130333574905SAndrii Nakryiko 
130433574905SAndrii Nakryiko struct core_reloc_enumval___val3_missing {
130533574905SAndrii Nakryiko 	enum named_enum___val3_missing f1;
130633574905SAndrii Nakryiko 	anon_enum___val3_missing f2;
130733574905SAndrii Nakryiko };
130833574905SAndrii Nakryiko 
1309f4db3dd5SYonghong Song enum named_unsigned_enum64___val3_missing {
1310f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL1___val3_missing = 0x111ffffffffULL,
1311f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL2___val3_missing = 0x222,
1312f4db3dd5SYonghong Song };
1313f4db3dd5SYonghong Song 
1314f4db3dd5SYonghong Song enum named_signed_enum64___val3_missing {
1315f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL1___val3_missing = 0x111ffffffffLL,
1316f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL2___val3_missing = -222,
1317f4db3dd5SYonghong Song };
1318f4db3dd5SYonghong Song 
1319f4db3dd5SYonghong Song struct core_reloc_enum64val___val3_missing {
1320f4db3dd5SYonghong Song 	enum named_unsigned_enum64___val3_missing f1;
1321f4db3dd5SYonghong Song 	enum named_signed_enum64___val3_missing f2;
1322f4db3dd5SYonghong Song };
1323f4db3dd5SYonghong Song 
132433574905SAndrii Nakryiko /* missing (mandatory) second enum value, should fail */
132533574905SAndrii Nakryiko enum named_enum___err_missing {
132633574905SAndrii Nakryiko 	NAMED_ENUM_VAL1___err_missing = 1,
132733574905SAndrii Nakryiko 	NAMED_ENUM_VAL3___err_missing = 3,
132833574905SAndrii Nakryiko };
132933574905SAndrii Nakryiko 
133033574905SAndrii Nakryiko typedef enum {
133133574905SAndrii Nakryiko 	ANON_ENUM_VAL1___err_missing = 0x111,
133233574905SAndrii Nakryiko 	ANON_ENUM_VAL3___err_missing = 0x222,
133333574905SAndrii Nakryiko } anon_enum___err_missing;
133433574905SAndrii Nakryiko 
133533574905SAndrii Nakryiko struct core_reloc_enumval___err_missing {
133633574905SAndrii Nakryiko 	enum named_enum___err_missing f1;
133733574905SAndrii Nakryiko 	anon_enum___err_missing f2;
133833574905SAndrii Nakryiko };
1339f4db3dd5SYonghong Song 
1340f4db3dd5SYonghong Song enum named_unsigned_enum64___err_missing {
1341f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL1___err_missing = 0x1ffffffffULL,
1342f4db3dd5SYonghong Song 	UNSIGNED_ENUM64_VAL3___err_missing = 0x3ffffffffULL,
1343f4db3dd5SYonghong Song };
1344f4db3dd5SYonghong Song 
1345f4db3dd5SYonghong Song enum named_signed_enum64___err_missing {
1346f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL1___err_missing = 0x1ffffffffLL,
1347f4db3dd5SYonghong Song 	SIGNED_ENUM64_VAL3___err_missing = -3,
1348f4db3dd5SYonghong Song };
1349f4db3dd5SYonghong Song 
1350f4db3dd5SYonghong Song struct core_reloc_enum64val___err_missing {
1351f4db3dd5SYonghong Song 	enum named_unsigned_enum64___err_missing f1;
1352f4db3dd5SYonghong Song 	enum named_signed_enum64___err_missing f2;
1353f4db3dd5SYonghong Song };
1354