1c64779e2SAndrii Nakryiko /* SPDX-License-Identifier: GPL-2.0 */
2c64779e2SAndrii Nakryiko /* Copyright (c) 2018 Facebook */
3c64779e2SAndrii Nakryiko 
4c64779e2SAndrii Nakryiko #include <linux/bpf.h>
5c64779e2SAndrii Nakryiko #include <linux/btf.h>
6c64779e2SAndrii Nakryiko #include <linux/err.h>
7c64779e2SAndrii Nakryiko #include <linux/kernel.h>
8c64779e2SAndrii Nakryiko #include <linux/filter.h>
9c64779e2SAndrii Nakryiko #include <linux/unistd.h>
10c64779e2SAndrii Nakryiko #include <bpf/bpf.h>
11c64779e2SAndrii Nakryiko #include <sys/resource.h>
12c64779e2SAndrii Nakryiko #include <libelf.h>
13c64779e2SAndrii Nakryiko #include <gelf.h>
14c64779e2SAndrii Nakryiko #include <string.h>
15c64779e2SAndrii Nakryiko #include <stdlib.h>
16c64779e2SAndrii Nakryiko #include <stdio.h>
17c64779e2SAndrii Nakryiko #include <stdarg.h>
18c64779e2SAndrii Nakryiko #include <unistd.h>
19c64779e2SAndrii Nakryiko #include <fcntl.h>
20c64779e2SAndrii Nakryiko #include <errno.h>
21c64779e2SAndrii Nakryiko #include <assert.h>
22c64779e2SAndrii Nakryiko #include <bpf/libbpf.h>
23c64779e2SAndrii Nakryiko #include <bpf/btf.h>
24c64779e2SAndrii Nakryiko 
25c64779e2SAndrii Nakryiko #include "bpf_rlimit.h"
26c64779e2SAndrii Nakryiko #include "bpf_util.h"
27c64779e2SAndrii Nakryiko #include "../test_btf.h"
28c64779e2SAndrii Nakryiko #include "test_progs.h"
29c64779e2SAndrii Nakryiko 
30c64779e2SAndrii Nakryiko #define MAX_INSNS	512
31c64779e2SAndrii Nakryiko #define MAX_SUBPROGS	16
32c64779e2SAndrii Nakryiko 
33c64779e2SAndrii Nakryiko static int duration = 0;
34c64779e2SAndrii Nakryiko static bool always_log;
35c64779e2SAndrii Nakryiko 
36c64779e2SAndrii Nakryiko #undef CHECK
37c64779e2SAndrii Nakryiko #define CHECK(condition, format...) _CHECK(condition, "check", duration, format)
38c64779e2SAndrii Nakryiko 
39c64779e2SAndrii Nakryiko #define BTF_END_RAW 0xdeadbeef
40c64779e2SAndrii Nakryiko #define NAME_TBD 0xdeadb33f
41c64779e2SAndrii Nakryiko 
423df3bd68SYonghong Song #define NAME_NTH(N) (0xfffe0000 | N)
433df3bd68SYonghong Song #define IS_NAME_NTH(X) ((X & 0xffff0000) == 0xfffe0000)
44c64779e2SAndrii Nakryiko #define GET_NAME_NTH_IDX(X) (X & 0x0000ffff)
45c64779e2SAndrii Nakryiko 
46c64779e2SAndrii Nakryiko #define MAX_NR_RAW_U32 1024
47c64779e2SAndrii Nakryiko #define BTF_LOG_BUF_SIZE 65535
48c64779e2SAndrii Nakryiko 
49c64779e2SAndrii Nakryiko static char btf_log_buf[BTF_LOG_BUF_SIZE];
50c64779e2SAndrii Nakryiko 
51c64779e2SAndrii Nakryiko static struct btf_header hdr_tmpl = {
52c64779e2SAndrii Nakryiko 	.magic = BTF_MAGIC,
53c64779e2SAndrii Nakryiko 	.version = BTF_VERSION,
54c64779e2SAndrii Nakryiko 	.hdr_len = sizeof(struct btf_header),
55c64779e2SAndrii Nakryiko };
56c64779e2SAndrii Nakryiko 
57c64779e2SAndrii Nakryiko /* several different mapv kinds(types) supported by pprint */
58c64779e2SAndrii Nakryiko enum pprint_mapv_kind_t {
59c64779e2SAndrii Nakryiko 	PPRINT_MAPV_KIND_BASIC = 0,
60c64779e2SAndrii Nakryiko 	PPRINT_MAPV_KIND_INT128,
61c64779e2SAndrii Nakryiko };
62c64779e2SAndrii Nakryiko 
63c64779e2SAndrii Nakryiko struct btf_raw_test {
64c64779e2SAndrii Nakryiko 	const char *descr;
65c64779e2SAndrii Nakryiko 	const char *str_sec;
66c64779e2SAndrii Nakryiko 	const char *map_name;
67c64779e2SAndrii Nakryiko 	const char *err_str;
68c64779e2SAndrii Nakryiko 	__u32 raw_types[MAX_NR_RAW_U32];
69c64779e2SAndrii Nakryiko 	__u32 str_sec_size;
70c64779e2SAndrii Nakryiko 	enum bpf_map_type map_type;
71c64779e2SAndrii Nakryiko 	__u32 key_size;
72c64779e2SAndrii Nakryiko 	__u32 value_size;
73c64779e2SAndrii Nakryiko 	__u32 key_type_id;
74c64779e2SAndrii Nakryiko 	__u32 value_type_id;
75c64779e2SAndrii Nakryiko 	__u32 max_entries;
76c64779e2SAndrii Nakryiko 	bool btf_load_err;
77c64779e2SAndrii Nakryiko 	bool map_create_err;
78c64779e2SAndrii Nakryiko 	bool ordered_map;
79c64779e2SAndrii Nakryiko 	bool lossless_map;
80c64779e2SAndrii Nakryiko 	bool percpu_map;
81c64779e2SAndrii Nakryiko 	int hdr_len_delta;
82c64779e2SAndrii Nakryiko 	int type_off_delta;
83c64779e2SAndrii Nakryiko 	int str_off_delta;
84c64779e2SAndrii Nakryiko 	int str_len_delta;
85c64779e2SAndrii Nakryiko 	enum pprint_mapv_kind_t mapv_kind;
86c64779e2SAndrii Nakryiko };
87c64779e2SAndrii Nakryiko 
88c64779e2SAndrii Nakryiko #define BTF_STR_SEC(str) \
89c64779e2SAndrii Nakryiko 	.str_sec = str, .str_sec_size = sizeof(str)
90c64779e2SAndrii Nakryiko 
91c64779e2SAndrii Nakryiko static struct btf_raw_test raw_tests[] = {
92c64779e2SAndrii Nakryiko /* enum E {
93c64779e2SAndrii Nakryiko  *     E0,
94c64779e2SAndrii Nakryiko  *     E1,
95c64779e2SAndrii Nakryiko  * };
96c64779e2SAndrii Nakryiko  *
97c64779e2SAndrii Nakryiko  * struct A {
98c64779e2SAndrii Nakryiko  *	unsigned long long m;
99c64779e2SAndrii Nakryiko  *	int n;
100c64779e2SAndrii Nakryiko  *	char o;
101c64779e2SAndrii Nakryiko  *	[3 bytes hole]
102c64779e2SAndrii Nakryiko  *	int p[8];
103c64779e2SAndrii Nakryiko  *	int q[4][8];
104c64779e2SAndrii Nakryiko  *	enum E r;
105c64779e2SAndrii Nakryiko  * };
106c64779e2SAndrii Nakryiko  */
107c64779e2SAndrii Nakryiko {
108c64779e2SAndrii Nakryiko 	.descr = "struct test #1",
109c64779e2SAndrii Nakryiko 	.raw_types = {
110c64779e2SAndrii Nakryiko 		/* int */
111c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
112c64779e2SAndrii Nakryiko 		/* unsigned long long */
113c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
114c64779e2SAndrii Nakryiko 		/* char */
115c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
116c64779e2SAndrii Nakryiko 		/* int[8] */
117c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
118c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
119c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 6), 180),
120c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
121c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
122c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
123c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
124c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 384),/* int q[4][8]		*/
125c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 7, 1408), /* enum E r		*/
126c64779e2SAndrii Nakryiko 		/* } */
127c64779e2SAndrii Nakryiko 		/* int[4][8] */
128c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(4, 1, 4),			/* [6] */
129c64779e2SAndrii Nakryiko 		/* enum E */					/* [7] */
130c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), sizeof(int)),
131c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
132c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
133c64779e2SAndrii Nakryiko 		BTF_END_RAW,
134c64779e2SAndrii Nakryiko 	},
135c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0q\0r\0E\0E0\0E1",
136c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0q\0r\0E\0E0\0E1"),
137c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
138c64779e2SAndrii Nakryiko 	.map_name = "struct_test1_map",
139c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
140c64779e2SAndrii Nakryiko 	.value_size = 180,
141c64779e2SAndrii Nakryiko 	.key_type_id = 1,
142c64779e2SAndrii Nakryiko 	.value_type_id = 5,
143c64779e2SAndrii Nakryiko 	.max_entries = 4,
144c64779e2SAndrii Nakryiko },
145c64779e2SAndrii Nakryiko 
146c64779e2SAndrii Nakryiko /* typedef struct b Struct_B;
147c64779e2SAndrii Nakryiko  *
148c64779e2SAndrii Nakryiko  * struct A {
149c64779e2SAndrii Nakryiko  *     int m;
150c64779e2SAndrii Nakryiko  *     struct b n[4];
151c64779e2SAndrii Nakryiko  *     const Struct_B o[4];
152c64779e2SAndrii Nakryiko  * };
153c64779e2SAndrii Nakryiko  *
154c64779e2SAndrii Nakryiko  * struct B {
155c64779e2SAndrii Nakryiko  *     int m;
156c64779e2SAndrii Nakryiko  *     int n;
157c64779e2SAndrii Nakryiko  * };
158c64779e2SAndrii Nakryiko  */
159c64779e2SAndrii Nakryiko {
160c64779e2SAndrii Nakryiko 	.descr = "struct test #2",
161c64779e2SAndrii Nakryiko 	.raw_types = {
162c64779e2SAndrii Nakryiko 		/* int */					/* [1] */
163c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
164c64779e2SAndrii Nakryiko 		/* struct b [4] */				/* [2] */
165c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(4, 1, 4),
166c64779e2SAndrii Nakryiko 
167c64779e2SAndrii Nakryiko 		/* struct A { */				/* [3] */
168c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 3), 68),
169c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m;		*/
170c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct B n[4]	*/
171c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 8, 288),/* const Struct_B o[4];*/
172c64779e2SAndrii Nakryiko 		/* } */
173c64779e2SAndrii Nakryiko 
174c64779e2SAndrii Nakryiko 		/* struct B { */				/* [4] */
175c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
176c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
177c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),/* int n; */
178c64779e2SAndrii Nakryiko 		/* } */
179c64779e2SAndrii Nakryiko 
180c64779e2SAndrii Nakryiko 		/* const int */					/* [5] */
181c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1),
182c64779e2SAndrii Nakryiko 		/* typedef struct b Struct_B */	/* [6] */
183c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 4),
184c64779e2SAndrii Nakryiko 		/* const Struct_B */				/* [7] */
185c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 6),
186c64779e2SAndrii Nakryiko 		/* const Struct_B [4] */			/* [8] */
187c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(7, 1, 4),
188c64779e2SAndrii Nakryiko 		BTF_END_RAW,
189c64779e2SAndrii Nakryiko 	},
190c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0B\0m\0n\0Struct_B",
191c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0B\0m\0n\0Struct_B"),
192c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
193c64779e2SAndrii Nakryiko 	.map_name = "struct_test2_map",
194c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
195c64779e2SAndrii Nakryiko 	.value_size = 68,
196c64779e2SAndrii Nakryiko 	.key_type_id = 1,
197c64779e2SAndrii Nakryiko 	.value_type_id = 3,
198c64779e2SAndrii Nakryiko 	.max_entries = 4,
199c64779e2SAndrii Nakryiko },
200c64779e2SAndrii Nakryiko {
201c64779e2SAndrii Nakryiko 	.descr = "struct test #3 Invalid member offset",
202c64779e2SAndrii Nakryiko 	.raw_types = {
203c64779e2SAndrii Nakryiko 		/* int */					/* [1] */
204c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
205c64779e2SAndrii Nakryiko 		/* int64 */					/* [2] */
206c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 64, 8),
207c64779e2SAndrii Nakryiko 
208c64779e2SAndrii Nakryiko 		/* struct A { */				/* [3] */
209c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 16),
210c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),	/* int m;		*/
211c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),		/* int64 n; */
212c64779e2SAndrii Nakryiko 		/* } */
213c64779e2SAndrii Nakryiko 		BTF_END_RAW,
214c64779e2SAndrii Nakryiko 	},
215c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0",
216c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0"),
217c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
218c64779e2SAndrii Nakryiko 	.map_name = "struct_test3_map",
219c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
220c64779e2SAndrii Nakryiko 	.value_size = 16,
221c64779e2SAndrii Nakryiko 	.key_type_id = 1,
222c64779e2SAndrii Nakryiko 	.value_type_id = 3,
223c64779e2SAndrii Nakryiko 	.max_entries = 4,
224c64779e2SAndrii Nakryiko 	.btf_load_err = true,
225c64779e2SAndrii Nakryiko 	.err_str = "Invalid member bits_offset",
226c64779e2SAndrii Nakryiko },
227c64779e2SAndrii Nakryiko /*
228c64779e2SAndrii Nakryiko  * struct A {
229c64779e2SAndrii Nakryiko  *	unsigned long long m;
230c64779e2SAndrii Nakryiko  *	int n;
231c64779e2SAndrii Nakryiko  *	char o;
232c64779e2SAndrii Nakryiko  *	[3 bytes hole]
233c64779e2SAndrii Nakryiko  *	int p[8];
234c64779e2SAndrii Nakryiko  * };
235c64779e2SAndrii Nakryiko  */
236c64779e2SAndrii Nakryiko {
237c64779e2SAndrii Nakryiko 	.descr = "global data test #1",
238c64779e2SAndrii Nakryiko 	.raw_types = {
239c64779e2SAndrii Nakryiko 		/* int */
240c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
241c64779e2SAndrii Nakryiko 		/* unsigned long long */
242c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
243c64779e2SAndrii Nakryiko 		/* char */
244c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
245c64779e2SAndrii Nakryiko 		/* int[8] */
246c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
247c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
248c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
249c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
250c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
251c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
252c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
253c64779e2SAndrii Nakryiko 		/* } */
254c64779e2SAndrii Nakryiko 		BTF_END_RAW,
255c64779e2SAndrii Nakryiko 	},
256c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p",
257c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p"),
258c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
259c64779e2SAndrii Nakryiko 	.map_name = "struct_test1_map",
260c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
261c64779e2SAndrii Nakryiko 	.value_size = 48,
262c64779e2SAndrii Nakryiko 	.key_type_id = 1,
263c64779e2SAndrii Nakryiko 	.value_type_id = 5,
264c64779e2SAndrii Nakryiko 	.max_entries = 4,
265c64779e2SAndrii Nakryiko },
266c64779e2SAndrii Nakryiko /*
267c64779e2SAndrii Nakryiko  * struct A {
268c64779e2SAndrii Nakryiko  *	unsigned long long m;
269c64779e2SAndrii Nakryiko  *	int n;
270c64779e2SAndrii Nakryiko  *	char o;
271c64779e2SAndrii Nakryiko  *	[3 bytes hole]
272c64779e2SAndrii Nakryiko  *	int p[8];
273c64779e2SAndrii Nakryiko  * };
274c64779e2SAndrii Nakryiko  * static struct A t; <- in .bss
275c64779e2SAndrii Nakryiko  */
276c64779e2SAndrii Nakryiko {
277c64779e2SAndrii Nakryiko 	.descr = "global data test #2",
278c64779e2SAndrii Nakryiko 	.raw_types = {
279c64779e2SAndrii Nakryiko 		/* int */
280c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
281c64779e2SAndrii Nakryiko 		/* unsigned long long */
282c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
283c64779e2SAndrii Nakryiko 		/* char */
284c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
285c64779e2SAndrii Nakryiko 		/* int[8] */
286c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
287c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
288c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
289c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
290c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
291c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
292c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
293c64779e2SAndrii Nakryiko 		/* } */
294c64779e2SAndrii Nakryiko 		/* static struct A t */
295c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
296c64779e2SAndrii Nakryiko 		/* .bss section */				/* [7] */
297c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 48),
298c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 0, 48),
299c64779e2SAndrii Nakryiko 		BTF_END_RAW,
300c64779e2SAndrii Nakryiko 	},
301c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0t\0.bss",
302c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
303c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
304c64779e2SAndrii Nakryiko 	.map_name = ".bss",
305c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
306c64779e2SAndrii Nakryiko 	.value_size = 48,
307c64779e2SAndrii Nakryiko 	.key_type_id = 0,
308c64779e2SAndrii Nakryiko 	.value_type_id = 7,
309c64779e2SAndrii Nakryiko 	.max_entries = 1,
310c64779e2SAndrii Nakryiko },
311c64779e2SAndrii Nakryiko {
312c64779e2SAndrii Nakryiko 	.descr = "global data test #3",
313c64779e2SAndrii Nakryiko 	.raw_types = {
314c64779e2SAndrii Nakryiko 		/* int */
315c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
316c64779e2SAndrii Nakryiko 		/* static int t */
317c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
318c64779e2SAndrii Nakryiko 		/* .bss section */				/* [3] */
319c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
320c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(2, 0, 4),
321c64779e2SAndrii Nakryiko 		BTF_END_RAW,
322c64779e2SAndrii Nakryiko 	},
323c64779e2SAndrii Nakryiko 	.str_sec = "\0t\0.bss",
324c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0t\0.bss"),
325c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
326c64779e2SAndrii Nakryiko 	.map_name = ".bss",
327c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
328c64779e2SAndrii Nakryiko 	.value_size = 4,
329c64779e2SAndrii Nakryiko 	.key_type_id = 0,
330c64779e2SAndrii Nakryiko 	.value_type_id = 3,
331c64779e2SAndrii Nakryiko 	.max_entries = 1,
332c64779e2SAndrii Nakryiko },
333c64779e2SAndrii Nakryiko {
334c64779e2SAndrii Nakryiko 	.descr = "global data test #4, unsupported linkage",
335c64779e2SAndrii Nakryiko 	.raw_types = {
336c64779e2SAndrii Nakryiko 		/* int */
337c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
338c64779e2SAndrii Nakryiko 		/* static int t */
339c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 2),			/* [2] */
340c64779e2SAndrii Nakryiko 		/* .bss section */				/* [3] */
341c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
342c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(2, 0, 4),
343c64779e2SAndrii Nakryiko 		BTF_END_RAW,
344c64779e2SAndrii Nakryiko 	},
345c64779e2SAndrii Nakryiko 	.str_sec = "\0t\0.bss",
346c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0t\0.bss"),
347c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
348c64779e2SAndrii Nakryiko 	.map_name = ".bss",
349c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
350c64779e2SAndrii Nakryiko 	.value_size = 4,
351c64779e2SAndrii Nakryiko 	.key_type_id = 0,
352c64779e2SAndrii Nakryiko 	.value_type_id = 3,
353c64779e2SAndrii Nakryiko 	.max_entries = 1,
354c64779e2SAndrii Nakryiko 	.btf_load_err = true,
355c64779e2SAndrii Nakryiko 	.err_str = "Linkage not supported",
356c64779e2SAndrii Nakryiko },
357c64779e2SAndrii Nakryiko {
358c64779e2SAndrii Nakryiko 	.descr = "global data test #5, invalid var type",
359c64779e2SAndrii Nakryiko 	.raw_types = {
360c64779e2SAndrii Nakryiko 		/* static void t */
361c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 0, 0),			/* [1] */
362c64779e2SAndrii Nakryiko 		/* .bss section */				/* [2] */
363c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
364c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(1, 0, 4),
365c64779e2SAndrii Nakryiko 		BTF_END_RAW,
366c64779e2SAndrii Nakryiko 	},
367c64779e2SAndrii Nakryiko 	.str_sec = "\0t\0.bss",
368c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0t\0.bss"),
369c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
370c64779e2SAndrii Nakryiko 	.map_name = ".bss",
371c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
372c64779e2SAndrii Nakryiko 	.value_size = 4,
373c64779e2SAndrii Nakryiko 	.key_type_id = 0,
374c64779e2SAndrii Nakryiko 	.value_type_id = 2,
375c64779e2SAndrii Nakryiko 	.max_entries = 1,
376c64779e2SAndrii Nakryiko 	.btf_load_err = true,
377c64779e2SAndrii Nakryiko 	.err_str = "Invalid type_id",
378c64779e2SAndrii Nakryiko },
379c64779e2SAndrii Nakryiko {
380c64779e2SAndrii Nakryiko 	.descr = "global data test #6, invalid var type (fwd type)",
381c64779e2SAndrii Nakryiko 	.raw_types = {
382c64779e2SAndrii Nakryiko 		/* union A */
383c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
384c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0), /* [1] */
385c64779e2SAndrii Nakryiko 		/* static union A t */
386c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
387c64779e2SAndrii Nakryiko 		/* .bss section */				/* [3] */
388c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
389c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(2, 0, 4),
390c64779e2SAndrii Nakryiko 		BTF_END_RAW,
391c64779e2SAndrii Nakryiko 	},
392c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0.bss",
393c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0.bss"),
394c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
395c64779e2SAndrii Nakryiko 	.map_name = ".bss",
396c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
397c64779e2SAndrii Nakryiko 	.value_size = 4,
398c64779e2SAndrii Nakryiko 	.key_type_id = 0,
399c64779e2SAndrii Nakryiko 	.value_type_id = 2,
400c64779e2SAndrii Nakryiko 	.max_entries = 1,
401c64779e2SAndrii Nakryiko 	.btf_load_err = true,
402c64779e2SAndrii Nakryiko 	.err_str = "Invalid type",
403c64779e2SAndrii Nakryiko },
404c64779e2SAndrii Nakryiko {
405c64779e2SAndrii Nakryiko 	.descr = "global data test #7, invalid var type (fwd type)",
406c64779e2SAndrii Nakryiko 	.raw_types = {
407c64779e2SAndrii Nakryiko 		/* union A */
408c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
409c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0), /* [1] */
410c64779e2SAndrii Nakryiko 		/* static union A t */
411c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
412c64779e2SAndrii Nakryiko 		/* .bss section */				/* [3] */
413c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
414c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(1, 0, 4),
415c64779e2SAndrii Nakryiko 		BTF_END_RAW,
416c64779e2SAndrii Nakryiko 	},
417c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0.bss",
418c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0.bss"),
419c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
420c64779e2SAndrii Nakryiko 	.map_name = ".bss",
421c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
422c64779e2SAndrii Nakryiko 	.value_size = 4,
423c64779e2SAndrii Nakryiko 	.key_type_id = 0,
424c64779e2SAndrii Nakryiko 	.value_type_id = 2,
425c64779e2SAndrii Nakryiko 	.max_entries = 1,
426c64779e2SAndrii Nakryiko 	.btf_load_err = true,
427c64779e2SAndrii Nakryiko 	.err_str = "Invalid type",
428c64779e2SAndrii Nakryiko },
429c64779e2SAndrii Nakryiko {
430c64779e2SAndrii Nakryiko 	.descr = "global data test #8, invalid var size",
431c64779e2SAndrii Nakryiko 	.raw_types = {
432c64779e2SAndrii Nakryiko 		/* int */
433c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
434c64779e2SAndrii Nakryiko 		/* unsigned long long */
435c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
436c64779e2SAndrii Nakryiko 		/* char */
437c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
438c64779e2SAndrii Nakryiko 		/* int[8] */
439c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
440c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
441c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
442c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
443c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
444c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
445c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
446c64779e2SAndrii Nakryiko 		/* } */
447c64779e2SAndrii Nakryiko 		/* static struct A t */
448c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
449c64779e2SAndrii Nakryiko 		/* .bss section */				/* [7] */
450c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 48),
451c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 0, 47),
452c64779e2SAndrii Nakryiko 		BTF_END_RAW,
453c64779e2SAndrii Nakryiko 	},
454c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0t\0.bss",
455c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
456c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
457c64779e2SAndrii Nakryiko 	.map_name = ".bss",
458c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
459c64779e2SAndrii Nakryiko 	.value_size = 48,
460c64779e2SAndrii Nakryiko 	.key_type_id = 0,
461c64779e2SAndrii Nakryiko 	.value_type_id = 7,
462c64779e2SAndrii Nakryiko 	.max_entries = 1,
463c64779e2SAndrii Nakryiko 	.btf_load_err = true,
464c64779e2SAndrii Nakryiko 	.err_str = "Invalid size",
465c64779e2SAndrii Nakryiko },
466c64779e2SAndrii Nakryiko {
467c64779e2SAndrii Nakryiko 	.descr = "global data test #9, invalid var size",
468c64779e2SAndrii Nakryiko 	.raw_types = {
469c64779e2SAndrii Nakryiko 		/* int */
470c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
471c64779e2SAndrii Nakryiko 		/* unsigned long long */
472c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
473c64779e2SAndrii Nakryiko 		/* char */
474c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
475c64779e2SAndrii Nakryiko 		/* int[8] */
476c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
477c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
478c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
479c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
480c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
481c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
482c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
483c64779e2SAndrii Nakryiko 		/* } */
484c64779e2SAndrii Nakryiko 		/* static struct A t */
485c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
486c64779e2SAndrii Nakryiko 		/* .bss section */				/* [7] */
487c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 46),
488c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 0, 48),
489c64779e2SAndrii Nakryiko 		BTF_END_RAW,
490c64779e2SAndrii Nakryiko 	},
491c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0t\0.bss",
492c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
493c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
494c64779e2SAndrii Nakryiko 	.map_name = ".bss",
495c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
496c64779e2SAndrii Nakryiko 	.value_size = 48,
497c64779e2SAndrii Nakryiko 	.key_type_id = 0,
498c64779e2SAndrii Nakryiko 	.value_type_id = 7,
499c64779e2SAndrii Nakryiko 	.max_entries = 1,
500c64779e2SAndrii Nakryiko 	.btf_load_err = true,
501c64779e2SAndrii Nakryiko 	.err_str = "Invalid size",
502c64779e2SAndrii Nakryiko },
503c64779e2SAndrii Nakryiko {
504c64779e2SAndrii Nakryiko 	.descr = "global data test #10, invalid var size",
505c64779e2SAndrii Nakryiko 	.raw_types = {
506c64779e2SAndrii Nakryiko 		/* int */
507c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
508c64779e2SAndrii Nakryiko 		/* unsigned long long */
509c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
510c64779e2SAndrii Nakryiko 		/* char */
511c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
512c64779e2SAndrii Nakryiko 		/* int[8] */
513c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
514c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
515c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
516c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
517c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
518c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
519c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
520c64779e2SAndrii Nakryiko 		/* } */
521c64779e2SAndrii Nakryiko 		/* static struct A t */
522c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
523c64779e2SAndrii Nakryiko 		/* .bss section */				/* [7] */
524c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 46),
525c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 0, 46),
526c64779e2SAndrii Nakryiko 		BTF_END_RAW,
527c64779e2SAndrii Nakryiko 	},
528c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0t\0.bss",
529c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0.bss"),
530c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
531c64779e2SAndrii Nakryiko 	.map_name = ".bss",
532c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
533c64779e2SAndrii Nakryiko 	.value_size = 48,
534c64779e2SAndrii Nakryiko 	.key_type_id = 0,
535c64779e2SAndrii Nakryiko 	.value_type_id = 7,
536c64779e2SAndrii Nakryiko 	.max_entries = 1,
537c64779e2SAndrii Nakryiko 	.btf_load_err = true,
538c64779e2SAndrii Nakryiko 	.err_str = "Invalid size",
539c64779e2SAndrii Nakryiko },
540c64779e2SAndrii Nakryiko {
541c64779e2SAndrii Nakryiko 	.descr = "global data test #11, multiple section members",
542c64779e2SAndrii Nakryiko 	.raw_types = {
543c64779e2SAndrii Nakryiko 		/* int */
544c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
545c64779e2SAndrii Nakryiko 		/* unsigned long long */
546c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
547c64779e2SAndrii Nakryiko 		/* char */
548c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
549c64779e2SAndrii Nakryiko 		/* int[8] */
550c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
551c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
552c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
553c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
554c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
555c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
556c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
557c64779e2SAndrii Nakryiko 		/* } */
558c64779e2SAndrii Nakryiko 		/* static struct A t */
559c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
560c64779e2SAndrii Nakryiko 		/* static int u */
561c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [7] */
562c64779e2SAndrii Nakryiko 		/* .bss section */				/* [8] */
563c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62),
564c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 10, 48),
565c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(7, 58, 4),
566c64779e2SAndrii Nakryiko 		BTF_END_RAW,
567c64779e2SAndrii Nakryiko 	},
568c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss",
569c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
570c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
571c64779e2SAndrii Nakryiko 	.map_name = ".bss",
572c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
573c64779e2SAndrii Nakryiko 	.value_size = 62,
574c64779e2SAndrii Nakryiko 	.key_type_id = 0,
575c64779e2SAndrii Nakryiko 	.value_type_id = 8,
576c64779e2SAndrii Nakryiko 	.max_entries = 1,
577c64779e2SAndrii Nakryiko },
578c64779e2SAndrii Nakryiko {
579c64779e2SAndrii Nakryiko 	.descr = "global data test #12, invalid offset",
580c64779e2SAndrii Nakryiko 	.raw_types = {
581c64779e2SAndrii Nakryiko 		/* int */
582c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
583c64779e2SAndrii Nakryiko 		/* unsigned long long */
584c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
585c64779e2SAndrii Nakryiko 		/* char */
586c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
587c64779e2SAndrii Nakryiko 		/* int[8] */
588c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
589c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
590c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
591c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
592c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
593c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
594c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
595c64779e2SAndrii Nakryiko 		/* } */
596c64779e2SAndrii Nakryiko 		/* static struct A t */
597c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
598c64779e2SAndrii Nakryiko 		/* static int u */
599c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [7] */
600c64779e2SAndrii Nakryiko 		/* .bss section */				/* [8] */
601c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62),
602c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 10, 48),
603c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(7, 60, 4),
604c64779e2SAndrii Nakryiko 		BTF_END_RAW,
605c64779e2SAndrii Nakryiko 	},
606c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss",
607c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
608c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
609c64779e2SAndrii Nakryiko 	.map_name = ".bss",
610c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
611c64779e2SAndrii Nakryiko 	.value_size = 62,
612c64779e2SAndrii Nakryiko 	.key_type_id = 0,
613c64779e2SAndrii Nakryiko 	.value_type_id = 8,
614c64779e2SAndrii Nakryiko 	.max_entries = 1,
615c64779e2SAndrii Nakryiko 	.btf_load_err = true,
616c64779e2SAndrii Nakryiko 	.err_str = "Invalid offset+size",
617c64779e2SAndrii Nakryiko },
618c64779e2SAndrii Nakryiko {
619c64779e2SAndrii Nakryiko 	.descr = "global data test #13, invalid offset",
620c64779e2SAndrii Nakryiko 	.raw_types = {
621c64779e2SAndrii Nakryiko 		/* int */
622c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
623c64779e2SAndrii Nakryiko 		/* unsigned long long */
624c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
625c64779e2SAndrii Nakryiko 		/* char */
626c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
627c64779e2SAndrii Nakryiko 		/* int[8] */
628c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
629c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
630c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
631c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
632c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
633c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
634c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
635c64779e2SAndrii Nakryiko 		/* } */
636c64779e2SAndrii Nakryiko 		/* static struct A t */
637c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
638c64779e2SAndrii Nakryiko 		/* static int u */
639c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [7] */
640c64779e2SAndrii Nakryiko 		/* .bss section */				/* [8] */
641c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62),
642c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 10, 48),
643c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(7, 12, 4),
644c64779e2SAndrii Nakryiko 		BTF_END_RAW,
645c64779e2SAndrii Nakryiko 	},
646c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss",
647c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
648c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
649c64779e2SAndrii Nakryiko 	.map_name = ".bss",
650c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
651c64779e2SAndrii Nakryiko 	.value_size = 62,
652c64779e2SAndrii Nakryiko 	.key_type_id = 0,
653c64779e2SAndrii Nakryiko 	.value_type_id = 8,
654c64779e2SAndrii Nakryiko 	.max_entries = 1,
655c64779e2SAndrii Nakryiko 	.btf_load_err = true,
656c64779e2SAndrii Nakryiko 	.err_str = "Invalid offset",
657c64779e2SAndrii Nakryiko },
658c64779e2SAndrii Nakryiko {
659c64779e2SAndrii Nakryiko 	.descr = "global data test #14, invalid offset",
660c64779e2SAndrii Nakryiko 	.raw_types = {
661c64779e2SAndrii Nakryiko 		/* int */
662c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
663c64779e2SAndrii Nakryiko 		/* unsigned long long */
664c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 64, 8),		/* [2] */
665c64779e2SAndrii Nakryiko 		/* char */
666c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),	/* [3] */
667c64779e2SAndrii Nakryiko 		/* int[8] */
668c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 8),			/* [4] */
669c64779e2SAndrii Nakryiko 		/* struct A { */				/* [5] */
670c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 4), 48),
671c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* unsigned long long m;*/
672c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 64),/* int n;		*/
673c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 96),/* char o;		*/
674c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 128),/* int p[8]		*/
675c64779e2SAndrii Nakryiko 		/* } */
676c64779e2SAndrii Nakryiko 		/* static struct A t */
677c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
678c64779e2SAndrii Nakryiko 		/* static int u */
679c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [7] */
680c64779e2SAndrii Nakryiko 		/* .bss section */				/* [8] */
681c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2), 62),
682c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(7, 58, 4),
683c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 10, 48),
684c64779e2SAndrii Nakryiko 		BTF_END_RAW,
685c64779e2SAndrii Nakryiko 	},
686c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n\0o\0p\0t\0u\0.bss",
687c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n\0o\0p\0t\0u\0.bss"),
688c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
689c64779e2SAndrii Nakryiko 	.map_name = ".bss",
690c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
691c64779e2SAndrii Nakryiko 	.value_size = 62,
692c64779e2SAndrii Nakryiko 	.key_type_id = 0,
693c64779e2SAndrii Nakryiko 	.value_type_id = 8,
694c64779e2SAndrii Nakryiko 	.max_entries = 1,
695c64779e2SAndrii Nakryiko 	.btf_load_err = true,
696c64779e2SAndrii Nakryiko 	.err_str = "Invalid offset",
697c64779e2SAndrii Nakryiko },
698c64779e2SAndrii Nakryiko {
699c64779e2SAndrii Nakryiko 	.descr = "global data test #15, not var kind",
700c64779e2SAndrii Nakryiko 	.raw_types = {
701c64779e2SAndrii Nakryiko 		/* int */
702c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
703c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
704c64779e2SAndrii Nakryiko 		/* .bss section */				/* [3] */
705c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
706c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(1, 0, 4),
707c64779e2SAndrii Nakryiko 		BTF_END_RAW,
708c64779e2SAndrii Nakryiko 	},
709c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0.bss",
710c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0.bss"),
711c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
712c64779e2SAndrii Nakryiko 	.map_name = ".bss",
713c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
714c64779e2SAndrii Nakryiko 	.value_size = 4,
715c64779e2SAndrii Nakryiko 	.key_type_id = 0,
716c64779e2SAndrii Nakryiko 	.value_type_id = 3,
717c64779e2SAndrii Nakryiko 	.max_entries = 1,
718c64779e2SAndrii Nakryiko 	.btf_load_err = true,
719c64779e2SAndrii Nakryiko 	.err_str = "Not a VAR kind member",
720c64779e2SAndrii Nakryiko },
721c64779e2SAndrii Nakryiko {
722c64779e2SAndrii Nakryiko 	.descr = "global data test #16, invalid var referencing sec",
723c64779e2SAndrii Nakryiko 	.raw_types = {
724c64779e2SAndrii Nakryiko 		/* int */
725c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
726c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [2] */
727c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 2, 0),			/* [3] */
728c64779e2SAndrii Nakryiko 		/* a section */					/* [4] */
729c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
730c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(3, 0, 4),
731c64779e2SAndrii Nakryiko 		/* a section */					/* [5] */
732c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
733c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(6, 0, 4),
734c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [6] */
735c64779e2SAndrii Nakryiko 		BTF_END_RAW,
736c64779e2SAndrii Nakryiko 	},
737c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0s\0a\0a",
738c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
739c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
740c64779e2SAndrii Nakryiko 	.map_name = ".bss",
741c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
742c64779e2SAndrii Nakryiko 	.value_size = 4,
743c64779e2SAndrii Nakryiko 	.key_type_id = 0,
744c64779e2SAndrii Nakryiko 	.value_type_id = 4,
745c64779e2SAndrii Nakryiko 	.max_entries = 1,
746c64779e2SAndrii Nakryiko 	.btf_load_err = true,
747c64779e2SAndrii Nakryiko 	.err_str = "Invalid type_id",
748c64779e2SAndrii Nakryiko },
749c64779e2SAndrii Nakryiko {
750c64779e2SAndrii Nakryiko 	.descr = "global data test #17, invalid var referencing var",
751c64779e2SAndrii Nakryiko 	.raw_types = {
752c64779e2SAndrii Nakryiko 		/* int */
753c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
754c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
755c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 2, 0),			/* [3] */
756c64779e2SAndrii Nakryiko 		/* a section */					/* [4] */
757c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
758c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(3, 0, 4),
759c64779e2SAndrii Nakryiko 		BTF_END_RAW,
760c64779e2SAndrii Nakryiko 	},
761c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0s\0a\0a",
762c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
763c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
764c64779e2SAndrii Nakryiko 	.map_name = ".bss",
765c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
766c64779e2SAndrii Nakryiko 	.value_size = 4,
767c64779e2SAndrii Nakryiko 	.key_type_id = 0,
768c64779e2SAndrii Nakryiko 	.value_type_id = 4,
769c64779e2SAndrii Nakryiko 	.max_entries = 1,
770c64779e2SAndrii Nakryiko 	.btf_load_err = true,
771c64779e2SAndrii Nakryiko 	.err_str = "Invalid type_id",
772c64779e2SAndrii Nakryiko },
773c64779e2SAndrii Nakryiko {
774c64779e2SAndrii Nakryiko 	.descr = "global data test #18, invalid var loop",
775c64779e2SAndrii Nakryiko 	.raw_types = {
776c64779e2SAndrii Nakryiko 		/* int */
777c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
778c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 2, 0),			/* [2] */
779c64779e2SAndrii Nakryiko 		/* .bss section */				/* [3] */
780c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
781c64779e2SAndrii Nakryiko 		BTF_VAR_SECINFO_ENC(2, 0, 4),
782c64779e2SAndrii Nakryiko 		BTF_END_RAW,
783c64779e2SAndrii Nakryiko 	},
784c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0aaa",
785c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0aaa"),
786c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
787c64779e2SAndrii Nakryiko 	.map_name = ".bss",
788c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
789c64779e2SAndrii Nakryiko 	.value_size = 4,
790c64779e2SAndrii Nakryiko 	.key_type_id = 0,
791c64779e2SAndrii Nakryiko 	.value_type_id = 4,
792c64779e2SAndrii Nakryiko 	.max_entries = 1,
793c64779e2SAndrii Nakryiko 	.btf_load_err = true,
794c64779e2SAndrii Nakryiko 	.err_str = "Invalid type_id",
795c64779e2SAndrii Nakryiko },
796c64779e2SAndrii Nakryiko {
797c64779e2SAndrii Nakryiko 	.descr = "global data test #19, invalid var referencing var",
798c64779e2SAndrii Nakryiko 	.raw_types = {
799c64779e2SAndrii Nakryiko 		/* int */
800c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
801c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 3, 0),			/* [2] */
802c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [3] */
803c64779e2SAndrii Nakryiko 		BTF_END_RAW,
804c64779e2SAndrii Nakryiko 	},
805c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0s\0a\0a",
806c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
807c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
808c64779e2SAndrii Nakryiko 	.map_name = ".bss",
809c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
810c64779e2SAndrii Nakryiko 	.value_size = 4,
811c64779e2SAndrii Nakryiko 	.key_type_id = 0,
812c64779e2SAndrii Nakryiko 	.value_type_id = 4,
813c64779e2SAndrii Nakryiko 	.max_entries = 1,
814c64779e2SAndrii Nakryiko 	.btf_load_err = true,
815c64779e2SAndrii Nakryiko 	.err_str = "Invalid type_id",
816c64779e2SAndrii Nakryiko },
817c64779e2SAndrii Nakryiko {
818c64779e2SAndrii Nakryiko 	.descr = "global data test #20, invalid ptr referencing var",
819c64779e2SAndrii Nakryiko 	.raw_types = {
820c64779e2SAndrii Nakryiko 		/* int */
821c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
822c64779e2SAndrii Nakryiko 		/* PTR type_id=3	*/			/* [2] */
823c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 3),
824c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [3] */
825c64779e2SAndrii Nakryiko 		BTF_END_RAW,
826c64779e2SAndrii Nakryiko 	},
827c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0s\0a\0a",
828c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
829c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
830c64779e2SAndrii Nakryiko 	.map_name = ".bss",
831c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
832c64779e2SAndrii Nakryiko 	.value_size = 4,
833c64779e2SAndrii Nakryiko 	.key_type_id = 0,
834c64779e2SAndrii Nakryiko 	.value_type_id = 4,
835c64779e2SAndrii Nakryiko 	.max_entries = 1,
836c64779e2SAndrii Nakryiko 	.btf_load_err = true,
837c64779e2SAndrii Nakryiko 	.err_str = "Invalid type_id",
838c64779e2SAndrii Nakryiko },
839c64779e2SAndrii Nakryiko {
840c64779e2SAndrii Nakryiko 	.descr = "global data test #21, var included in struct",
841c64779e2SAndrii Nakryiko 	.raw_types = {
842c64779e2SAndrii Nakryiko 		/* int */
843c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
844c64779e2SAndrii Nakryiko 		/* struct A { */				/* [2] */
845c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2),
846c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
847c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 32),/* VAR type_id=3; */
848c64779e2SAndrii Nakryiko 		/* } */
849c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [3] */
850c64779e2SAndrii Nakryiko 		BTF_END_RAW,
851c64779e2SAndrii Nakryiko 	},
852c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0s\0a\0a",
853c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
854c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
855c64779e2SAndrii Nakryiko 	.map_name = ".bss",
856c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
857c64779e2SAndrii Nakryiko 	.value_size = 4,
858c64779e2SAndrii Nakryiko 	.key_type_id = 0,
859c64779e2SAndrii Nakryiko 	.value_type_id = 4,
860c64779e2SAndrii Nakryiko 	.max_entries = 1,
861c64779e2SAndrii Nakryiko 	.btf_load_err = true,
862c64779e2SAndrii Nakryiko 	.err_str = "Invalid member",
863c64779e2SAndrii Nakryiko },
864c64779e2SAndrii Nakryiko {
865c64779e2SAndrii Nakryiko 	.descr = "global data test #22, array of var",
866c64779e2SAndrii Nakryiko 	.raw_types = {
867c64779e2SAndrii Nakryiko 		/* int */
868c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
869c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 4),			/* [2] */
870c64779e2SAndrii Nakryiko 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [3] */
871c64779e2SAndrii Nakryiko 		BTF_END_RAW,
872c64779e2SAndrii Nakryiko 	},
873c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0t\0s\0a\0a",
874c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0t\0s\0a\0a"),
875c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
876c64779e2SAndrii Nakryiko 	.map_name = ".bss",
877c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
878c64779e2SAndrii Nakryiko 	.value_size = 4,
879c64779e2SAndrii Nakryiko 	.key_type_id = 0,
880c64779e2SAndrii Nakryiko 	.value_type_id = 4,
881c64779e2SAndrii Nakryiko 	.max_entries = 1,
882c64779e2SAndrii Nakryiko 	.btf_load_err = true,
883c64779e2SAndrii Nakryiko 	.err_str = "Invalid elem",
884c64779e2SAndrii Nakryiko },
885c64779e2SAndrii Nakryiko /* Test member exceeds the size of struct.
886c64779e2SAndrii Nakryiko  *
887c64779e2SAndrii Nakryiko  * struct A {
888c64779e2SAndrii Nakryiko  *     int m;
889c64779e2SAndrii Nakryiko  *     int n;
890c64779e2SAndrii Nakryiko  * };
891c64779e2SAndrii Nakryiko  */
892c64779e2SAndrii Nakryiko {
893c64779e2SAndrii Nakryiko 	.descr = "size check test #1",
894c64779e2SAndrii Nakryiko 	.raw_types = {
895c64779e2SAndrii Nakryiko 		/* int */					/* [1] */
896c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
897c64779e2SAndrii Nakryiko 		/* struct A { */				/* [2] */
898c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2 -  1),
899c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
900c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),/* int n; */
901c64779e2SAndrii Nakryiko 		/* } */
902c64779e2SAndrii Nakryiko 		BTF_END_RAW,
903c64779e2SAndrii Nakryiko 	},
904c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n",
905c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n"),
906c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
907c64779e2SAndrii Nakryiko 	.map_name = "size_check1_map",
908c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
909c64779e2SAndrii Nakryiko 	.value_size = 1,
910c64779e2SAndrii Nakryiko 	.key_type_id = 1,
911c64779e2SAndrii Nakryiko 	.value_type_id = 2,
912c64779e2SAndrii Nakryiko 	.max_entries = 4,
913c64779e2SAndrii Nakryiko 	.btf_load_err = true,
914c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
915c64779e2SAndrii Nakryiko },
916c64779e2SAndrii Nakryiko 
917443edcefSJunlin Yang /* Test member exceeds the size of struct
918c64779e2SAndrii Nakryiko  *
919c64779e2SAndrii Nakryiko  * struct A {
920c64779e2SAndrii Nakryiko  *     int m;
921c64779e2SAndrii Nakryiko  *     int n[2];
922c64779e2SAndrii Nakryiko  * };
923c64779e2SAndrii Nakryiko  */
924c64779e2SAndrii Nakryiko {
925c64779e2SAndrii Nakryiko 	.descr = "size check test #2",
926c64779e2SAndrii Nakryiko 	.raw_types = {
927c64779e2SAndrii Nakryiko 		/* int */					/* [1] */
928c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
929c64779e2SAndrii Nakryiko 		/* int[2] */					/* [2] */
930c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 2),
931c64779e2SAndrii Nakryiko 		/* struct A { */				/* [3] */
932c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 3 - 1),
933c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
934c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* int n[2]; */
935c64779e2SAndrii Nakryiko 		/* } */
936c64779e2SAndrii Nakryiko 		BTF_END_RAW,
937c64779e2SAndrii Nakryiko 	},
938c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n",
939c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n"),
940c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
941c64779e2SAndrii Nakryiko 	.map_name = "size_check2_map",
942c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
943c64779e2SAndrii Nakryiko 	.value_size = 1,
944c64779e2SAndrii Nakryiko 	.key_type_id = 1,
945c64779e2SAndrii Nakryiko 	.value_type_id = 3,
946c64779e2SAndrii Nakryiko 	.max_entries = 4,
947c64779e2SAndrii Nakryiko 	.btf_load_err = true,
948c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
949c64779e2SAndrii Nakryiko },
950c64779e2SAndrii Nakryiko 
951443edcefSJunlin Yang /* Test member exceeds the size of struct
952c64779e2SAndrii Nakryiko  *
953c64779e2SAndrii Nakryiko  * struct A {
954c64779e2SAndrii Nakryiko  *     int m;
955c64779e2SAndrii Nakryiko  *     void *n;
956c64779e2SAndrii Nakryiko  * };
957c64779e2SAndrii Nakryiko  */
958c64779e2SAndrii Nakryiko {
959c64779e2SAndrii Nakryiko 	.descr = "size check test #3",
960c64779e2SAndrii Nakryiko 	.raw_types = {
961c64779e2SAndrii Nakryiko 		/* int */					/* [1] */
962c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
963c64779e2SAndrii Nakryiko 		/* void* */					/* [2] */
964c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
965c64779e2SAndrii Nakryiko 		/* struct A { */				/* [3] */
966c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) + sizeof(void *) - 1),
967c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
968c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* void *n; */
969c64779e2SAndrii Nakryiko 		/* } */
970c64779e2SAndrii Nakryiko 		BTF_END_RAW,
971c64779e2SAndrii Nakryiko 	},
972c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n",
973c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n"),
974c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
975c64779e2SAndrii Nakryiko 	.map_name = "size_check3_map",
976c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
977c64779e2SAndrii Nakryiko 	.value_size = 1,
978c64779e2SAndrii Nakryiko 	.key_type_id = 1,
979c64779e2SAndrii Nakryiko 	.value_type_id = 3,
980c64779e2SAndrii Nakryiko 	.max_entries = 4,
981c64779e2SAndrii Nakryiko 	.btf_load_err = true,
982c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
983c64779e2SAndrii Nakryiko },
984c64779e2SAndrii Nakryiko 
985c64779e2SAndrii Nakryiko /* Test member exceeds the size of struct
986c64779e2SAndrii Nakryiko  *
987c64779e2SAndrii Nakryiko  * enum E {
988c64779e2SAndrii Nakryiko  *     E0,
989c64779e2SAndrii Nakryiko  *     E1,
990c64779e2SAndrii Nakryiko  * };
991c64779e2SAndrii Nakryiko  *
992c64779e2SAndrii Nakryiko  * struct A {
993c64779e2SAndrii Nakryiko  *     int m;
994c64779e2SAndrii Nakryiko  *     enum E n;
995c64779e2SAndrii Nakryiko  * };
996c64779e2SAndrii Nakryiko  */
997c64779e2SAndrii Nakryiko {
998c64779e2SAndrii Nakryiko 	.descr = "size check test #4",
999c64779e2SAndrii Nakryiko 	.raw_types = {
1000c64779e2SAndrii Nakryiko 		/* int */			/* [1] */
1001c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
1002c64779e2SAndrii Nakryiko 		/* enum E { */			/* [2] */
1003c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), sizeof(int)),
1004c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
1005c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
1006c64779e2SAndrii Nakryiko 		/* } */
1007c64779e2SAndrii Nakryiko 		/* struct A { */		/* [3] */
1008c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2 - 1),
1009c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
1010c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* enum E n; */
1011c64779e2SAndrii Nakryiko 		/* } */
1012c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1013c64779e2SAndrii Nakryiko 	},
1014c64779e2SAndrii Nakryiko 	.str_sec = "\0E\0E0\0E1\0A\0m\0n",
1015c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"),
1016c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1017c64779e2SAndrii Nakryiko 	.map_name = "size_check4_map",
1018c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1019c64779e2SAndrii Nakryiko 	.value_size = 1,
1020c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1021c64779e2SAndrii Nakryiko 	.value_type_id = 3,
1022c64779e2SAndrii Nakryiko 	.max_entries = 4,
1023c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1024c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
1025c64779e2SAndrii Nakryiko },
1026c64779e2SAndrii Nakryiko 
1027c64779e2SAndrii Nakryiko /* Test member unexceeds the size of struct
1028c64779e2SAndrii Nakryiko  *
1029c64779e2SAndrii Nakryiko  * enum E {
1030c64779e2SAndrii Nakryiko  *     E0,
1031c64779e2SAndrii Nakryiko  *     E1,
1032c64779e2SAndrii Nakryiko  * };
1033c64779e2SAndrii Nakryiko  *
1034c64779e2SAndrii Nakryiko  * struct A {
1035c64779e2SAndrii Nakryiko  *     char m;
1036c64779e2SAndrii Nakryiko  *     enum E __attribute__((packed)) n;
1037c64779e2SAndrii Nakryiko  * };
1038c64779e2SAndrii Nakryiko  */
1039c64779e2SAndrii Nakryiko {
1040c64779e2SAndrii Nakryiko 	.descr = "size check test #5",
1041c64779e2SAndrii Nakryiko 	.raw_types = {
1042c64779e2SAndrii Nakryiko 		/* int */			/* [1] */
1043c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
1044c64779e2SAndrii Nakryiko 		/* char */			/* [2] */
1045c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),
1046c64779e2SAndrii Nakryiko 		/* enum E { */			/* [3] */
1047c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 1),
1048c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
1049c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
1050c64779e2SAndrii Nakryiko 		/* } */
1051c64779e2SAndrii Nakryiko 		/* struct A { */		/* [4] */
1052c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 2),
1053c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* char m; */
1054c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 8),/* enum E __attribute__((packed)) n; */
1055c64779e2SAndrii Nakryiko 		/* } */
1056c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1057c64779e2SAndrii Nakryiko 	},
1058c64779e2SAndrii Nakryiko 	.str_sec = "\0E\0E0\0E1\0A\0m\0n",
1059c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"),
1060c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1061c64779e2SAndrii Nakryiko 	.map_name = "size_check5_map",
1062c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1063c64779e2SAndrii Nakryiko 	.value_size = 2,
1064c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1065c64779e2SAndrii Nakryiko 	.value_type_id = 4,
1066c64779e2SAndrii Nakryiko 	.max_entries = 4,
1067c64779e2SAndrii Nakryiko },
1068c64779e2SAndrii Nakryiko 
1069c64779e2SAndrii Nakryiko /* typedef const void * const_void_ptr;
1070c64779e2SAndrii Nakryiko  * struct A {
1071c64779e2SAndrii Nakryiko  *	const_void_ptr m;
1072c64779e2SAndrii Nakryiko  * };
1073c64779e2SAndrii Nakryiko  */
1074c64779e2SAndrii Nakryiko {
1075c64779e2SAndrii Nakryiko 	.descr = "void test #1",
1076c64779e2SAndrii Nakryiko 	.raw_types = {
1077c64779e2SAndrii Nakryiko 		/* int */		/* [1] */
1078c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1079c64779e2SAndrii Nakryiko 		/* const void */	/* [2] */
1080c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1081c64779e2SAndrii Nakryiko 		/* const void* */	/* [3] */
1082c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),
1083c64779e2SAndrii Nakryiko 		/* typedef const void * const_void_ptr */
1084c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),	/* [4] */
1085c64779e2SAndrii Nakryiko 		/* struct A { */	/* [5] */
1086c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1087c64779e2SAndrii Nakryiko 		/* const_void_ptr m; */
1088c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 0),
1089c64779e2SAndrii Nakryiko 		/* } */
1090c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1091c64779e2SAndrii Nakryiko 	},
1092c64779e2SAndrii Nakryiko 	.str_sec = "\0const_void_ptr\0A\0m",
1093c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0const_void_ptr\0A\0m"),
1094c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1095c64779e2SAndrii Nakryiko 	.map_name = "void_test1_map",
1096c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1097c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *),
1098c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1099c64779e2SAndrii Nakryiko 	.value_type_id = 4,
1100c64779e2SAndrii Nakryiko 	.max_entries = 4,
1101c64779e2SAndrii Nakryiko },
1102c64779e2SAndrii Nakryiko 
1103c64779e2SAndrii Nakryiko /* struct A {
1104c64779e2SAndrii Nakryiko  *     const void m;
1105c64779e2SAndrii Nakryiko  * };
1106c64779e2SAndrii Nakryiko  */
1107c64779e2SAndrii Nakryiko {
1108c64779e2SAndrii Nakryiko 	.descr = "void test #2",
1109c64779e2SAndrii Nakryiko 	.raw_types = {
1110c64779e2SAndrii Nakryiko 		/* int */		/* [1] */
1111c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1112c64779e2SAndrii Nakryiko 		/* const void */	/* [2] */
1113c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1114c64779e2SAndrii Nakryiko 		/* struct A { */	/* [3] */
1115c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 8),
1116c64779e2SAndrii Nakryiko 		/* const void m; */
1117c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
1118c64779e2SAndrii Nakryiko 		/* } */
1119c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1120c64779e2SAndrii Nakryiko 	},
1121c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m",
1122c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m"),
1123c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1124c64779e2SAndrii Nakryiko 	.map_name = "void_test2_map",
1125c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1126c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *),
1127c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1128c64779e2SAndrii Nakryiko 	.value_type_id = 3,
1129c64779e2SAndrii Nakryiko 	.max_entries = 4,
1130c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1131c64779e2SAndrii Nakryiko 	.err_str = "Invalid member",
1132c64779e2SAndrii Nakryiko },
1133c64779e2SAndrii Nakryiko 
1134c64779e2SAndrii Nakryiko /* typedef const void * const_void_ptr;
1135c64779e2SAndrii Nakryiko  * const_void_ptr[4]
1136c64779e2SAndrii Nakryiko  */
1137c64779e2SAndrii Nakryiko {
1138c64779e2SAndrii Nakryiko 	.descr = "void test #3",
1139c64779e2SAndrii Nakryiko 	.raw_types = {
1140c64779e2SAndrii Nakryiko 		/* int */		/* [1] */
1141c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1142c64779e2SAndrii Nakryiko 		/* const void */	/* [2] */
1143c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1144c64779e2SAndrii Nakryiko 		/* const void* */	/* [3] */
1145c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),
1146c64779e2SAndrii Nakryiko 		/* typedef const void * const_void_ptr */
1147c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),	/* [4] */
1148c64779e2SAndrii Nakryiko 		/* const_void_ptr[4] */
1149c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(4, 1, 4),	/* [5] */
1150c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1151c64779e2SAndrii Nakryiko 	},
1152c64779e2SAndrii Nakryiko 	.str_sec = "\0const_void_ptr",
1153c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0const_void_ptr"),
1154c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1155c64779e2SAndrii Nakryiko 	.map_name = "void_test3_map",
1156c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1157c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *) * 4,
1158c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1159c64779e2SAndrii Nakryiko 	.value_type_id = 5,
1160c64779e2SAndrii Nakryiko 	.max_entries = 4,
1161c64779e2SAndrii Nakryiko },
1162c64779e2SAndrii Nakryiko 
1163c64779e2SAndrii Nakryiko /* const void[4]  */
1164c64779e2SAndrii Nakryiko {
1165c64779e2SAndrii Nakryiko 	.descr = "void test #4",
1166c64779e2SAndrii Nakryiko 	.raw_types = {
1167c64779e2SAndrii Nakryiko 		/* int */		/* [1] */
1168c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1169c64779e2SAndrii Nakryiko 		/* const void */	/* [2] */
1170c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1171c64779e2SAndrii Nakryiko 		/* const void[4] */	/* [3] */
1172c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 4),
1173c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1174c64779e2SAndrii Nakryiko 	},
1175c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m",
1176c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m"),
1177c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1178c64779e2SAndrii Nakryiko 	.map_name = "void_test4_map",
1179c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1180c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *) * 4,
1181c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1182c64779e2SAndrii Nakryiko 	.value_type_id = 3,
1183c64779e2SAndrii Nakryiko 	.max_entries = 4,
1184c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1185c64779e2SAndrii Nakryiko 	.err_str = "Invalid elem",
1186c64779e2SAndrii Nakryiko },
1187c64779e2SAndrii Nakryiko 
1188c64779e2SAndrii Nakryiko /* Array_A  <------------------+
1189c64779e2SAndrii Nakryiko  *     elem_type == Array_B    |
1190c64779e2SAndrii Nakryiko  *                    |        |
1191c64779e2SAndrii Nakryiko  *                    |        |
1192c64779e2SAndrii Nakryiko  * Array_B  <-------- +        |
1193c64779e2SAndrii Nakryiko  *      elem_type == Array A --+
1194c64779e2SAndrii Nakryiko  */
1195c64779e2SAndrii Nakryiko {
1196c64779e2SAndrii Nakryiko 	.descr = "loop test #1",
1197c64779e2SAndrii Nakryiko 	.raw_types = {
1198c64779e2SAndrii Nakryiko 		/* int */			/* [1] */
1199c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1200c64779e2SAndrii Nakryiko 		/* Array_A */			/* [2] */
1201c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 8),
1202c64779e2SAndrii Nakryiko 		/* Array_B */			/* [3] */
1203c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 8),
1204c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1205c64779e2SAndrii Nakryiko 	},
1206c64779e2SAndrii Nakryiko 	.str_sec = "",
1207c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1208c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1209c64779e2SAndrii Nakryiko 	.map_name = "loop_test1_map",
1210c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1211c64779e2SAndrii Nakryiko 	.value_size = sizeof(sizeof(int) * 8),
1212c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1213c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1214c64779e2SAndrii Nakryiko 	.max_entries = 4,
1215c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1216c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1217c64779e2SAndrii Nakryiko },
1218c64779e2SAndrii Nakryiko 
1219c64779e2SAndrii Nakryiko /* typedef is _before_ the BTF type of Array_A and Array_B
1220c64779e2SAndrii Nakryiko  *
1221c64779e2SAndrii Nakryiko  * typedef Array_B int_array;
1222c64779e2SAndrii Nakryiko  *
1223c64779e2SAndrii Nakryiko  * Array_A  <------------------+
1224c64779e2SAndrii Nakryiko  *     elem_type == int_array  |
1225c64779e2SAndrii Nakryiko  *                    |        |
1226c64779e2SAndrii Nakryiko  *                    |        |
1227c64779e2SAndrii Nakryiko  * Array_B  <-------- +        |
1228c64779e2SAndrii Nakryiko  *      elem_type == Array_A --+
1229c64779e2SAndrii Nakryiko  */
1230c64779e2SAndrii Nakryiko {
1231c64779e2SAndrii Nakryiko 	.descr = "loop test #2",
1232c64779e2SAndrii Nakryiko 	.raw_types = {
1233c64779e2SAndrii Nakryiko 		/* int */
1234c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1235c64779e2SAndrii Nakryiko 		/* typedef Array_B int_array */
1236c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(1, 4),				/* [2] */
1237c64779e2SAndrii Nakryiko 		/* Array_A */
1238c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 8),			/* [3] */
1239c64779e2SAndrii Nakryiko 		/* Array_B */
1240c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 8),			/* [4] */
1241c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1242c64779e2SAndrii Nakryiko 	},
1243c64779e2SAndrii Nakryiko 	.str_sec = "\0int_array\0",
1244c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int_array"),
1245c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1246c64779e2SAndrii Nakryiko 	.map_name = "loop_test2_map",
1247c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1248c64779e2SAndrii Nakryiko 	.value_size = sizeof(sizeof(int) * 8),
1249c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1250c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1251c64779e2SAndrii Nakryiko 	.max_entries = 4,
1252c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1253c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1254c64779e2SAndrii Nakryiko },
1255c64779e2SAndrii Nakryiko 
1256c64779e2SAndrii Nakryiko /* Array_A  <------------------+
1257c64779e2SAndrii Nakryiko  *     elem_type == Array_B    |
1258c64779e2SAndrii Nakryiko  *                    |        |
1259c64779e2SAndrii Nakryiko  *                    |        |
1260c64779e2SAndrii Nakryiko  * Array_B  <-------- +        |
1261c64779e2SAndrii Nakryiko  *      elem_type == Array_A --+
1262c64779e2SAndrii Nakryiko  */
1263c64779e2SAndrii Nakryiko {
1264c64779e2SAndrii Nakryiko 	.descr = "loop test #3",
1265c64779e2SAndrii Nakryiko 	.raw_types = {
1266c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1267c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1268c64779e2SAndrii Nakryiko 		/* Array_A */				/* [2] */
1269c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 8),
1270c64779e2SAndrii Nakryiko 		/* Array_B */				/* [3] */
1271c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 8),
1272c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1273c64779e2SAndrii Nakryiko 	},
1274c64779e2SAndrii Nakryiko 	.str_sec = "",
1275c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1276c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1277c64779e2SAndrii Nakryiko 	.map_name = "loop_test3_map",
1278c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1279c64779e2SAndrii Nakryiko 	.value_size = sizeof(sizeof(int) * 8),
1280c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1281c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1282c64779e2SAndrii Nakryiko 	.max_entries = 4,
1283c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1284c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1285c64779e2SAndrii Nakryiko },
1286c64779e2SAndrii Nakryiko 
1287c64779e2SAndrii Nakryiko /* typedef is _between_ the BTF type of Array_A and Array_B
1288c64779e2SAndrii Nakryiko  *
1289c64779e2SAndrii Nakryiko  * typedef Array_B int_array;
1290c64779e2SAndrii Nakryiko  *
1291c64779e2SAndrii Nakryiko  * Array_A  <------------------+
1292c64779e2SAndrii Nakryiko  *     elem_type == int_array  |
1293c64779e2SAndrii Nakryiko  *                    |        |
1294c64779e2SAndrii Nakryiko  *                    |        |
1295c64779e2SAndrii Nakryiko  * Array_B  <-------- +        |
1296c64779e2SAndrii Nakryiko  *      elem_type == Array_A --+
1297c64779e2SAndrii Nakryiko  */
1298c64779e2SAndrii Nakryiko {
1299c64779e2SAndrii Nakryiko 	.descr = "loop test #4",
1300c64779e2SAndrii Nakryiko 	.raw_types = {
1301c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1302c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1303c64779e2SAndrii Nakryiko 		/* Array_A */				/* [2] */
1304c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 8),
1305c64779e2SAndrii Nakryiko 		/* typedef Array_B int_array */		/* [3] */
1306c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),
1307c64779e2SAndrii Nakryiko 		/* Array_B */				/* [4] */
1308c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 8),
1309c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1310c64779e2SAndrii Nakryiko 	},
1311c64779e2SAndrii Nakryiko 	.str_sec = "\0int_array\0",
1312c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int_array"),
1313c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1314c64779e2SAndrii Nakryiko 	.map_name = "loop_test4_map",
1315c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1316c64779e2SAndrii Nakryiko 	.value_size = sizeof(sizeof(int) * 8),
1317c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1318c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1319c64779e2SAndrii Nakryiko 	.max_entries = 4,
1320c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1321c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1322c64779e2SAndrii Nakryiko },
1323c64779e2SAndrii Nakryiko 
1324c64779e2SAndrii Nakryiko /* typedef struct B Struct_B
1325c64779e2SAndrii Nakryiko  *
1326c64779e2SAndrii Nakryiko  * struct A {
1327c64779e2SAndrii Nakryiko  *     int x;
1328c64779e2SAndrii Nakryiko  *     Struct_B y;
1329c64779e2SAndrii Nakryiko  * };
1330c64779e2SAndrii Nakryiko  *
1331c64779e2SAndrii Nakryiko  * struct B {
1332c64779e2SAndrii Nakryiko  *     int x;
1333c64779e2SAndrii Nakryiko  *     struct A y;
1334c64779e2SAndrii Nakryiko  * };
1335c64779e2SAndrii Nakryiko  */
1336c64779e2SAndrii Nakryiko {
1337c64779e2SAndrii Nakryiko 	.descr = "loop test #5",
1338c64779e2SAndrii Nakryiko 	.raw_types = {
1339c64779e2SAndrii Nakryiko 		/* int */
1340c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1341c64779e2SAndrii Nakryiko 		/* struct A */					/* [2] */
1342c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1343c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int x;	*/
1344c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 32),/* Struct_B y;	*/
1345c64779e2SAndrii Nakryiko 		/* typedef struct B Struct_B */
1346c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
1347c64779e2SAndrii Nakryiko 		/* struct B */					/* [4] */
1348c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1349c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int x;	*/
1350c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct A y;	*/
1351c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1352c64779e2SAndrii Nakryiko 	},
1353c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0x\0y\0Struct_B\0B\0x\0y",
1354c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0x\0y\0Struct_B\0B\0x\0y"),
1355c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1356c64779e2SAndrii Nakryiko 	.map_name = "loop_test5_map",
1357c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1358c64779e2SAndrii Nakryiko 	.value_size = 8,
1359c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1360c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1361c64779e2SAndrii Nakryiko 	.max_entries = 4,
1362c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1363c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1364c64779e2SAndrii Nakryiko },
1365c64779e2SAndrii Nakryiko 
1366c64779e2SAndrii Nakryiko /* struct A {
1367c64779e2SAndrii Nakryiko  *     int x;
1368c64779e2SAndrii Nakryiko  *     struct A array_a[4];
1369c64779e2SAndrii Nakryiko  * };
1370c64779e2SAndrii Nakryiko  */
1371c64779e2SAndrii Nakryiko {
1372c64779e2SAndrii Nakryiko 	.descr = "loop test #6",
1373c64779e2SAndrii Nakryiko 	.raw_types = {
1374c64779e2SAndrii Nakryiko 		/* int */
1375c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1376c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 4),			/* [2] */
1377c64779e2SAndrii Nakryiko 		/* struct A */					/* [3] */
1378c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1379c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int x;		*/
1380c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct A array_a[4];	*/
1381c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1382c64779e2SAndrii Nakryiko 	},
1383c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0x\0y",
1384c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0x\0y"),
1385c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1386c64779e2SAndrii Nakryiko 	.map_name = "loop_test6_map",
1387c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1388c64779e2SAndrii Nakryiko 	.value_size = 8,
1389c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1390c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1391c64779e2SAndrii Nakryiko 	.max_entries = 4,
1392c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1393c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1394c64779e2SAndrii Nakryiko },
1395c64779e2SAndrii Nakryiko 
1396c64779e2SAndrii Nakryiko {
1397c64779e2SAndrii Nakryiko 	.descr = "loop test #7",
1398c64779e2SAndrii Nakryiko 	.raw_types = {
1399c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1400c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1401c64779e2SAndrii Nakryiko 		/* struct A { */			/* [2] */
1402c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1403c64779e2SAndrii Nakryiko 		/*     const void *m;	*/
1404c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 0),
1405c64779e2SAndrii Nakryiko 		/* CONST type_id=3	*/		/* [3] */
1406c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1407c64779e2SAndrii Nakryiko 		/* PTR type_id=2	*/		/* [4] */
1408c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 3),
1409c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1410c64779e2SAndrii Nakryiko 	},
1411c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m",
1412c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m"),
1413c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1414c64779e2SAndrii Nakryiko 	.map_name = "loop_test7_map",
1415c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1416c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *),
1417c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1418c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1419c64779e2SAndrii Nakryiko 	.max_entries = 4,
1420c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1421c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1422c64779e2SAndrii Nakryiko },
1423c64779e2SAndrii Nakryiko 
1424c64779e2SAndrii Nakryiko {
1425c64779e2SAndrii Nakryiko 	.descr = "loop test #8",
1426c64779e2SAndrii Nakryiko 	.raw_types = {
1427c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1428c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1429c64779e2SAndrii Nakryiko 		/* struct A { */			/* [2] */
1430c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1431c64779e2SAndrii Nakryiko 		/*     const void *m;	*/
1432c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 0),
1433c64779e2SAndrii Nakryiko 		/* struct B { */			/* [3] */
1434c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1435c64779e2SAndrii Nakryiko 		/*     const void *n;	*/
1436c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 0),
1437c64779e2SAndrii Nakryiko 		/* CONST type_id=5	*/		/* [4] */
1438c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 5),
1439c64779e2SAndrii Nakryiko 		/* PTR type_id=6	*/		/* [5] */
1440c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 6),
1441c64779e2SAndrii Nakryiko 		/* CONST type_id=7	*/		/* [6] */
1442c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 7),
1443c64779e2SAndrii Nakryiko 		/* PTR type_id=4	*/		/* [7] */
1444c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 4),
1445c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1446c64779e2SAndrii Nakryiko 	},
1447c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0B\0n",
1448c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0B\0n"),
1449c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1450c64779e2SAndrii Nakryiko 	.map_name = "loop_test8_map",
1451c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1452c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *),
1453c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1454c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1455c64779e2SAndrii Nakryiko 	.max_entries = 4,
1456c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1457c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1458c64779e2SAndrii Nakryiko },
1459c64779e2SAndrii Nakryiko 
1460c64779e2SAndrii Nakryiko {
1461c64779e2SAndrii Nakryiko 	.descr = "string section does not end with null",
1462c64779e2SAndrii Nakryiko 	.raw_types = {
1463c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1464c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1465c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1466c64779e2SAndrii Nakryiko 	},
1467c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1468c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int") - 1,
1469c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1470c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1471c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1472c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1473c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1474c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1475c64779e2SAndrii Nakryiko 	.max_entries = 4,
1476c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1477c64779e2SAndrii Nakryiko 	.err_str = "Invalid string section",
1478c64779e2SAndrii Nakryiko },
1479c64779e2SAndrii Nakryiko 
1480c64779e2SAndrii Nakryiko {
1481c64779e2SAndrii Nakryiko 	.descr = "empty string section",
1482c64779e2SAndrii Nakryiko 	.raw_types = {
1483c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1484c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1485c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1486c64779e2SAndrii Nakryiko 	},
1487c64779e2SAndrii Nakryiko 	.str_sec = "",
1488c64779e2SAndrii Nakryiko 	.str_sec_size = 0,
1489c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1490c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1491c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1492c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1493c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1494c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1495c64779e2SAndrii Nakryiko 	.max_entries = 4,
1496c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1497c64779e2SAndrii Nakryiko 	.err_str = "Invalid string section",
1498c64779e2SAndrii Nakryiko },
1499c64779e2SAndrii Nakryiko 
1500c64779e2SAndrii Nakryiko {
1501c64779e2SAndrii Nakryiko 	.descr = "empty type section",
1502c64779e2SAndrii Nakryiko 	.raw_types = {
1503c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1504c64779e2SAndrii Nakryiko 	},
1505c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1506c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1507c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1508c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1509c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1510c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1511c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1512c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1513c64779e2SAndrii Nakryiko 	.max_entries = 4,
1514c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1515c64779e2SAndrii Nakryiko 	.err_str = "No type found",
1516c64779e2SAndrii Nakryiko },
1517c64779e2SAndrii Nakryiko 
1518c64779e2SAndrii Nakryiko {
1519c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Longer hdr_len",
1520c64779e2SAndrii Nakryiko 	.raw_types = {
1521c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1522c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1523c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1524c64779e2SAndrii Nakryiko 	},
1525c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1526c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1527c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1528c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1529c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1530c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1531c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1532c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1533c64779e2SAndrii Nakryiko 	.max_entries = 4,
1534c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1535c64779e2SAndrii Nakryiko 	.hdr_len_delta = 4,
1536c64779e2SAndrii Nakryiko 	.err_str = "Unsupported btf_header",
1537c64779e2SAndrii Nakryiko },
1538c64779e2SAndrii Nakryiko 
1539c64779e2SAndrii Nakryiko {
1540c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Gap between hdr and type",
1541c64779e2SAndrii Nakryiko 	.raw_types = {
1542c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1543c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1544c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1545c64779e2SAndrii Nakryiko 	},
1546c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1547c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1548c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1549c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1550c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1551c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1552c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1553c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1554c64779e2SAndrii Nakryiko 	.max_entries = 4,
1555c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1556c64779e2SAndrii Nakryiko 	.type_off_delta = 4,
1557c64779e2SAndrii Nakryiko 	.err_str = "Unsupported section found",
1558c64779e2SAndrii Nakryiko },
1559c64779e2SAndrii Nakryiko 
1560c64779e2SAndrii Nakryiko {
1561c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Gap between type and str",
1562c64779e2SAndrii Nakryiko 	.raw_types = {
1563c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1564c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1565c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1566c64779e2SAndrii Nakryiko 	},
1567c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1568c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1569c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1570c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1571c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1572c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1573c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1574c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1575c64779e2SAndrii Nakryiko 	.max_entries = 4,
1576c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1577c64779e2SAndrii Nakryiko 	.str_off_delta = 4,
1578c64779e2SAndrii Nakryiko 	.err_str = "Unsupported section found",
1579c64779e2SAndrii Nakryiko },
1580c64779e2SAndrii Nakryiko 
1581c64779e2SAndrii Nakryiko {
1582c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Overlap between type and str",
1583c64779e2SAndrii Nakryiko 	.raw_types = {
1584c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1585c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1586c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1587c64779e2SAndrii Nakryiko 	},
1588c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1589c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1590c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1591c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1592c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1593c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1594c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1595c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1596c64779e2SAndrii Nakryiko 	.max_entries = 4,
1597c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1598c64779e2SAndrii Nakryiko 	.str_off_delta = -4,
1599c64779e2SAndrii Nakryiko 	.err_str = "Section overlap found",
1600c64779e2SAndrii Nakryiko },
1601c64779e2SAndrii Nakryiko 
1602c64779e2SAndrii Nakryiko {
1603c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Larger BTF size",
1604c64779e2SAndrii Nakryiko 	.raw_types = {
1605c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1606c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1607c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1608c64779e2SAndrii Nakryiko 	},
1609c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1610c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1611c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1612c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1613c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1614c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1615c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1616c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1617c64779e2SAndrii Nakryiko 	.max_entries = 4,
1618c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1619c64779e2SAndrii Nakryiko 	.str_len_delta = -4,
1620c64779e2SAndrii Nakryiko 	.err_str = "Unsupported section found",
1621c64779e2SAndrii Nakryiko },
1622c64779e2SAndrii Nakryiko 
1623c64779e2SAndrii Nakryiko {
1624c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Smaller BTF size",
1625c64779e2SAndrii Nakryiko 	.raw_types = {
1626c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1627c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1628c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1629c64779e2SAndrii Nakryiko 	},
1630c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1631c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1632c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1633c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1634c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1635c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1636c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1637c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1638c64779e2SAndrii Nakryiko 	.max_entries = 4,
1639c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1640c64779e2SAndrii Nakryiko 	.str_len_delta = 4,
1641c64779e2SAndrii Nakryiko 	.err_str = "Total section length too long",
1642c64779e2SAndrii Nakryiko },
1643c64779e2SAndrii Nakryiko 
1644c64779e2SAndrii Nakryiko {
1645c64779e2SAndrii Nakryiko 	.descr = "array test. index_type/elem_type \"int\"",
1646c64779e2SAndrii Nakryiko 	.raw_types = {
1647c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1648c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1649c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1650c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 16),
1651c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1652c64779e2SAndrii Nakryiko 	},
1653c64779e2SAndrii Nakryiko 	.str_sec = "",
1654c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1655c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1656c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1657c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1658c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1659c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1660c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1661c64779e2SAndrii Nakryiko 	.max_entries = 4,
1662c64779e2SAndrii Nakryiko },
1663c64779e2SAndrii Nakryiko 
1664c64779e2SAndrii Nakryiko {
1665c64779e2SAndrii Nakryiko 	.descr = "array test. index_type/elem_type \"const int\"",
1666c64779e2SAndrii Nakryiko 	.raw_types = {
1667c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1668c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1669c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1670c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 3, 16),
1671c64779e2SAndrii Nakryiko 		/* CONST type_id=1 */			/* [3] */
1672c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1),
1673c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1674c64779e2SAndrii Nakryiko 	},
1675c64779e2SAndrii Nakryiko 	.str_sec = "",
1676c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1677c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1678c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1679c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1680c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1681c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1682c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1683c64779e2SAndrii Nakryiko 	.max_entries = 4,
1684c64779e2SAndrii Nakryiko },
1685c64779e2SAndrii Nakryiko 
1686c64779e2SAndrii Nakryiko {
1687c64779e2SAndrii Nakryiko 	.descr = "array test. index_type \"const int:31\"",
1688c64779e2SAndrii Nakryiko 	.raw_types = {
1689c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1690c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1691c64779e2SAndrii Nakryiko 		/* int:31 */				/* [2] */
1692c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 31, 4),
1693c64779e2SAndrii Nakryiko 		/* int[16] */				/* [3] */
1694c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 4, 16),
1695c64779e2SAndrii Nakryiko 		/* CONST type_id=2 */			/* [4] */
1696c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2),
1697c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1698c64779e2SAndrii Nakryiko 	},
1699c64779e2SAndrii Nakryiko 	.str_sec = "",
1700c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1701c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1702c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1703c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1704c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1705c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1706c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1707c64779e2SAndrii Nakryiko 	.max_entries = 4,
1708c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1709c64779e2SAndrii Nakryiko 	.err_str = "Invalid index",
1710c64779e2SAndrii Nakryiko },
1711c64779e2SAndrii Nakryiko 
1712c64779e2SAndrii Nakryiko {
1713c64779e2SAndrii Nakryiko 	.descr = "array test. elem_type \"const int:31\"",
1714c64779e2SAndrii Nakryiko 	.raw_types = {
1715c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1716c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1717c64779e2SAndrii Nakryiko 		/* int:31 */				/* [2] */
1718c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 31, 4),
1719c64779e2SAndrii Nakryiko 		/* int[16] */				/* [3] */
1720c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(4, 1, 16),
1721c64779e2SAndrii Nakryiko 		/* CONST type_id=2 */			/* [4] */
1722c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2),
1723c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1724c64779e2SAndrii Nakryiko 	},
1725c64779e2SAndrii Nakryiko 	.str_sec = "",
1726c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1727c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1728c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1729c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1730c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1731c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1732c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1733c64779e2SAndrii Nakryiko 	.max_entries = 4,
1734c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1735c64779e2SAndrii Nakryiko 	.err_str = "Invalid array of int",
1736c64779e2SAndrii Nakryiko },
1737c64779e2SAndrii Nakryiko 
1738c64779e2SAndrii Nakryiko {
1739c64779e2SAndrii Nakryiko 	.descr = "array test. index_type \"void\"",
1740c64779e2SAndrii Nakryiko 	.raw_types = {
1741c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1742c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1743c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1744c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 0, 16),
1745c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1746c64779e2SAndrii Nakryiko 	},
1747c64779e2SAndrii Nakryiko 	.str_sec = "",
1748c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1749c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1750c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1751c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1752c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1753c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1754c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1755c64779e2SAndrii Nakryiko 	.max_entries = 4,
1756c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1757c64779e2SAndrii Nakryiko 	.err_str = "Invalid index",
1758c64779e2SAndrii Nakryiko },
1759c64779e2SAndrii Nakryiko 
1760c64779e2SAndrii Nakryiko {
1761c64779e2SAndrii Nakryiko 	.descr = "array test. index_type \"const void\"",
1762c64779e2SAndrii Nakryiko 	.raw_types = {
1763c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1764c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1765c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1766c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 3, 16),
1767c64779e2SAndrii Nakryiko 		/* CONST type_id=0 (void) */		/* [3] */
1768c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1769c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1770c64779e2SAndrii Nakryiko 	},
1771c64779e2SAndrii Nakryiko 	.str_sec = "",
1772c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1773c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1774c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1775c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1776c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1777c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1778c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1779c64779e2SAndrii Nakryiko 	.max_entries = 4,
1780c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1781c64779e2SAndrii Nakryiko 	.err_str = "Invalid index",
1782c64779e2SAndrii Nakryiko },
1783c64779e2SAndrii Nakryiko 
1784c64779e2SAndrii Nakryiko {
1785c64779e2SAndrii Nakryiko 	.descr = "array test. elem_type \"const void\"",
1786c64779e2SAndrii Nakryiko 	.raw_types = {
1787c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1788c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1789c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1790c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 16),
1791c64779e2SAndrii Nakryiko 		/* CONST type_id=0 (void) */		/* [3] */
1792c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1793c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1794c64779e2SAndrii Nakryiko 	},
1795c64779e2SAndrii Nakryiko 	.str_sec = "",
1796c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1797c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1798c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1799c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1800c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1801c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1802c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1803c64779e2SAndrii Nakryiko 	.max_entries = 4,
1804c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1805c64779e2SAndrii Nakryiko 	.err_str = "Invalid elem",
1806c64779e2SAndrii Nakryiko },
1807c64779e2SAndrii Nakryiko 
1808c64779e2SAndrii Nakryiko {
1809c64779e2SAndrii Nakryiko 	.descr = "array test. elem_type \"const void *\"",
1810c64779e2SAndrii Nakryiko 	.raw_types = {
1811c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1812c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1813c64779e2SAndrii Nakryiko 		/* const void *[16] */			/* [2] */
1814c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 16),
1815c64779e2SAndrii Nakryiko 		/* CONST type_id=4 */			/* [3] */
1816c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1817c64779e2SAndrii Nakryiko 		/* void* */				/* [4] */
1818c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
1819c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1820c64779e2SAndrii Nakryiko 	},
1821c64779e2SAndrii Nakryiko 	.str_sec = "",
1822c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1823c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1824c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1825c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1826c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1827c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1828c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1829c64779e2SAndrii Nakryiko 	.max_entries = 4,
1830c64779e2SAndrii Nakryiko },
1831c64779e2SAndrii Nakryiko 
1832c64779e2SAndrii Nakryiko {
1833c64779e2SAndrii Nakryiko 	.descr = "array test. index_type \"const void *\"",
1834c64779e2SAndrii Nakryiko 	.raw_types = {
1835c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1836c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1837c64779e2SAndrii Nakryiko 		/* const void *[16] */			/* [2] */
1838c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 3, 16),
1839c64779e2SAndrii Nakryiko 		/* CONST type_id=4 */			/* [3] */
1840c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1841c64779e2SAndrii Nakryiko 		/* void* */				/* [4] */
1842c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
1843c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1844c64779e2SAndrii Nakryiko 	},
1845c64779e2SAndrii Nakryiko 	.str_sec = "",
1846c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1847c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1848c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1849c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1850c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1851c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1852c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1853c64779e2SAndrii Nakryiko 	.max_entries = 4,
1854c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1855c64779e2SAndrii Nakryiko 	.err_str = "Invalid index",
1856c64779e2SAndrii Nakryiko },
1857c64779e2SAndrii Nakryiko 
1858c64779e2SAndrii Nakryiko {
1859c64779e2SAndrii Nakryiko 	.descr = "array test. t->size != 0\"",
1860c64779e2SAndrii Nakryiko 	.raw_types = {
1861c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1862c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1863c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1864c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY, 0, 0), 1),
1865c64779e2SAndrii Nakryiko 		BTF_ARRAY_ENC(1, 1, 16),
1866c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1867c64779e2SAndrii Nakryiko 	},
1868c64779e2SAndrii Nakryiko 	.str_sec = "",
1869c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1870c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1871c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1872c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1873c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1874c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1875c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1876c64779e2SAndrii Nakryiko 	.max_entries = 4,
1877c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1878c64779e2SAndrii Nakryiko 	.err_str = "size != 0",
1879c64779e2SAndrii Nakryiko },
1880c64779e2SAndrii Nakryiko 
1881c64779e2SAndrii Nakryiko {
1882c64779e2SAndrii Nakryiko 	.descr = "int test. invalid int_data",
1883c64779e2SAndrii Nakryiko 	.raw_types = {
1884c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), 4),
1885c64779e2SAndrii Nakryiko 		0x10000000,
1886c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1887c64779e2SAndrii Nakryiko 	},
1888c64779e2SAndrii Nakryiko 	.str_sec = "",
1889c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1890c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1891c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1892c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1893c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1894c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1895c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1896c64779e2SAndrii Nakryiko 	.max_entries = 4,
1897c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1898c64779e2SAndrii Nakryiko 	.err_str = "Invalid int_data",
1899c64779e2SAndrii Nakryiko },
1900c64779e2SAndrii Nakryiko 
1901c64779e2SAndrii Nakryiko {
1902c64779e2SAndrii Nakryiko 	.descr = "invalid BTF_INFO",
1903c64779e2SAndrii Nakryiko 	.raw_types = {
1904c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1905c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1906eea154a8SIlya Leoshkevich 		BTF_TYPE_ENC(0, 0x20000000, 4),
1907c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1908c64779e2SAndrii Nakryiko 	},
1909c64779e2SAndrii Nakryiko 	.str_sec = "",
1910c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1911c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1912c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1913c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1914c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1915c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1916c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1917c64779e2SAndrii Nakryiko 	.max_entries = 4,
1918c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1919c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info",
1920c64779e2SAndrii Nakryiko },
1921c64779e2SAndrii Nakryiko 
1922c64779e2SAndrii Nakryiko {
1923c64779e2SAndrii Nakryiko 	.descr = "fwd test. t->type != 0\"",
1924c64779e2SAndrii Nakryiko 	.raw_types = {
1925c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1926c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1927c64779e2SAndrii Nakryiko 		/* fwd type */				/* [2] */
1928c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 1),
1929c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1930c64779e2SAndrii Nakryiko 	},
1931c64779e2SAndrii Nakryiko 	.str_sec = "",
1932c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1933c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1934c64779e2SAndrii Nakryiko 	.map_name = "fwd_test_map",
1935c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1936c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1937c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1938c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1939c64779e2SAndrii Nakryiko 	.max_entries = 4,
1940c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1941c64779e2SAndrii Nakryiko 	.err_str = "type != 0",
1942c64779e2SAndrii Nakryiko },
1943c64779e2SAndrii Nakryiko 
1944c64779e2SAndrii Nakryiko {
1945c64779e2SAndrii Nakryiko 	.descr = "typedef (invalid name, name_off = 0)",
1946c64779e2SAndrii Nakryiko 	.raw_types = {
1947c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1948c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(0, 1),				/* [2] */
1949c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1950c64779e2SAndrii Nakryiko 	},
1951c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
1952c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
1953c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1954c64779e2SAndrii Nakryiko 	.map_name = "typedef_check_btf",
1955c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1956c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1957c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1958c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1959c64779e2SAndrii Nakryiko 	.max_entries = 4,
1960c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1961c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
1962c64779e2SAndrii Nakryiko },
1963c64779e2SAndrii Nakryiko 
1964c64779e2SAndrii Nakryiko {
1965c64779e2SAndrii Nakryiko 	.descr = "typedef (invalid name, invalid identifier)",
1966c64779e2SAndrii Nakryiko 	.raw_types = {
1967c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1968c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),			/* [2] */
1969c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1970c64779e2SAndrii Nakryiko 	},
1971c64779e2SAndrii Nakryiko 	.str_sec = "\0__!int",
1972c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__!int"),
1973c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1974c64779e2SAndrii Nakryiko 	.map_name = "typedef_check_btf",
1975c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1976c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1977c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1978c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1979c64779e2SAndrii Nakryiko 	.max_entries = 4,
1980c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1981c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
1982c64779e2SAndrii Nakryiko },
1983c64779e2SAndrii Nakryiko 
1984c64779e2SAndrii Nakryiko {
1985c64779e2SAndrii Nakryiko 	.descr = "ptr type (invalid name, name_off <> 0)",
1986c64779e2SAndrii Nakryiko 	.raw_types = {
1987c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
1988c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
1989c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 1),	/* [2] */
1990c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1991c64779e2SAndrii Nakryiko 	},
1992c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
1993c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
1994c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1995c64779e2SAndrii Nakryiko 	.map_name = "ptr_type_check_btf",
1996c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1997c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1998c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1999c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2000c64779e2SAndrii Nakryiko 	.max_entries = 4,
2001c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2002c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2003c64779e2SAndrii Nakryiko },
2004c64779e2SAndrii Nakryiko 
2005c64779e2SAndrii Nakryiko {
2006c64779e2SAndrii Nakryiko 	.descr = "volatile type (invalid name, name_off <> 0)",
2007c64779e2SAndrii Nakryiko 	.raw_types = {
2008c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2009c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2010c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 1),	/* [2] */
2011c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2012c64779e2SAndrii Nakryiko 	},
2013c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
2014c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
2015c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2016c64779e2SAndrii Nakryiko 	.map_name = "volatile_type_check_btf",
2017c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2018c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2019c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2020c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2021c64779e2SAndrii Nakryiko 	.max_entries = 4,
2022c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2023c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2024c64779e2SAndrii Nakryiko },
2025c64779e2SAndrii Nakryiko 
2026c64779e2SAndrii Nakryiko {
2027c64779e2SAndrii Nakryiko 	.descr = "const type (invalid name, name_off <> 0)",
2028c64779e2SAndrii Nakryiko 	.raw_types = {
2029c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2030c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2031c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1),	/* [2] */
2032c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2033c64779e2SAndrii Nakryiko 	},
2034c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
2035c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
2036c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2037c64779e2SAndrii Nakryiko 	.map_name = "const_type_check_btf",
2038c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2039c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2040c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2041c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2042c64779e2SAndrii Nakryiko 	.max_entries = 4,
2043c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2044c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2045c64779e2SAndrii Nakryiko },
2046c64779e2SAndrii Nakryiko 
2047c64779e2SAndrii Nakryiko {
2048c64779e2SAndrii Nakryiko 	.descr = "restrict type (invalid name, name_off <> 0)",
2049c64779e2SAndrii Nakryiko 	.raw_types = {
2050c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2051c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 1),	/* [2] */
2052c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2053c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_RESTRICT, 0, 0), 2),	/* [3] */
2054c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2055c64779e2SAndrii Nakryiko 	},
2056c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
2057c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
2058c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2059c64779e2SAndrii Nakryiko 	.map_name = "restrict_type_check_btf",
2060c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2061c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2062c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2063c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2064c64779e2SAndrii Nakryiko 	.max_entries = 4,
2065c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2066c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2067c64779e2SAndrii Nakryiko },
2068c64779e2SAndrii Nakryiko 
2069c64779e2SAndrii Nakryiko {
2070c64779e2SAndrii Nakryiko 	.descr = "fwd type (invalid name, name_off = 0)",
2071c64779e2SAndrii Nakryiko 	.raw_types = {
2072c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2073c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 0),	/* [2] */
2074c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2075c64779e2SAndrii Nakryiko 	},
2076c64779e2SAndrii Nakryiko 	.str_sec = "\0__skb",
2077c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__skb"),
2078c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2079c64779e2SAndrii Nakryiko 	.map_name = "fwd_type_check_btf",
2080c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2081c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2082c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2083c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2084c64779e2SAndrii Nakryiko 	.max_entries = 4,
2085c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2086c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2087c64779e2SAndrii Nakryiko },
2088c64779e2SAndrii Nakryiko 
2089c64779e2SAndrii Nakryiko {
2090c64779e2SAndrii Nakryiko 	.descr = "fwd type (invalid name, invalid identifier)",
2091c64779e2SAndrii Nakryiko 	.raw_types = {
2092c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2093c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2094c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 0),	/* [2] */
2095c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2096c64779e2SAndrii Nakryiko 	},
2097c64779e2SAndrii Nakryiko 	.str_sec = "\0__!skb",
2098c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__!skb"),
2099c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2100c64779e2SAndrii Nakryiko 	.map_name = "fwd_type_check_btf",
2101c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2102c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2103c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2104c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2105c64779e2SAndrii Nakryiko 	.max_entries = 4,
2106c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2107c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2108c64779e2SAndrii Nakryiko },
2109c64779e2SAndrii Nakryiko 
2110c64779e2SAndrii Nakryiko {
2111c64779e2SAndrii Nakryiko 	.descr = "array type (invalid name, name_off <> 0)",
2112c64779e2SAndrii Nakryiko 	.raw_types = {
2113c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2114c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2115c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ARRAY, 0, 0), 0),	/* [2] */
2116c64779e2SAndrii Nakryiko 		BTF_ARRAY_ENC(1, 1, 4),
2117c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2118c64779e2SAndrii Nakryiko 	},
2119c64779e2SAndrii Nakryiko 	.str_sec = "\0__skb",
2120c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__skb"),
2121c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2122c64779e2SAndrii Nakryiko 	.map_name = "array_type_check_btf",
2123c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2124c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2125c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2126c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2127c64779e2SAndrii Nakryiko 	.max_entries = 4,
2128c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2129c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2130c64779e2SAndrii Nakryiko },
2131c64779e2SAndrii Nakryiko 
2132c64779e2SAndrii Nakryiko {
2133c64779e2SAndrii Nakryiko 	.descr = "struct type (name_off = 0)",
2134c64779e2SAndrii Nakryiko 	.raw_types = {
2135c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2136c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2137c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4),	/* [2] */
2138c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2139c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2140c64779e2SAndrii Nakryiko 	},
2141c64779e2SAndrii Nakryiko 	.str_sec = "\0A",
2142c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A"),
2143c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2144c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
2145c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2146c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2147c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2148c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2149c64779e2SAndrii Nakryiko 	.max_entries = 4,
2150c64779e2SAndrii Nakryiko },
2151c64779e2SAndrii Nakryiko 
2152c64779e2SAndrii Nakryiko {
2153c64779e2SAndrii Nakryiko 	.descr = "struct type (invalid name, invalid identifier)",
2154c64779e2SAndrii Nakryiko 	.raw_types = {
2155c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2156c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2157c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4),	/* [2] */
2158c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2159c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2160c64779e2SAndrii Nakryiko 	},
2161c64779e2SAndrii Nakryiko 	.str_sec = "\0A!\0B",
2162c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A!\0B"),
2163c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2164c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
2165c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2166c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2167c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2168c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2169c64779e2SAndrii Nakryiko 	.max_entries = 4,
2170c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2171c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2172c64779e2SAndrii Nakryiko },
2173c64779e2SAndrii Nakryiko 
2174c64779e2SAndrii Nakryiko {
2175c64779e2SAndrii Nakryiko 	.descr = "struct member (name_off = 0)",
2176c64779e2SAndrii Nakryiko 	.raw_types = {
2177c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2178c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2179c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4),	/* [2] */
2180c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2181c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2182c64779e2SAndrii Nakryiko 	},
2183c64779e2SAndrii Nakryiko 	.str_sec = "\0A",
2184c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A"),
2185c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2186c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
2187c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2188c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2189c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2190c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2191c64779e2SAndrii Nakryiko 	.max_entries = 4,
2192c64779e2SAndrii Nakryiko },
2193c64779e2SAndrii Nakryiko 
2194c64779e2SAndrii Nakryiko {
2195c64779e2SAndrii Nakryiko 	.descr = "struct member (invalid name, invalid identifier)",
2196c64779e2SAndrii Nakryiko 	.raw_types = {
2197c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2198c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2199c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4),	/* [2] */
2200c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2201c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2202c64779e2SAndrii Nakryiko 	},
2203c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0B*",
2204c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0B*"),
2205c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2206c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
2207c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2208c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2209c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2210c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2211c64779e2SAndrii Nakryiko 	.max_entries = 4,
2212c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2213c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2214c64779e2SAndrii Nakryiko },
2215c64779e2SAndrii Nakryiko 
2216c64779e2SAndrii Nakryiko {
2217c64779e2SAndrii Nakryiko 	.descr = "enum type (name_off = 0)",
2218c64779e2SAndrii Nakryiko 	.raw_types = {
2219c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2220c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2221c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2222c64779e2SAndrii Nakryiko 			     sizeof(int)),				/* [2] */
2223c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
2224c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2225c64779e2SAndrii Nakryiko 	},
2226c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0B",
2227c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0B"),
2228c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2229c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2230c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2231c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2232c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2233c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2234c64779e2SAndrii Nakryiko 	.max_entries = 4,
2235c64779e2SAndrii Nakryiko },
2236c64779e2SAndrii Nakryiko 
2237c64779e2SAndrii Nakryiko {
2238c64779e2SAndrii Nakryiko 	.descr = "enum type (invalid name, invalid identifier)",
2239c64779e2SAndrii Nakryiko 	.raw_types = {
2240c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2241c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2242c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2243c64779e2SAndrii Nakryiko 			     sizeof(int)),				/* [2] */
2244c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
2245c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2246c64779e2SAndrii Nakryiko 	},
2247c64779e2SAndrii Nakryiko 	.str_sec = "\0A!\0B",
2248c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A!\0B"),
2249c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2250c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2251c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2252c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2253c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2254c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2255c64779e2SAndrii Nakryiko 	.max_entries = 4,
2256c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2257c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2258c64779e2SAndrii Nakryiko },
2259c64779e2SAndrii Nakryiko 
2260c64779e2SAndrii Nakryiko {
2261c64779e2SAndrii Nakryiko 	.descr = "enum member (invalid name, name_off = 0)",
2262c64779e2SAndrii Nakryiko 	.raw_types = {
2263c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2264c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2265c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2266c64779e2SAndrii Nakryiko 			     sizeof(int)),				/* [2] */
2267c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(0, 0),
2268c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2269c64779e2SAndrii Nakryiko 	},
2270c64779e2SAndrii Nakryiko 	.str_sec = "",
2271c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2272c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2273c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2274c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2275c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2276c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2277c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2278c64779e2SAndrii Nakryiko 	.max_entries = 4,
2279c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2280c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2281c64779e2SAndrii Nakryiko },
2282c64779e2SAndrii Nakryiko 
2283c64779e2SAndrii Nakryiko {
2284c64779e2SAndrii Nakryiko 	.descr = "enum member (invalid name, invalid identifier)",
2285c64779e2SAndrii Nakryiko 	.raw_types = {
2286c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2287c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2288c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2289c64779e2SAndrii Nakryiko 			     sizeof(int)),				/* [2] */
2290c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
2291c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2292c64779e2SAndrii Nakryiko 	},
2293c64779e2SAndrii Nakryiko 	.str_sec = "\0A!",
2294c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A!"),
2295c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2296c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2297c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2298c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2299c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2300c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2301c64779e2SAndrii Nakryiko 	.max_entries = 4,
2302c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2303c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2304c64779e2SAndrii Nakryiko },
2305c64779e2SAndrii Nakryiko {
2306c64779e2SAndrii Nakryiko 	.descr = "arraymap invalid btf key (a bit field)",
2307c64779e2SAndrii Nakryiko 	.raw_types = {
2308c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
2309c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2310c64779e2SAndrii Nakryiko 		/* 32 bit int with 32 bit offset */	/* [2] */
2311c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 32, 32, 8),
2312c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2313c64779e2SAndrii Nakryiko 	},
2314c64779e2SAndrii Nakryiko 	.str_sec = "",
2315c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2316c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2317c64779e2SAndrii Nakryiko 	.map_name = "array_map_check_btf",
2318c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2319c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2320c64779e2SAndrii Nakryiko 	.key_type_id = 2,
2321c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2322c64779e2SAndrii Nakryiko 	.max_entries = 4,
2323c64779e2SAndrii Nakryiko 	.map_create_err = true,
2324c64779e2SAndrii Nakryiko },
2325c64779e2SAndrii Nakryiko 
2326c64779e2SAndrii Nakryiko {
2327c64779e2SAndrii Nakryiko 	.descr = "arraymap invalid btf key (!= 32 bits)",
2328c64779e2SAndrii Nakryiko 	.raw_types = {
2329c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
2330c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2331c64779e2SAndrii Nakryiko 		/* 16 bit int with 0 bit offset */	/* [2] */
2332c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 16, 2),
2333c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2334c64779e2SAndrii Nakryiko 	},
2335c64779e2SAndrii Nakryiko 	.str_sec = "",
2336c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2337c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2338c64779e2SAndrii Nakryiko 	.map_name = "array_map_check_btf",
2339c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2340c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2341c64779e2SAndrii Nakryiko 	.key_type_id = 2,
2342c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2343c64779e2SAndrii Nakryiko 	.max_entries = 4,
2344c64779e2SAndrii Nakryiko 	.map_create_err = true,
2345c64779e2SAndrii Nakryiko },
2346c64779e2SAndrii Nakryiko 
2347c64779e2SAndrii Nakryiko {
2348c64779e2SAndrii Nakryiko 	.descr = "arraymap invalid btf value (too small)",
2349c64779e2SAndrii Nakryiko 	.raw_types = {
2350c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
2351c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2352c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2353c64779e2SAndrii Nakryiko 	},
2354c64779e2SAndrii Nakryiko 	.str_sec = "",
2355c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2356c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2357c64779e2SAndrii Nakryiko 	.map_name = "array_map_check_btf",
2358c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2359c64779e2SAndrii Nakryiko 	/* btf_value_size < map->value_size */
2360c64779e2SAndrii Nakryiko 	.value_size = sizeof(__u64),
2361c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2362c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2363c64779e2SAndrii Nakryiko 	.max_entries = 4,
2364c64779e2SAndrii Nakryiko 	.map_create_err = true,
2365c64779e2SAndrii Nakryiko },
2366c64779e2SAndrii Nakryiko 
2367c64779e2SAndrii Nakryiko {
2368c64779e2SAndrii Nakryiko 	.descr = "arraymap invalid btf value (too big)",
2369c64779e2SAndrii Nakryiko 	.raw_types = {
2370c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
2371c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2372c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2373c64779e2SAndrii Nakryiko 	},
2374c64779e2SAndrii Nakryiko 	.str_sec = "",
2375c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2376c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2377c64779e2SAndrii Nakryiko 	.map_name = "array_map_check_btf",
2378c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2379c64779e2SAndrii Nakryiko 	/* btf_value_size > map->value_size */
2380c64779e2SAndrii Nakryiko 	.value_size = sizeof(__u16),
2381c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2382c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2383c64779e2SAndrii Nakryiko 	.max_entries = 4,
2384c64779e2SAndrii Nakryiko 	.map_create_err = true,
2385c64779e2SAndrii Nakryiko },
2386c64779e2SAndrii Nakryiko 
2387c64779e2SAndrii Nakryiko {
2388c64779e2SAndrii Nakryiko 	.descr = "func proto (int (*)(int, unsigned int))",
2389c64779e2SAndrii Nakryiko 	.raw_types = {
2390c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2391c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2392c64779e2SAndrii Nakryiko 		/* int (*)(int, unsigned int) */
2393c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
2394c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2395c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2396c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2397c64779e2SAndrii Nakryiko 	},
2398c64779e2SAndrii Nakryiko 	.str_sec = "",
2399c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2400c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2401c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2402c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2403c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2404c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2405c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2406c64779e2SAndrii Nakryiko 	.max_entries = 4,
2407c64779e2SAndrii Nakryiko },
2408c64779e2SAndrii Nakryiko 
2409c64779e2SAndrii Nakryiko {
2410c64779e2SAndrii Nakryiko 	.descr = "func proto (vararg)",
2411c64779e2SAndrii Nakryiko 	.raw_types = {
2412c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2413c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2414c64779e2SAndrii Nakryiko 		/* void (*)(int, unsigned int, ...) */
2415c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 3),			/* [3] */
2416c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2417c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2418c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 0),
2419c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2420c64779e2SAndrii Nakryiko 	},
2421c64779e2SAndrii Nakryiko 	.str_sec = "",
2422c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2423c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2424c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2425c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2426c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2427c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2428c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2429c64779e2SAndrii Nakryiko 	.max_entries = 4,
2430c64779e2SAndrii Nakryiko },
2431c64779e2SAndrii Nakryiko 
2432c64779e2SAndrii Nakryiko {
2433c64779e2SAndrii Nakryiko 	.descr = "func proto (vararg with name)",
2434c64779e2SAndrii Nakryiko 	.raw_types = {
2435c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2436c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2437c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b, ... c) */
2438c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 3),			/* [3] */
2439c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2440c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2441c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 0),
2442c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2443c64779e2SAndrii Nakryiko 	},
2444c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b\0c",
2445c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b\0c"),
2446c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2447c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2448c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2449c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2450c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2451c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2452c64779e2SAndrii Nakryiko 	.max_entries = 4,
2453c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2454c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#3",
2455c64779e2SAndrii Nakryiko },
2456c64779e2SAndrii Nakryiko 
2457c64779e2SAndrii Nakryiko {
2458c64779e2SAndrii Nakryiko 	.descr = "func proto (arg after vararg)",
2459c64779e2SAndrii Nakryiko 	.raw_types = {
2460c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2461c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2462c64779e2SAndrii Nakryiko 		/* void (*)(int a, ..., unsigned int b) */
2463c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 3),			/* [3] */
2464c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2465c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 0),
2466c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2467c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2468c64779e2SAndrii Nakryiko 	},
2469c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b",
2470c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b"),
2471c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2472c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2473c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2474c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2475c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2476c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2477c64779e2SAndrii Nakryiko 	.max_entries = 4,
2478c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2479c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#2",
2480c64779e2SAndrii Nakryiko },
2481c64779e2SAndrii Nakryiko 
2482c64779e2SAndrii Nakryiko {
2483c64779e2SAndrii Nakryiko 	.descr = "func proto (CONST=>TYPEDEF=>PTR=>FUNC_PROTO)",
2484c64779e2SAndrii Nakryiko 	.raw_types = {
2485c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2486c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2487c64779e2SAndrii Nakryiko 		/* typedef void (*func_ptr)(int, unsigned int) */
2488c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 5),			/* [3] */
2489c64779e2SAndrii Nakryiko 		/* const func_ptr */
2490c64779e2SAndrii Nakryiko 		BTF_CONST_ENC(3),				/* [4] */
2491c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(6),					/* [5] */
2492c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [6] */
2493c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2494c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2495c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2496c64779e2SAndrii Nakryiko 	},
2497c64779e2SAndrii Nakryiko 	.str_sec = "\0func_ptr",
2498c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0func_ptr"),
2499c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2500c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2501c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2502c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2503c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2504c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2505c64779e2SAndrii Nakryiko 	.max_entries = 4,
2506c64779e2SAndrii Nakryiko },
2507c64779e2SAndrii Nakryiko 
2508c64779e2SAndrii Nakryiko {
2509c64779e2SAndrii Nakryiko 	.descr = "func proto (TYPEDEF=>FUNC_PROTO)",
2510c64779e2SAndrii Nakryiko 	.raw_types = {
2511c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2512c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2513c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
2514c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [4] */
2515c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2516c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2517c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2518c64779e2SAndrii Nakryiko 	},
2519c64779e2SAndrii Nakryiko 	.str_sec = "\0func_typedef",
2520c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0func_typedef"),
2521c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2522c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2523c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2524c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2525c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2526c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2527c64779e2SAndrii Nakryiko 	.max_entries = 4,
2528c64779e2SAndrii Nakryiko },
2529c64779e2SAndrii Nakryiko 
2530c64779e2SAndrii Nakryiko {
2531c64779e2SAndrii Nakryiko 	.descr = "func proto (btf_resolve(arg))",
2532c64779e2SAndrii Nakryiko 	.raw_types = {
2533c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2534c64779e2SAndrii Nakryiko 		/* void (*)(const void *) */
2535c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 1),			/* [2] */
2536c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 3),
2537c64779e2SAndrii Nakryiko 		BTF_CONST_ENC(4),				/* [3] */
2538c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(0),					/* [4] */
2539c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2540c64779e2SAndrii Nakryiko 	},
2541c64779e2SAndrii Nakryiko 	.str_sec = "",
2542c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2543c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2544c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2545c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2546c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2547c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2548c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2549c64779e2SAndrii Nakryiko 	.max_entries = 4,
2550c64779e2SAndrii Nakryiko },
2551c64779e2SAndrii Nakryiko 
2552c64779e2SAndrii Nakryiko {
2553c64779e2SAndrii Nakryiko 	.descr = "func proto (Not all arg has name)",
2554c64779e2SAndrii Nakryiko 	.raw_types = {
2555c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2556c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2557c64779e2SAndrii Nakryiko 		/* void (*)(int, unsigned int b) */
2558c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2559c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2560c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2561c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2562c64779e2SAndrii Nakryiko 	},
2563c64779e2SAndrii Nakryiko 	.str_sec = "\0b",
2564c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0b"),
2565c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2566c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2567c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2568c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2569c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2570c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2571c64779e2SAndrii Nakryiko 	.max_entries = 4,
2572c64779e2SAndrii Nakryiko },
2573c64779e2SAndrii Nakryiko 
2574c64779e2SAndrii Nakryiko {
2575c64779e2SAndrii Nakryiko 	.descr = "func proto (Bad arg name_off)",
2576c64779e2SAndrii Nakryiko 	.raw_types = {
2577c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2578c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2579c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int <bad_name_off>) */
2580c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2581c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2582c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0x0fffffff, 2),
2583c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2584c64779e2SAndrii Nakryiko 	},
2585c64779e2SAndrii Nakryiko 	.str_sec = "\0a",
2586c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a"),
2587c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2588c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2589c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2590c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2591c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2592c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2593c64779e2SAndrii Nakryiko 	.max_entries = 4,
2594c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2595c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#2",
2596c64779e2SAndrii Nakryiko },
2597c64779e2SAndrii Nakryiko 
2598c64779e2SAndrii Nakryiko {
2599c64779e2SAndrii Nakryiko 	.descr = "func proto (Bad arg name)",
2600c64779e2SAndrii Nakryiko 	.raw_types = {
2601c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2602c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2603c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int !!!) */
2604c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2605c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2606c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2607c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2608c64779e2SAndrii Nakryiko 	},
2609c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0!!!",
2610c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0!!!"),
2611c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2612c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2613c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2614c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2615c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2616c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2617c64779e2SAndrii Nakryiko 	.max_entries = 4,
2618c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2619c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#2",
2620c64779e2SAndrii Nakryiko },
2621c64779e2SAndrii Nakryiko 
2622c64779e2SAndrii Nakryiko {
2623c64779e2SAndrii Nakryiko 	.descr = "func proto (Invalid return type)",
2624c64779e2SAndrii Nakryiko 	.raw_types = {
2625c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2626c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2627c64779e2SAndrii Nakryiko 		/* <bad_ret_type> (*)(int, unsigned int) */
2628c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(100, 2),			/* [3] */
2629c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2630c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2631c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2632c64779e2SAndrii Nakryiko 	},
2633c64779e2SAndrii Nakryiko 	.str_sec = "",
2634c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2635c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2636c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2637c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2638c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2639c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2640c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2641c64779e2SAndrii Nakryiko 	.max_entries = 4,
2642c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2643c64779e2SAndrii Nakryiko 	.err_str = "Invalid return type",
2644c64779e2SAndrii Nakryiko },
2645c64779e2SAndrii Nakryiko 
2646c64779e2SAndrii Nakryiko {
2647c64779e2SAndrii Nakryiko 	.descr = "func proto (with func name)",
2648c64779e2SAndrii Nakryiko 	.raw_types = {
2649c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2650c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2651c64779e2SAndrii Nakryiko 		/* void func_proto(int, unsigned int) */
2652c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 2), 0),	/* [3] */
2653c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2654c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2655c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2656c64779e2SAndrii Nakryiko 	},
2657c64779e2SAndrii Nakryiko 	.str_sec = "\0func_proto",
2658c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0func_proto"),
2659c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2660c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2661c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2662c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2663c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2664c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2665c64779e2SAndrii Nakryiko 	.max_entries = 4,
2666c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2667c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2668c64779e2SAndrii Nakryiko },
2669c64779e2SAndrii Nakryiko 
2670c64779e2SAndrii Nakryiko {
2671c64779e2SAndrii Nakryiko 	.descr = "func proto (const void arg)",
2672c64779e2SAndrii Nakryiko 	.raw_types = {
2673c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2674c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2675c64779e2SAndrii Nakryiko 		/* void (*)(const void) */
2676c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 1),			/* [3] */
2677c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 4),
2678c64779e2SAndrii Nakryiko 		BTF_CONST_ENC(0),				/* [4] */
2679c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2680c64779e2SAndrii Nakryiko 	},
2681c64779e2SAndrii Nakryiko 	.str_sec = "",
2682c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2683c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2684c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2685c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2686c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2687c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2688c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2689c64779e2SAndrii Nakryiko 	.max_entries = 4,
2690c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2691c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#1",
2692c64779e2SAndrii Nakryiko },
2693c64779e2SAndrii Nakryiko 
2694c64779e2SAndrii Nakryiko {
2695c64779e2SAndrii Nakryiko 	.descr = "func (void func(int a, unsigned int b))",
2696c64779e2SAndrii Nakryiko 	.raw_types = {
2697c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2698c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2699c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b) */
2700c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2701c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2702c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2703c64779e2SAndrii Nakryiko 		/* void func(int a, unsigned int b) */
2704c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [4] */
2705c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2706c64779e2SAndrii Nakryiko 	},
2707c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b\0func",
2708c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b\0func"),
2709c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2710c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2711c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2712c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2713c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2714c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2715c64779e2SAndrii Nakryiko 	.max_entries = 4,
2716c64779e2SAndrii Nakryiko },
2717c64779e2SAndrii Nakryiko 
2718c64779e2SAndrii Nakryiko {
2719c64779e2SAndrii Nakryiko 	.descr = "func (No func name)",
2720c64779e2SAndrii Nakryiko 	.raw_types = {
2721c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2722c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2723c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b) */
2724c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2725c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2726c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2727c64779e2SAndrii Nakryiko 		/* void <no_name>(int a, unsigned int b) */
2728c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(0, 3),				/* [4] */
2729c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2730c64779e2SAndrii Nakryiko 	},
2731c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b",
2732c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b"),
2733c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2734c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2735c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2736c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2737c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2738c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2739c64779e2SAndrii Nakryiko 	.max_entries = 4,
2740c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2741c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2742c64779e2SAndrii Nakryiko },
2743c64779e2SAndrii Nakryiko 
2744c64779e2SAndrii Nakryiko {
2745c64779e2SAndrii Nakryiko 	.descr = "func (Invalid func name)",
2746c64779e2SAndrii Nakryiko 	.raw_types = {
2747c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2748c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2749c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b) */
2750c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2751c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2752c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2753c64779e2SAndrii Nakryiko 		/* void !!!(int a, unsigned int b) */
2754c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [4] */
2755c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2756c64779e2SAndrii Nakryiko 	},
2757c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b\0!!!",
2758c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b\0!!!"),
2759c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2760c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2761c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2762c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2763c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2764c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2765c64779e2SAndrii Nakryiko 	.max_entries = 4,
2766c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2767c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2768c64779e2SAndrii Nakryiko },
2769c64779e2SAndrii Nakryiko 
2770c64779e2SAndrii Nakryiko {
2771c64779e2SAndrii Nakryiko 	.descr = "func (Some arg has no name)",
2772c64779e2SAndrii Nakryiko 	.raw_types = {
2773c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2774c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2775c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int) */
2776c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2777c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2778c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2779c64779e2SAndrii Nakryiko 		/* void func(int a, unsigned int) */
2780c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [4] */
2781c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2782c64779e2SAndrii Nakryiko 	},
2783c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0func",
2784c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0func"),
2785c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2786c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2787c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2788c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2789c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2790c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2791c64779e2SAndrii Nakryiko 	.max_entries = 4,
2792c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2793c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#2",
2794c64779e2SAndrii Nakryiko },
2795c64779e2SAndrii Nakryiko 
2796c64779e2SAndrii Nakryiko {
2797c64779e2SAndrii Nakryiko 	.descr = "func (Non zero vlen)",
2798c64779e2SAndrii Nakryiko 	.raw_types = {
2799c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2800c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2801c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b) */
2802c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2803c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2804c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2805c64779e2SAndrii Nakryiko 		/* void func(int a, unsigned int b) */
2806c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 2), 3), 	/* [4] */
2807c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2808c64779e2SAndrii Nakryiko 	},
2809c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b\0func",
2810c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b\0func"),
2811c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2812c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2813c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2814c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2815c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2816c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2817c64779e2SAndrii Nakryiko 	.max_entries = 4,
2818c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2819c64779e2SAndrii Nakryiko 	.err_str = "Invalid func linkage",
2820c64779e2SAndrii Nakryiko },
2821c64779e2SAndrii Nakryiko 
2822c64779e2SAndrii Nakryiko {
2823c64779e2SAndrii Nakryiko 	.descr = "func (Not referring to FUNC_PROTO)",
2824c64779e2SAndrii Nakryiko 	.raw_types = {
2825c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2826c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 1),			/* [2] */
2827c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2828c64779e2SAndrii Nakryiko 	},
2829c64779e2SAndrii Nakryiko 	.str_sec = "\0func",
2830c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0func"),
2831c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2832c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2833c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2834c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2835c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2836c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2837c64779e2SAndrii Nakryiko 	.max_entries = 4,
2838c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2839c64779e2SAndrii Nakryiko 	.err_str = "Invalid type_id",
2840c64779e2SAndrii Nakryiko },
2841c64779e2SAndrii Nakryiko 
2842c64779e2SAndrii Nakryiko {
2843c64779e2SAndrii Nakryiko 	.descr = "invalid int kind_flag",
2844c64779e2SAndrii Nakryiko 	.raw_types = {
2845c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2846c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT, 1, 0), 4),	/* [2] */
2847c64779e2SAndrii Nakryiko 		BTF_INT_ENC(0, 0, 32),
2848c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2849c64779e2SAndrii Nakryiko 	},
2850c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2851c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2852c64779e2SAndrii Nakryiko 	.map_name = "int_type_check_btf",
2853c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2854c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2855c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2856c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2857c64779e2SAndrii Nakryiko 	.max_entries = 4,
2858c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2859c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2860c64779e2SAndrii Nakryiko },
2861c64779e2SAndrii Nakryiko 
2862c64779e2SAndrii Nakryiko {
2863c64779e2SAndrii Nakryiko 	.descr = "invalid ptr kind_flag",
2864c64779e2SAndrii Nakryiko 	.raw_types = {
2865c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2866c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 1, 0), 1),	/* [2] */
2867c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2868c64779e2SAndrii Nakryiko 	},
2869c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2870c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2871c64779e2SAndrii Nakryiko 	.map_name = "ptr_type_check_btf",
2872c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2873c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2874c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2875c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2876c64779e2SAndrii Nakryiko 	.max_entries = 4,
2877c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2878c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2879c64779e2SAndrii Nakryiko },
2880c64779e2SAndrii Nakryiko 
2881c64779e2SAndrii Nakryiko {
2882c64779e2SAndrii Nakryiko 	.descr = "invalid array kind_flag",
2883c64779e2SAndrii Nakryiko 	.raw_types = {
2884c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2885c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY, 1, 0), 0),	/* [2] */
2886c64779e2SAndrii Nakryiko 		BTF_ARRAY_ENC(1, 1, 1),
2887c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2888c64779e2SAndrii Nakryiko 	},
2889c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2890c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2891c64779e2SAndrii Nakryiko 	.map_name = "array_type_check_btf",
2892c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2893c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2894c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2895c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2896c64779e2SAndrii Nakryiko 	.max_entries = 4,
2897c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2898c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2899c64779e2SAndrii Nakryiko },
2900c64779e2SAndrii Nakryiko 
2901c64779e2SAndrii Nakryiko {
2902c64779e2SAndrii Nakryiko 	.descr = "invalid enum kind_flag",
2903c64779e2SAndrii Nakryiko 	.raw_types = {
2904c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2905c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 1, 1), 4),	/* [2] */
2906c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
2907c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2908c64779e2SAndrii Nakryiko 	},
2909c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
2910c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2911c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2912c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2913c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2914c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2915c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2916c64779e2SAndrii Nakryiko 	.max_entries = 4,
2917c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2918c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2919c64779e2SAndrii Nakryiko },
2920c64779e2SAndrii Nakryiko 
2921c64779e2SAndrii Nakryiko {
2922c64779e2SAndrii Nakryiko 	.descr = "valid fwd kind_flag",
2923c64779e2SAndrii Nakryiko 	.raw_types = {
2924c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2925c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2926c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0),	/* [2] */
2927c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2928c64779e2SAndrii Nakryiko 	},
2929c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
2930c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2931c64779e2SAndrii Nakryiko 	.map_name = "fwd_type_check_btf",
2932c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2933c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2934c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2935c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2936c64779e2SAndrii Nakryiko 	.max_entries = 4,
2937c64779e2SAndrii Nakryiko },
2938c64779e2SAndrii Nakryiko 
2939c64779e2SAndrii Nakryiko {
2940c64779e2SAndrii Nakryiko 	.descr = "invalid typedef kind_flag",
2941c64779e2SAndrii Nakryiko 	.raw_types = {
2942c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2943c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2944c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_TYPEDEF, 1, 0), 1),	/* [2] */
2945c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2946c64779e2SAndrii Nakryiko 	},
2947c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
2948c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2949c64779e2SAndrii Nakryiko 	.map_name = "typedef_type_check_btf",
2950c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2951c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2952c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2953c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2954c64779e2SAndrii Nakryiko 	.max_entries = 4,
2955c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2956c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2957c64779e2SAndrii Nakryiko },
2958c64779e2SAndrii Nakryiko 
2959c64779e2SAndrii Nakryiko {
2960c64779e2SAndrii Nakryiko 	.descr = "invalid volatile kind_flag",
2961c64779e2SAndrii Nakryiko 	.raw_types = {
2962c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
2963c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 1, 0), 1),	/* [2] */
2964c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2965c64779e2SAndrii Nakryiko 	},
2966c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2967c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2968c64779e2SAndrii Nakryiko 	.map_name = "volatile_type_check_btf",
2969c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2970c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2971c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2972c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2973c64779e2SAndrii Nakryiko 	.max_entries = 4,
2974c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2975c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2976c64779e2SAndrii Nakryiko },
2977c64779e2SAndrii Nakryiko 
2978c64779e2SAndrii Nakryiko {
2979c64779e2SAndrii Nakryiko 	.descr = "invalid const kind_flag",
2980c64779e2SAndrii Nakryiko 	.raw_types = {
2981c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2982c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 1, 0), 1),	/* [2] */
2983c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2984c64779e2SAndrii Nakryiko 	},
2985c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2986c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2987c64779e2SAndrii Nakryiko 	.map_name = "const_type_check_btf",
2988c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2989c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2990c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2991c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2992c64779e2SAndrii Nakryiko 	.max_entries = 4,
2993c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2994c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2995c64779e2SAndrii Nakryiko },
2996c64779e2SAndrii Nakryiko 
2997c64779e2SAndrii Nakryiko {
2998c64779e2SAndrii Nakryiko 	.descr = "invalid restrict kind_flag",
2999c64779e2SAndrii Nakryiko 	.raw_types = {
3000c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3001c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_RESTRICT, 1, 0), 1),	/* [2] */
3002c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3003c64779e2SAndrii Nakryiko 	},
3004c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
3005c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3006c64779e2SAndrii Nakryiko 	.map_name = "restrict_type_check_btf",
3007c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3008c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3009c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3010c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3011c64779e2SAndrii Nakryiko 	.max_entries = 4,
3012c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3013c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
3014c64779e2SAndrii Nakryiko },
3015c64779e2SAndrii Nakryiko 
3016c64779e2SAndrii Nakryiko {
3017c64779e2SAndrii Nakryiko 	.descr = "invalid func kind_flag",
3018c64779e2SAndrii Nakryiko 	.raw_types = {
3019c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3020c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 0), 0),	/* [2] */
3021c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC, 1, 0), 2),	/* [3] */
3022c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3023c64779e2SAndrii Nakryiko 	},
3024c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3025c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3026c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
3027c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3028c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3029c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3030c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3031c64779e2SAndrii Nakryiko 	.max_entries = 4,
3032c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3033c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
3034c64779e2SAndrii Nakryiko },
3035c64779e2SAndrii Nakryiko 
3036c64779e2SAndrii Nakryiko {
3037c64779e2SAndrii Nakryiko 	.descr = "invalid func_proto kind_flag",
3038c64779e2SAndrii Nakryiko 	.raw_types = {
3039c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3040c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 1, 0), 0),	/* [2] */
3041c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3042c64779e2SAndrii Nakryiko 	},
3043c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
3044c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3045c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
3046c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3047c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3048c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3049c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3050c64779e2SAndrii Nakryiko 	.max_entries = 4,
3051c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3052c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
3053c64779e2SAndrii Nakryiko },
3054c64779e2SAndrii Nakryiko 
3055c64779e2SAndrii Nakryiko {
3056c64779e2SAndrii Nakryiko 	.descr = "valid struct, kind_flag, bitfield_size = 0",
3057c64779e2SAndrii Nakryiko 	.raw_types = {
3058c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3059c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 8),	/* [2] */
3060c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(0, 0)),
3061c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(0, 32)),
3062c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3063c64779e2SAndrii Nakryiko 	},
3064c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3065c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3066c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3067c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3068c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3069c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3070c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3071c64779e2SAndrii Nakryiko 	.max_entries = 4,
3072c64779e2SAndrii Nakryiko },
3073c64779e2SAndrii Nakryiko 
3074c64779e2SAndrii Nakryiko {
3075c64779e2SAndrii Nakryiko 	.descr = "valid struct, kind_flag, int member, bitfield_size != 0",
3076c64779e2SAndrii Nakryiko 	.raw_types = {
3077c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3078c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),	/* [2] */
3079c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3080c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 4)),
3081c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3082c64779e2SAndrii Nakryiko 	},
3083c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3084c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3085c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3086c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3087c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3088c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3089c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3090c64779e2SAndrii Nakryiko 	.max_entries = 4,
3091c64779e2SAndrii Nakryiko },
3092c64779e2SAndrii Nakryiko 
3093c64779e2SAndrii Nakryiko {
3094c64779e2SAndrii Nakryiko 	.descr = "valid union, kind_flag, int member, bitfield_size != 0",
3095c64779e2SAndrii Nakryiko 	.raw_types = {
3096c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3097c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4),	/* [2] */
3098c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3099c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3100c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3101c64779e2SAndrii Nakryiko 	},
3102c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3103c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3104c64779e2SAndrii Nakryiko 	.map_name = "union_type_check_btf",
3105c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3106c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3107c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3108c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3109c64779e2SAndrii Nakryiko 	.max_entries = 4,
3110c64779e2SAndrii Nakryiko },
3111c64779e2SAndrii Nakryiko 
3112c64779e2SAndrii Nakryiko {
3113c64779e2SAndrii Nakryiko 	.descr = "valid struct, kind_flag, enum member, bitfield_size != 0",
3114c64779e2SAndrii Nakryiko 	.raw_types = {
3115c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3116c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3117c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3118c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),/* [3] */
3119c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3120c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 4)),
3121c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3122c64779e2SAndrii Nakryiko 	},
3123c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C"),
3124c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3125c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3126c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3127c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3128c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3129c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3130c64779e2SAndrii Nakryiko 	.max_entries = 4,
3131c64779e2SAndrii Nakryiko },
3132c64779e2SAndrii Nakryiko 
3133c64779e2SAndrii Nakryiko {
3134c64779e2SAndrii Nakryiko 	.descr = "valid union, kind_flag, enum member, bitfield_size != 0",
3135c64779e2SAndrii Nakryiko 	.raw_types = {
3136c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3137c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3138c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3139c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4),	/* [3] */
3140c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3141c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3142c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3143c64779e2SAndrii Nakryiko 	},
3144c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C"),
3145c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3146c64779e2SAndrii Nakryiko 	.map_name = "union_type_check_btf",
3147c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3148c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3149c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3150c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3151c64779e2SAndrii Nakryiko 	.max_entries = 4,
3152c64779e2SAndrii Nakryiko },
3153c64779e2SAndrii Nakryiko 
3154c64779e2SAndrii Nakryiko {
3155c64779e2SAndrii Nakryiko 	.descr = "valid struct, kind_flag, typedef member, bitfield_size != 0",
3156c64779e2SAndrii Nakryiko 	.raw_types = {
3157c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3158c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3159c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3160c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),/* [3] */
3161c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, BTF_MEMBER_OFFSET(4, 0)),
3162c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 5, BTF_MEMBER_OFFSET(4, 4)),
3163c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),				/* [4] */
3164c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),				/* [5] */
3165c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3166c64779e2SAndrii Nakryiko 	},
3167c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C\0D\0E"),
3168c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3169c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3170c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3171c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3172c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3173c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3174c64779e2SAndrii Nakryiko 	.max_entries = 4,
3175c64779e2SAndrii Nakryiko },
3176c64779e2SAndrii Nakryiko 
3177c64779e2SAndrii Nakryiko {
3178c64779e2SAndrii Nakryiko 	.descr = "valid union, kind_flag, typedef member, bitfield_size != 0",
3179c64779e2SAndrii Nakryiko 	.raw_types = {
3180c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3181c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3182c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3183c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4),	/* [3] */
3184c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, BTF_MEMBER_OFFSET(4, 0)),
3185c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 5, BTF_MEMBER_OFFSET(4, 0)),
3186c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),				/* [4] */
3187c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),				/* [5] */
3188c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3189c64779e2SAndrii Nakryiko 	},
3190c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C\0D\0E"),
3191c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3192c64779e2SAndrii Nakryiko 	.map_name = "union_type_check_btf",
3193c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3194c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3195c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3196c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3197c64779e2SAndrii Nakryiko 	.max_entries = 4,
3198c64779e2SAndrii Nakryiko },
3199c64779e2SAndrii Nakryiko 
3200c64779e2SAndrii Nakryiko {
3201c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, bitfield_size greater than struct size",
3202c64779e2SAndrii Nakryiko 	.raw_types = {
3203c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3204c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),	/* [2] */
3205c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 0)),
3206c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 20)),
3207c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3208c64779e2SAndrii Nakryiko 	},
3209c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3210c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3211c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3212c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3213c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3214c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3215c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3216c64779e2SAndrii Nakryiko 	.max_entries = 4,
3217c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3218c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
3219c64779e2SAndrii Nakryiko },
3220c64779e2SAndrii Nakryiko 
3221c64779e2SAndrii Nakryiko {
3222c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, bitfield base_type int not regular",
3223c64779e2SAndrii Nakryiko 	.raw_types = {
3224c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3225c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 20, 4),			/* [2] */
3226c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),	/* [3] */
3227c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(20, 0)),
3228c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(20, 20)),
3229c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3230c64779e2SAndrii Nakryiko 	},
3231c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3232c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3233c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3234c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3235c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3236c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3237c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3238c64779e2SAndrii Nakryiko 	.max_entries = 4,
3239c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3240c64779e2SAndrii Nakryiko 	.err_str = "Invalid member base type",
3241c64779e2SAndrii Nakryiko },
3242c64779e2SAndrii Nakryiko 
3243c64779e2SAndrii Nakryiko {
3244c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, base_type int not regular",
3245c64779e2SAndrii Nakryiko 	.raw_types = {
3246c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3247c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 12, 4),			/* [2] */
3248c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),	/* [3] */
3249c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(8, 0)),
3250c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(8, 8)),
3251c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3252c64779e2SAndrii Nakryiko 	},
3253c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3254c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3255c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3256c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3257c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3258c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3259c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3260c64779e2SAndrii Nakryiko 	.max_entries = 4,
3261c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3262c64779e2SAndrii Nakryiko 	.err_str = "Invalid member base type",
3263c64779e2SAndrii Nakryiko },
3264c64779e2SAndrii Nakryiko 
3265c64779e2SAndrii Nakryiko {
3266c64779e2SAndrii Nakryiko 	.descr = "invalid union, kind_flag, bitfield_size greater than struct size",
3267c64779e2SAndrii Nakryiko 	.raw_types = {
3268c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3269c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 2),	/* [2] */
3270c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(8, 0)),
3271c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 0)),
3272c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3273c64779e2SAndrii Nakryiko 	},
3274c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3275c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3276c64779e2SAndrii Nakryiko 	.map_name = "union_type_check_btf",
3277c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3278c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3279c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3280c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3281c64779e2SAndrii Nakryiko 	.max_entries = 4,
3282c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3283c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
3284c64779e2SAndrii Nakryiko },
3285c64779e2SAndrii Nakryiko 
3286c64779e2SAndrii Nakryiko {
3287c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, int member, bitfield_size = 0, wrong byte alignment",
3288c64779e2SAndrii Nakryiko 	.raw_types = {
3289c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3290c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [2] */
3291c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 12),	/* [3] */
3292c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3293c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 36)),
3294c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3295c64779e2SAndrii Nakryiko 	},
3296c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3297c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3298c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3299c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3300c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3301c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3302c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3303c64779e2SAndrii Nakryiko 	.max_entries = 4,
3304c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3305c64779e2SAndrii Nakryiko 	.err_str = "Invalid member offset",
3306c64779e2SAndrii Nakryiko },
3307c64779e2SAndrii Nakryiko 
3308c64779e2SAndrii Nakryiko {
3309c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, enum member, bitfield_size = 0, wrong byte alignment",
3310c64779e2SAndrii Nakryiko 	.raw_types = {
3311c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3312c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [2] */
3313c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3314c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3315c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 12),	/* [3] */
3316c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3317c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 36)),
3318c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3319c64779e2SAndrii Nakryiko 	},
3320c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C"),
3321c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3322c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3323c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3324c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3325c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3326c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3327c64779e2SAndrii Nakryiko 	.max_entries = 4,
3328c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3329c64779e2SAndrii Nakryiko 	.err_str = "Invalid member offset",
3330c64779e2SAndrii Nakryiko },
3331c64779e2SAndrii Nakryiko 
3332c64779e2SAndrii Nakryiko {
3333c64779e2SAndrii Nakryiko 	.descr = "128-bit int",
3334c64779e2SAndrii Nakryiko 	.raw_types = {
3335c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3336c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16),		/* [2] */
3337c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3338c64779e2SAndrii Nakryiko 	},
3339c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3340c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3341c64779e2SAndrii Nakryiko 	.map_name = "int_type_check_btf",
3342c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3343c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3344c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3345c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3346c64779e2SAndrii Nakryiko 	.max_entries = 4,
3347c64779e2SAndrii Nakryiko },
3348c64779e2SAndrii Nakryiko 
3349c64779e2SAndrii Nakryiko {
3350c64779e2SAndrii Nakryiko 	.descr = "struct, 128-bit int member",
3351c64779e2SAndrii Nakryiko 	.raw_types = {
3352c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3353c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16),		/* [2] */
3354c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 16),	/* [3] */
3355c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3356c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3357c64779e2SAndrii Nakryiko 	},
3358c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3359c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3360c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3361c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3362c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3363c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3364c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3365c64779e2SAndrii Nakryiko 	.max_entries = 4,
3366c64779e2SAndrii Nakryiko },
3367c64779e2SAndrii Nakryiko 
3368c64779e2SAndrii Nakryiko {
3369c64779e2SAndrii Nakryiko 	.descr = "struct, 120-bit int member bitfield",
3370c64779e2SAndrii Nakryiko 	.raw_types = {
3371c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3372c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 120, 16),		/* [2] */
3373c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 16),	/* [3] */
3374c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3375c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3376c64779e2SAndrii Nakryiko 	},
3377c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3378c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3379c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3380c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3381c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3382c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3383c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3384c64779e2SAndrii Nakryiko 	.max_entries = 4,
3385c64779e2SAndrii Nakryiko },
3386c64779e2SAndrii Nakryiko 
3387c64779e2SAndrii Nakryiko {
3388c64779e2SAndrii Nakryiko 	.descr = "struct, kind_flag, 128-bit int member",
3389c64779e2SAndrii Nakryiko 	.raw_types = {
3390c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3391c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16),		/* [2] */
3392c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 16),	/* [3] */
3393c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3394c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3395c64779e2SAndrii Nakryiko 	},
3396c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3397c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3398c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3399c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3400c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3401c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3402c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3403c64779e2SAndrii Nakryiko 	.max_entries = 4,
3404c64779e2SAndrii Nakryiko },
3405c64779e2SAndrii Nakryiko 
3406c64779e2SAndrii Nakryiko {
3407c64779e2SAndrii Nakryiko 	.descr = "struct, kind_flag, 120-bit int member bitfield",
3408c64779e2SAndrii Nakryiko 	.raw_types = {
3409c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3410c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16),		/* [2] */
3411c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 16),	/* [3] */
3412c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(120, 0)),
3413c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3414c64779e2SAndrii Nakryiko 	},
3415c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3416c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3417c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3418c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3419c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3420c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3421c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3422c64779e2SAndrii Nakryiko 	.max_entries = 4,
3423c64779e2SAndrii Nakryiko },
3424c64779e2SAndrii Nakryiko /*
3425c64779e2SAndrii Nakryiko  * typedef int arr_t[16];
3426c64779e2SAndrii Nakryiko  * struct s {
3427c64779e2SAndrii Nakryiko  *	arr_t *a;
3428c64779e2SAndrii Nakryiko  * };
3429c64779e2SAndrii Nakryiko  */
3430c64779e2SAndrii Nakryiko {
3431c64779e2SAndrii Nakryiko 	.descr = "struct->ptr->typedef->array->int size resolution",
3432c64779e2SAndrii Nakryiko 	.raw_types = {
3433c64779e2SAndrii Nakryiko 		BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [1] */
3434c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3435c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(3),					/* [2] */
3436c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
3437c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(5, 5, 16),			/* [4] */
3438c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [5] */
3439c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3440c64779e2SAndrii Nakryiko 	},
3441c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0s\0a\0arr_t"),
3442c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3443c64779e2SAndrii Nakryiko 	.map_name = "ptr_mod_chain_size_resolve_map",
3444c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3445c64779e2SAndrii Nakryiko 	.value_size = sizeof(int) * 16,
3446c64779e2SAndrii Nakryiko 	.key_type_id = 5 /* int */,
3447c64779e2SAndrii Nakryiko 	.value_type_id = 3 /* arr_t */,
3448c64779e2SAndrii Nakryiko 	.max_entries = 4,
3449c64779e2SAndrii Nakryiko },
3450c64779e2SAndrii Nakryiko /*
3451c64779e2SAndrii Nakryiko  * typedef int arr_t[16][8][4];
3452c64779e2SAndrii Nakryiko  * struct s {
3453c64779e2SAndrii Nakryiko  *	arr_t *a;
3454c64779e2SAndrii Nakryiko  * };
3455c64779e2SAndrii Nakryiko  */
3456c64779e2SAndrii Nakryiko {
3457c64779e2SAndrii Nakryiko 	.descr = "struct->ptr->typedef->multi-array->int size resolution",
3458c64779e2SAndrii Nakryiko 	.raw_types = {
3459c64779e2SAndrii Nakryiko 		BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [1] */
3460c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3461c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(3),					/* [2] */
3462c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
3463c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(5, 7, 16),			/* [4] */
3464c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(6, 7, 8),			/* [5] */
3465c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(7, 7, 4),			/* [6] */
3466c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [7] */
3467c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3468c64779e2SAndrii Nakryiko 	},
3469c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0s\0a\0arr_t"),
3470c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3471c64779e2SAndrii Nakryiko 	.map_name = "multi_arr_size_resolve_map",
3472c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3473c64779e2SAndrii Nakryiko 	.value_size = sizeof(int) * 16 * 8 * 4,
3474c64779e2SAndrii Nakryiko 	.key_type_id = 7 /* int */,
3475c64779e2SAndrii Nakryiko 	.value_type_id = 3 /* arr_t */,
3476c64779e2SAndrii Nakryiko 	.max_entries = 4,
3477c64779e2SAndrii Nakryiko },
3478c64779e2SAndrii Nakryiko /*
3479c64779e2SAndrii Nakryiko  * typedef int int_t;
3480c64779e2SAndrii Nakryiko  * typedef int_t arr3_t[4];
3481c64779e2SAndrii Nakryiko  * typedef arr3_t arr2_t[8];
3482c64779e2SAndrii Nakryiko  * typedef arr2_t arr1_t[16];
3483c64779e2SAndrii Nakryiko  * struct s {
3484c64779e2SAndrii Nakryiko  *	arr1_t *a;
3485c64779e2SAndrii Nakryiko  * };
3486c64779e2SAndrii Nakryiko  */
3487c64779e2SAndrii Nakryiko {
3488c64779e2SAndrii Nakryiko 	.descr = "typedef/multi-arr mix size resolution",
3489c64779e2SAndrii Nakryiko 	.raw_types = {
3490c64779e2SAndrii Nakryiko 		BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [1] */
3491c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3492c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(3),					/* [2] */
3493c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
3494c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(5, 10, 16),			/* [4] */
3495c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 6),			/* [5] */
3496c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(7, 10, 8),			/* [6] */
3497c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 8),			/* [7] */
3498c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(9, 10, 4),			/* [8] */
3499c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 10),			/* [9] */
3500c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [10] */
3501c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3502c64779e2SAndrii Nakryiko 	},
3503c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0s\0a\0arr1_t\0arr2_t\0arr3_t\0int_t"),
3504c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3505c64779e2SAndrii Nakryiko 	.map_name = "typedef_arra_mix_size_resolve_map",
3506c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3507c64779e2SAndrii Nakryiko 	.value_size = sizeof(int) * 16 * 8 * 4,
3508c64779e2SAndrii Nakryiko 	.key_type_id = 10 /* int */,
3509c64779e2SAndrii Nakryiko 	.value_type_id = 3 /* arr_t */,
3510c64779e2SAndrii Nakryiko 	.max_entries = 4,
3511c64779e2SAndrii Nakryiko },
351213ca51d5SYonghong Song /*
351313ca51d5SYonghong Song  * elf .rodata section size 4 and btf .rodata section vlen 0.
351413ca51d5SYonghong Song  */
351513ca51d5SYonghong Song {
351613ca51d5SYonghong Song 	.descr = "datasec: vlen == 0",
351713ca51d5SYonghong Song 	.raw_types = {
351813ca51d5SYonghong Song 		/* int */
351913ca51d5SYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
352013ca51d5SYonghong Song 		/* .rodata section */
352113ca51d5SYonghong Song 		BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 0), 4),
352213ca51d5SYonghong Song 								 /* [2] */
352313ca51d5SYonghong Song 		BTF_END_RAW,
352413ca51d5SYonghong Song 	},
352513ca51d5SYonghong Song 	BTF_STR_SEC("\0.rodata"),
352613ca51d5SYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
352713ca51d5SYonghong Song 	.key_size = sizeof(int),
352813ca51d5SYonghong Song 	.value_size = sizeof(int),
352913ca51d5SYonghong Song 	.key_type_id = 1,
353013ca51d5SYonghong Song 	.value_type_id = 1,
353113ca51d5SYonghong Song 	.max_entries = 1,
353213ca51d5SYonghong Song },
3533c64779e2SAndrii Nakryiko 
35347e72aad3SIlya Leoshkevich {
35357e72aad3SIlya Leoshkevich 	.descr = "float test #1, well-formed",
35367e72aad3SIlya Leoshkevich 	.raw_types = {
35377e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
35387e72aad3SIlya Leoshkevich 								/* [1] */
35397e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 2),		/* [2] */
35407e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 4),		/* [3] */
35417e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 8),		/* [4] */
35427e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 12),		/* [5] */
35437e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 16),		/* [6] */
35447e72aad3SIlya Leoshkevich 		BTF_STRUCT_ENC(NAME_TBD, 5, 48),		/* [7] */
35457e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
35467e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 3, 32),
35477e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 4, 64),
35487e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 5, 128),
35497e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 6, 256),
35507e72aad3SIlya Leoshkevich 		BTF_END_RAW,
35517e72aad3SIlya Leoshkevich 	},
35527e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0_Float16\0float\0double\0_Float80\0long_double"
35537e72aad3SIlya Leoshkevich 		    "\0floats\0a\0b\0c\0d\0e"),
35547e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
35557e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
35567e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
35577e72aad3SIlya Leoshkevich 	.value_size = 48,
35587e72aad3SIlya Leoshkevich 	.key_type_id = 1,
35597e72aad3SIlya Leoshkevich 	.value_type_id = 7,
35607e72aad3SIlya Leoshkevich 	.max_entries = 1,
35617e72aad3SIlya Leoshkevich },
35627e72aad3SIlya Leoshkevich {
35637e72aad3SIlya Leoshkevich 	.descr = "float test #2, invalid vlen",
35647e72aad3SIlya Leoshkevich 	.raw_types = {
35657e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
35667e72aad3SIlya Leoshkevich 								/* [1] */
35677e72aad3SIlya Leoshkevich 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 1), 4),
35687e72aad3SIlya Leoshkevich 								/* [2] */
35697e72aad3SIlya Leoshkevich 		BTF_END_RAW,
35707e72aad3SIlya Leoshkevich 	},
35717e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float"),
35727e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
35737e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
35747e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
35757e72aad3SIlya Leoshkevich 	.value_size = 4,
35767e72aad3SIlya Leoshkevich 	.key_type_id = 1,
35777e72aad3SIlya Leoshkevich 	.value_type_id = 2,
35787e72aad3SIlya Leoshkevich 	.max_entries = 1,
35797e72aad3SIlya Leoshkevich 	.btf_load_err = true,
35807e72aad3SIlya Leoshkevich 	.err_str = "vlen != 0",
35817e72aad3SIlya Leoshkevich },
35827e72aad3SIlya Leoshkevich {
35837e72aad3SIlya Leoshkevich 	.descr = "float test #3, invalid kind_flag",
35847e72aad3SIlya Leoshkevich 	.raw_types = {
35857e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
35867e72aad3SIlya Leoshkevich 								/* [1] */
35877e72aad3SIlya Leoshkevich 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FLOAT, 1, 0), 4),
35887e72aad3SIlya Leoshkevich 								/* [2] */
35897e72aad3SIlya Leoshkevich 		BTF_END_RAW,
35907e72aad3SIlya Leoshkevich 	},
35917e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float"),
35927e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
35937e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
35947e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
35957e72aad3SIlya Leoshkevich 	.value_size = 4,
35967e72aad3SIlya Leoshkevich 	.key_type_id = 1,
35977e72aad3SIlya Leoshkevich 	.value_type_id = 2,
35987e72aad3SIlya Leoshkevich 	.max_entries = 1,
35997e72aad3SIlya Leoshkevich 	.btf_load_err = true,
36007e72aad3SIlya Leoshkevich 	.err_str = "Invalid btf_info kind_flag",
36017e72aad3SIlya Leoshkevich },
36027e72aad3SIlya Leoshkevich {
36037e72aad3SIlya Leoshkevich 	.descr = "float test #4, member does not fit",
36047e72aad3SIlya Leoshkevich 	.raw_types = {
36057e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
36067e72aad3SIlya Leoshkevich 								/* [1] */
36077e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 4),		/* [2] */
36087e72aad3SIlya Leoshkevich 		BTF_STRUCT_ENC(NAME_TBD, 1, 2),			/* [3] */
36097e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
36107e72aad3SIlya Leoshkevich 		BTF_END_RAW,
36117e72aad3SIlya Leoshkevich 	},
36127e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float\0floats\0x"),
36137e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
36147e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
36157e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
36167e72aad3SIlya Leoshkevich 	.value_size = 4,
36177e72aad3SIlya Leoshkevich 	.key_type_id = 1,
36187e72aad3SIlya Leoshkevich 	.value_type_id = 3,
36197e72aad3SIlya Leoshkevich 	.max_entries = 1,
36207e72aad3SIlya Leoshkevich 	.btf_load_err = true,
36217e72aad3SIlya Leoshkevich 	.err_str = "Member exceeds struct_size",
36227e72aad3SIlya Leoshkevich },
36237e72aad3SIlya Leoshkevich {
36247e72aad3SIlya Leoshkevich 	.descr = "float test #5, member is not properly aligned",
36257e72aad3SIlya Leoshkevich 	.raw_types = {
36267e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
36277e72aad3SIlya Leoshkevich 								/* [1] */
36287e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 4),		/* [2] */
36297e72aad3SIlya Leoshkevich 		BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [3] */
36307e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 2, 8),
36317e72aad3SIlya Leoshkevich 		BTF_END_RAW,
36327e72aad3SIlya Leoshkevich 	},
36337e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float\0floats\0x"),
36347e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
36357e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
36367e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
36377e72aad3SIlya Leoshkevich 	.value_size = 4,
36387e72aad3SIlya Leoshkevich 	.key_type_id = 1,
36397e72aad3SIlya Leoshkevich 	.value_type_id = 3,
36407e72aad3SIlya Leoshkevich 	.max_entries = 1,
36417e72aad3SIlya Leoshkevich 	.btf_load_err = true,
36427e72aad3SIlya Leoshkevich 	.err_str = "Member is not properly aligned",
36437e72aad3SIlya Leoshkevich },
36447e72aad3SIlya Leoshkevich {
36457e72aad3SIlya Leoshkevich 	.descr = "float test #6, invalid size",
36467e72aad3SIlya Leoshkevich 	.raw_types = {
36477e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
36487e72aad3SIlya Leoshkevich 								/* [1] */
36497e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 6),		/* [2] */
36507e72aad3SIlya Leoshkevich 		BTF_END_RAW,
36517e72aad3SIlya Leoshkevich 	},
36527e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float"),
36537e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
36547e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
36557e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
36567e72aad3SIlya Leoshkevich 	.value_size = 6,
36577e72aad3SIlya Leoshkevich 	.key_type_id = 1,
36587e72aad3SIlya Leoshkevich 	.value_type_id = 2,
36597e72aad3SIlya Leoshkevich 	.max_entries = 1,
36607e72aad3SIlya Leoshkevich 	.btf_load_err = true,
36617e72aad3SIlya Leoshkevich 	.err_str = "Invalid type_size",
36627e72aad3SIlya Leoshkevich },
36637e72aad3SIlya Leoshkevich 
366435baba7aSYonghong Song {
3665223f903eSYonghong Song 	.descr = "decl_tag test #1, struct/member, well-formed",
366635baba7aSYonghong Song 	.raw_types = {
366735baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
366835baba7aSYonghong Song 		BTF_STRUCT_ENC(0, 2, 8),			/* [2] */
366935baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
367035baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),
3671223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),
3672223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0),
3673223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 1),
367435baba7aSYonghong Song 		BTF_END_RAW,
367535baba7aSYonghong Song 	},
367635baba7aSYonghong Song 	BTF_STR_SEC("\0m1\0m2\0tag1\0tag2\0tag3"),
367735baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
367835baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
367935baba7aSYonghong Song 	.key_size = sizeof(int),
368035baba7aSYonghong Song 	.value_size = 8,
368135baba7aSYonghong Song 	.key_type_id = 1,
368235baba7aSYonghong Song 	.value_type_id = 2,
368335baba7aSYonghong Song 	.max_entries = 1,
368435baba7aSYonghong Song },
368535baba7aSYonghong Song {
3686223f903eSYonghong Song 	.descr = "decl_tag test #2, union/member, well-formed",
368735baba7aSYonghong Song 	.raw_types = {
368835baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
368935baba7aSYonghong Song 		BTF_UNION_ENC(NAME_TBD, 2, 4),			/* [2] */
369035baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
369135baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
3692223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),
3693223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0),
3694223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 1),
369535baba7aSYonghong Song 		BTF_END_RAW,
369635baba7aSYonghong Song 	},
369735baba7aSYonghong Song 	BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"),
369835baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
369935baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
370035baba7aSYonghong Song 	.key_size = sizeof(int),
370135baba7aSYonghong Song 	.value_size = 4,
370235baba7aSYonghong Song 	.key_type_id = 1,
370335baba7aSYonghong Song 	.value_type_id = 2,
370435baba7aSYonghong Song 	.max_entries = 1,
370535baba7aSYonghong Song },
370635baba7aSYonghong Song {
3707223f903eSYonghong Song 	.descr = "decl_tag test #3, variable, well-formed",
370835baba7aSYonghong Song 	.raw_types = {
370935baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
371035baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
371135baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 1),			/* [3] */
3712223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),
3713223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, -1),
371435baba7aSYonghong Song 		BTF_END_RAW,
371535baba7aSYonghong Song 	},
371635baba7aSYonghong Song 	BTF_STR_SEC("\0local\0global\0tag1\0tag2"),
371735baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
371835baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
371935baba7aSYonghong Song 	.key_size = sizeof(int),
372035baba7aSYonghong Song 	.value_size = 4,
372135baba7aSYonghong Song 	.key_type_id = 1,
372235baba7aSYonghong Song 	.value_type_id = 1,
372335baba7aSYonghong Song 	.max_entries = 1,
372435baba7aSYonghong Song },
372535baba7aSYonghong Song {
3726223f903eSYonghong Song 	.descr = "decl_tag test #4, func/parameter, well-formed",
372735baba7aSYonghong Song 	.raw_types = {
372835baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
372935baba7aSYonghong Song 		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
373035baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
373135baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
373235baba7aSYonghong Song 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
3733223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, -1),
3734223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, 0),
3735223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, 1),
373635baba7aSYonghong Song 		BTF_END_RAW,
373735baba7aSYonghong Song 	},
373835baba7aSYonghong Song 	BTF_STR_SEC("\0arg1\0arg2\0f\0tag1\0tag2\0tag3"),
373935baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
374035baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
374135baba7aSYonghong Song 	.key_size = sizeof(int),
374235baba7aSYonghong Song 	.value_size = 4,
374335baba7aSYonghong Song 	.key_type_id = 1,
374435baba7aSYonghong Song 	.value_type_id = 1,
374535baba7aSYonghong Song 	.max_entries = 1,
374635baba7aSYonghong Song },
374735baba7aSYonghong Song {
3748223f903eSYonghong Song 	.descr = "decl_tag test #5, invalid value",
374935baba7aSYonghong Song 	.raw_types = {
375035baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
375135baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
3752223f903eSYonghong Song 		BTF_DECL_TAG_ENC(0, 2, -1),
375335baba7aSYonghong Song 		BTF_END_RAW,
375435baba7aSYonghong Song 	},
375535baba7aSYonghong Song 	BTF_STR_SEC("\0local\0tag"),
375635baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
375735baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
375835baba7aSYonghong Song 	.key_size = sizeof(int),
375935baba7aSYonghong Song 	.value_size = 4,
376035baba7aSYonghong Song 	.key_type_id = 1,
376135baba7aSYonghong Song 	.value_type_id = 1,
376235baba7aSYonghong Song 	.max_entries = 1,
376335baba7aSYonghong Song 	.btf_load_err = true,
376435baba7aSYonghong Song 	.err_str = "Invalid value",
376535baba7aSYonghong Song },
376635baba7aSYonghong Song {
3767223f903eSYonghong Song 	.descr = "decl_tag test #6, invalid target type",
376835baba7aSYonghong Song 	.raw_types = {
376935baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
3770223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 1, -1),
377135baba7aSYonghong Song 		BTF_END_RAW,
377235baba7aSYonghong Song 	},
377335baba7aSYonghong Song 	BTF_STR_SEC("\0tag1"),
377435baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
377535baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
377635baba7aSYonghong Song 	.key_size = sizeof(int),
377735baba7aSYonghong Song 	.value_size = 4,
377835baba7aSYonghong Song 	.key_type_id = 1,
377935baba7aSYonghong Song 	.value_type_id = 1,
378035baba7aSYonghong Song 	.max_entries = 1,
378135baba7aSYonghong Song 	.btf_load_err = true,
378235baba7aSYonghong Song 	.err_str = "Invalid type",
378335baba7aSYonghong Song },
378435baba7aSYonghong Song {
3785223f903eSYonghong Song 	.descr = "decl_tag test #7, invalid vlen",
378635baba7aSYonghong Song 	.raw_types = {
378735baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
378835baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
3789223f903eSYonghong Song 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 1), 2), (0),
379035baba7aSYonghong Song 		BTF_END_RAW,
379135baba7aSYonghong Song 	},
379235baba7aSYonghong Song 	BTF_STR_SEC("\0local\0tag1"),
379335baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
379435baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
379535baba7aSYonghong Song 	.key_size = sizeof(int),
379635baba7aSYonghong Song 	.value_size = 4,
379735baba7aSYonghong Song 	.key_type_id = 1,
379835baba7aSYonghong Song 	.value_type_id = 1,
379935baba7aSYonghong Song 	.max_entries = 1,
380035baba7aSYonghong Song 	.btf_load_err = true,
380135baba7aSYonghong Song 	.err_str = "vlen != 0",
380235baba7aSYonghong Song },
380335baba7aSYonghong Song {
3804223f903eSYonghong Song 	.descr = "decl_tag test #8, invalid kflag",
380535baba7aSYonghong Song 	.raw_types = {
380635baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
380735baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
3808223f903eSYonghong Song 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 1, 0), 2), (-1),
380935baba7aSYonghong Song 		BTF_END_RAW,
381035baba7aSYonghong Song 	},
381135baba7aSYonghong Song 	BTF_STR_SEC("\0local\0tag1"),
381235baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
381335baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
381435baba7aSYonghong Song 	.key_size = sizeof(int),
381535baba7aSYonghong Song 	.value_size = 4,
381635baba7aSYonghong Song 	.key_type_id = 1,
381735baba7aSYonghong Song 	.value_type_id = 1,
381835baba7aSYonghong Song 	.max_entries = 1,
381935baba7aSYonghong Song 	.btf_load_err = true,
382035baba7aSYonghong Song 	.err_str = "Invalid btf_info kind_flag",
382135baba7aSYonghong Song },
382235baba7aSYonghong Song {
3823223f903eSYonghong Song 	.descr = "decl_tag test #9, var, invalid component_idx",
382435baba7aSYonghong Song 	.raw_types = {
382535baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
382635baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
3827223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0),
382835baba7aSYonghong Song 		BTF_END_RAW,
382935baba7aSYonghong Song 	},
383035baba7aSYonghong Song 	BTF_STR_SEC("\0local\0tag"),
383135baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
383235baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
383335baba7aSYonghong Song 	.key_size = sizeof(int),
383435baba7aSYonghong Song 	.value_size = 4,
383535baba7aSYonghong Song 	.key_type_id = 1,
383635baba7aSYonghong Song 	.value_type_id = 1,
383735baba7aSYonghong Song 	.max_entries = 1,
383835baba7aSYonghong Song 	.btf_load_err = true,
383935baba7aSYonghong Song 	.err_str = "Invalid component_idx",
384035baba7aSYonghong Song },
384135baba7aSYonghong Song {
3842223f903eSYonghong Song 	.descr = "decl_tag test #10, struct member, invalid component_idx",
384335baba7aSYonghong Song 	.raw_types = {
384435baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
384535baba7aSYonghong Song 		BTF_STRUCT_ENC(0, 2, 8),			/* [2] */
384635baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
384735baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),
3848223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 2),
384935baba7aSYonghong Song 		BTF_END_RAW,
385035baba7aSYonghong Song 	},
385135baba7aSYonghong Song 	BTF_STR_SEC("\0m1\0m2\0tag"),
385235baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
385335baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
385435baba7aSYonghong Song 	.key_size = sizeof(int),
385535baba7aSYonghong Song 	.value_size = 8,
385635baba7aSYonghong Song 	.key_type_id = 1,
385735baba7aSYonghong Song 	.value_type_id = 2,
385835baba7aSYonghong Song 	.max_entries = 1,
385935baba7aSYonghong Song 	.btf_load_err = true,
386035baba7aSYonghong Song 	.err_str = "Invalid component_idx",
386135baba7aSYonghong Song },
386235baba7aSYonghong Song {
3863223f903eSYonghong Song 	.descr = "decl_tag test #11, func parameter, invalid component_idx",
386435baba7aSYonghong Song 	.raw_types = {
386535baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
386635baba7aSYonghong Song 		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
386735baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
386835baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
386935baba7aSYonghong Song 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
3870223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, 2),
387135baba7aSYonghong Song 		BTF_END_RAW,
387235baba7aSYonghong Song 	},
387335baba7aSYonghong Song 	BTF_STR_SEC("\0arg1\0arg2\0f\0tag"),
387435baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
387535baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
387635baba7aSYonghong Song 	.key_size = sizeof(int),
387735baba7aSYonghong Song 	.value_size = 4,
387835baba7aSYonghong Song 	.key_type_id = 1,
387935baba7aSYonghong Song 	.value_type_id = 1,
388035baba7aSYonghong Song 	.max_entries = 1,
388135baba7aSYonghong Song 	.btf_load_err = true,
388235baba7aSYonghong Song 	.err_str = "Invalid component_idx",
388335baba7aSYonghong Song },
388435baba7aSYonghong Song {
3885223f903eSYonghong Song 	.descr = "decl_tag test #12, < -1 component_idx",
388635baba7aSYonghong Song 	.raw_types = {
388735baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
388835baba7aSYonghong Song 		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
388935baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
389035baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
389135baba7aSYonghong Song 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
3892223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, -2),
389335baba7aSYonghong Song 		BTF_END_RAW,
389435baba7aSYonghong Song 	},
389535baba7aSYonghong Song 	BTF_STR_SEC("\0arg1\0arg2\0f\0tag"),
389635baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
389735baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
389835baba7aSYonghong Song 	.key_size = sizeof(int),
389935baba7aSYonghong Song 	.value_size = 4,
390035baba7aSYonghong Song 	.key_type_id = 1,
390135baba7aSYonghong Song 	.value_type_id = 1,
390235baba7aSYonghong Song 	.max_entries = 1,
390335baba7aSYonghong Song 	.btf_load_err = true,
390435baba7aSYonghong Song 	.err_str = "Invalid component_idx",
390535baba7aSYonghong Song },
390635baba7aSYonghong Song 
3907c64779e2SAndrii Nakryiko }; /* struct btf_raw_test raw_tests[] */
3908c64779e2SAndrii Nakryiko 
3909c64779e2SAndrii Nakryiko static const char *get_next_str(const char *start, const char *end)
3910c64779e2SAndrii Nakryiko {
3911c64779e2SAndrii Nakryiko 	return start < end - 1 ? start + 1 : NULL;
3912c64779e2SAndrii Nakryiko }
3913c64779e2SAndrii Nakryiko 
3914c64779e2SAndrii Nakryiko static int get_raw_sec_size(const __u32 *raw_types)
3915c64779e2SAndrii Nakryiko {
3916c64779e2SAndrii Nakryiko 	int i;
3917c64779e2SAndrii Nakryiko 
3918c64779e2SAndrii Nakryiko 	for (i = MAX_NR_RAW_U32 - 1;
3919c64779e2SAndrii Nakryiko 	     i >= 0 && raw_types[i] != BTF_END_RAW;
3920c64779e2SAndrii Nakryiko 	     i--)
3921c64779e2SAndrii Nakryiko 		;
3922c64779e2SAndrii Nakryiko 
3923c64779e2SAndrii Nakryiko 	return i < 0 ? i : i * sizeof(raw_types[0]);
3924c64779e2SAndrii Nakryiko }
3925c64779e2SAndrii Nakryiko 
3926c64779e2SAndrii Nakryiko static void *btf_raw_create(const struct btf_header *hdr,
3927c64779e2SAndrii Nakryiko 			    const __u32 *raw_types,
3928c64779e2SAndrii Nakryiko 			    const char *str,
3929c64779e2SAndrii Nakryiko 			    unsigned int str_sec_size,
3930c64779e2SAndrii Nakryiko 			    unsigned int *btf_size,
3931c64779e2SAndrii Nakryiko 			    const char **ret_next_str)
3932c64779e2SAndrii Nakryiko {
3933c64779e2SAndrii Nakryiko 	const char *next_str = str, *end_str = str + str_sec_size;
3934c64779e2SAndrii Nakryiko 	const char **strs_idx = NULL, **tmp_strs_idx;
3935c64779e2SAndrii Nakryiko 	int strs_cap = 0, strs_cnt = 0, next_str_idx = 0;
3936c64779e2SAndrii Nakryiko 	unsigned int size_needed, offset;
3937c64779e2SAndrii Nakryiko 	struct btf_header *ret_hdr;
3938c64779e2SAndrii Nakryiko 	int i, type_sec_size, err = 0;
3939c64779e2SAndrii Nakryiko 	uint32_t *ret_types;
3940c64779e2SAndrii Nakryiko 	void *raw_btf = NULL;
3941c64779e2SAndrii Nakryiko 
3942c64779e2SAndrii Nakryiko 	type_sec_size = get_raw_sec_size(raw_types);
3943c64779e2SAndrii Nakryiko 	if (CHECK(type_sec_size < 0, "Cannot get nr_raw_types"))
3944c64779e2SAndrii Nakryiko 		return NULL;
3945c64779e2SAndrii Nakryiko 
3946c64779e2SAndrii Nakryiko 	size_needed = sizeof(*hdr) + type_sec_size + str_sec_size;
3947c64779e2SAndrii Nakryiko 	raw_btf = malloc(size_needed);
3948c64779e2SAndrii Nakryiko 	if (CHECK(!raw_btf, "Cannot allocate memory for raw_btf"))
3949c64779e2SAndrii Nakryiko 		return NULL;
3950c64779e2SAndrii Nakryiko 
3951c64779e2SAndrii Nakryiko 	/* Copy header */
3952c64779e2SAndrii Nakryiko 	memcpy(raw_btf, hdr, sizeof(*hdr));
3953c64779e2SAndrii Nakryiko 	offset = sizeof(*hdr);
3954c64779e2SAndrii Nakryiko 
3955c64779e2SAndrii Nakryiko 	/* Index strings */
3956c64779e2SAndrii Nakryiko 	while ((next_str = get_next_str(next_str, end_str))) {
3957c64779e2SAndrii Nakryiko 		if (strs_cnt == strs_cap) {
3958c64779e2SAndrii Nakryiko 			strs_cap += max(16, strs_cap / 2);
3959c64779e2SAndrii Nakryiko 			tmp_strs_idx = realloc(strs_idx,
3960c64779e2SAndrii Nakryiko 					       sizeof(*strs_idx) * strs_cap);
3961c64779e2SAndrii Nakryiko 			if (CHECK(!tmp_strs_idx,
3962c64779e2SAndrii Nakryiko 				  "Cannot allocate memory for strs_idx")) {
3963c64779e2SAndrii Nakryiko 				err = -1;
3964c64779e2SAndrii Nakryiko 				goto done;
3965c64779e2SAndrii Nakryiko 			}
3966c64779e2SAndrii Nakryiko 			strs_idx = tmp_strs_idx;
3967c64779e2SAndrii Nakryiko 		}
3968c64779e2SAndrii Nakryiko 		strs_idx[strs_cnt++] = next_str;
3969c64779e2SAndrii Nakryiko 		next_str += strlen(next_str);
3970c64779e2SAndrii Nakryiko 	}
3971c64779e2SAndrii Nakryiko 
3972c64779e2SAndrii Nakryiko 	/* Copy type section */
3973c64779e2SAndrii Nakryiko 	ret_types = raw_btf + offset;
3974c64779e2SAndrii Nakryiko 	for (i = 0; i < type_sec_size / sizeof(raw_types[0]); i++) {
3975c64779e2SAndrii Nakryiko 		if (raw_types[i] == NAME_TBD) {
3976c64779e2SAndrii Nakryiko 			if (CHECK(next_str_idx == strs_cnt,
3977c64779e2SAndrii Nakryiko 				  "Error in getting next_str #%d",
3978c64779e2SAndrii Nakryiko 				  next_str_idx)) {
3979c64779e2SAndrii Nakryiko 				err = -1;
3980c64779e2SAndrii Nakryiko 				goto done;
3981c64779e2SAndrii Nakryiko 			}
3982c64779e2SAndrii Nakryiko 			ret_types[i] = strs_idx[next_str_idx++] - str;
3983c64779e2SAndrii Nakryiko 		} else if (IS_NAME_NTH(raw_types[i])) {
3984c64779e2SAndrii Nakryiko 			int idx = GET_NAME_NTH_IDX(raw_types[i]);
3985c64779e2SAndrii Nakryiko 
3986c64779e2SAndrii Nakryiko 			if (CHECK(idx <= 0 || idx > strs_cnt,
3987c64779e2SAndrii Nakryiko 				  "Error getting string #%d, strs_cnt:%d",
3988c64779e2SAndrii Nakryiko 				  idx, strs_cnt)) {
3989c64779e2SAndrii Nakryiko 				err = -1;
3990c64779e2SAndrii Nakryiko 				goto done;
3991c64779e2SAndrii Nakryiko 			}
3992c64779e2SAndrii Nakryiko 			ret_types[i] = strs_idx[idx-1] - str;
3993c64779e2SAndrii Nakryiko 		} else {
3994c64779e2SAndrii Nakryiko 			ret_types[i] = raw_types[i];
3995c64779e2SAndrii Nakryiko 		}
3996c64779e2SAndrii Nakryiko 	}
3997c64779e2SAndrii Nakryiko 	offset += type_sec_size;
3998c64779e2SAndrii Nakryiko 
3999c64779e2SAndrii Nakryiko 	/* Copy string section */
4000c64779e2SAndrii Nakryiko 	memcpy(raw_btf + offset, str, str_sec_size);
4001c64779e2SAndrii Nakryiko 
4002c64779e2SAndrii Nakryiko 	ret_hdr = (struct btf_header *)raw_btf;
4003c64779e2SAndrii Nakryiko 	ret_hdr->type_len = type_sec_size;
4004c64779e2SAndrii Nakryiko 	ret_hdr->str_off = type_sec_size;
4005c64779e2SAndrii Nakryiko 	ret_hdr->str_len = str_sec_size;
4006c64779e2SAndrii Nakryiko 
4007c64779e2SAndrii Nakryiko 	*btf_size = size_needed;
4008c64779e2SAndrii Nakryiko 	if (ret_next_str)
4009c64779e2SAndrii Nakryiko 		*ret_next_str =
4010c64779e2SAndrii Nakryiko 			next_str_idx < strs_cnt ? strs_idx[next_str_idx] : NULL;
4011c64779e2SAndrii Nakryiko 
4012c64779e2SAndrii Nakryiko done:
4013c64779e2SAndrii Nakryiko 	if (err) {
4014c64779e2SAndrii Nakryiko 		if (raw_btf)
4015c64779e2SAndrii Nakryiko 			free(raw_btf);
4016c64779e2SAndrii Nakryiko 		if (strs_idx)
4017c64779e2SAndrii Nakryiko 			free(strs_idx);
4018c64779e2SAndrii Nakryiko 		return NULL;
4019c64779e2SAndrii Nakryiko 	}
4020c64779e2SAndrii Nakryiko 	return raw_btf;
4021c64779e2SAndrii Nakryiko }
4022c64779e2SAndrii Nakryiko 
4023c64779e2SAndrii Nakryiko static void do_test_raw(unsigned int test_num)
4024c64779e2SAndrii Nakryiko {
4025c64779e2SAndrii Nakryiko 	struct btf_raw_test *test = &raw_tests[test_num - 1];
4026c64779e2SAndrii Nakryiko 	struct bpf_create_map_attr create_attr = {};
4027c64779e2SAndrii Nakryiko 	int map_fd = -1, btf_fd = -1;
4028c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
4029c64779e2SAndrii Nakryiko 	struct btf_header *hdr;
4030c64779e2SAndrii Nakryiko 	void *raw_btf;
4031c64779e2SAndrii Nakryiko 	int err;
4032c64779e2SAndrii Nakryiko 
4033c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
4034c64779e2SAndrii Nakryiko 		return;
4035c64779e2SAndrii Nakryiko 
4036c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl,
4037c64779e2SAndrii Nakryiko 				 test->raw_types,
4038c64779e2SAndrii Nakryiko 				 test->str_sec,
4039c64779e2SAndrii Nakryiko 				 test->str_sec_size,
4040c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
4041c64779e2SAndrii Nakryiko 	if (!raw_btf)
4042c64779e2SAndrii Nakryiko 		return;
4043c64779e2SAndrii Nakryiko 
4044c64779e2SAndrii Nakryiko 	hdr = raw_btf;
4045c64779e2SAndrii Nakryiko 
4046c64779e2SAndrii Nakryiko 	hdr->hdr_len = (int)hdr->hdr_len + test->hdr_len_delta;
4047c64779e2SAndrii Nakryiko 	hdr->type_off = (int)hdr->type_off + test->type_off_delta;
4048c64779e2SAndrii Nakryiko 	hdr->str_off = (int)hdr->str_off + test->str_off_delta;
4049c64779e2SAndrii Nakryiko 	hdr->str_len = (int)hdr->str_len + test->str_len_delta;
4050c64779e2SAndrii Nakryiko 
4051c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
4052c64779e2SAndrii Nakryiko 	btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
4053c64779e2SAndrii Nakryiko 			      btf_log_buf, BTF_LOG_BUF_SIZE,
4054c64779e2SAndrii Nakryiko 			      always_log);
4055c64779e2SAndrii Nakryiko 	free(raw_btf);
4056c64779e2SAndrii Nakryiko 
4057bad2e478SAndrii Nakryiko 	err = ((btf_fd < 0) != test->btf_load_err);
4058c64779e2SAndrii Nakryiko 	if (CHECK(err, "btf_fd:%d test->btf_load_err:%u",
4059c64779e2SAndrii Nakryiko 		  btf_fd, test->btf_load_err) ||
4060c64779e2SAndrii Nakryiko 	    CHECK(test->err_str && !strstr(btf_log_buf, test->err_str),
4061c64779e2SAndrii Nakryiko 		  "expected err_str:%s", test->err_str)) {
4062c64779e2SAndrii Nakryiko 		err = -1;
4063c64779e2SAndrii Nakryiko 		goto done;
4064c64779e2SAndrii Nakryiko 	}
4065c64779e2SAndrii Nakryiko 
4066bad2e478SAndrii Nakryiko 	if (err || btf_fd < 0)
4067c64779e2SAndrii Nakryiko 		goto done;
4068c64779e2SAndrii Nakryiko 
4069c64779e2SAndrii Nakryiko 	create_attr.name = test->map_name;
4070c64779e2SAndrii Nakryiko 	create_attr.map_type = test->map_type;
4071c64779e2SAndrii Nakryiko 	create_attr.key_size = test->key_size;
4072c64779e2SAndrii Nakryiko 	create_attr.value_size = test->value_size;
4073c64779e2SAndrii Nakryiko 	create_attr.max_entries = test->max_entries;
4074c64779e2SAndrii Nakryiko 	create_attr.btf_fd = btf_fd;
4075c64779e2SAndrii Nakryiko 	create_attr.btf_key_type_id = test->key_type_id;
4076c64779e2SAndrii Nakryiko 	create_attr.btf_value_type_id = test->value_type_id;
4077c64779e2SAndrii Nakryiko 
4078c64779e2SAndrii Nakryiko 	map_fd = bpf_create_map_xattr(&create_attr);
4079c64779e2SAndrii Nakryiko 
4080bad2e478SAndrii Nakryiko 	err = ((map_fd < 0) != test->map_create_err);
4081c64779e2SAndrii Nakryiko 	CHECK(err, "map_fd:%d test->map_create_err:%u",
4082c64779e2SAndrii Nakryiko 	      map_fd, test->map_create_err);
4083c64779e2SAndrii Nakryiko 
4084c64779e2SAndrii Nakryiko done:
4085c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
4086c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
4087bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
4088c64779e2SAndrii Nakryiko 		close(btf_fd);
4089bad2e478SAndrii Nakryiko 	if (map_fd >= 0)
4090c64779e2SAndrii Nakryiko 		close(map_fd);
4091c64779e2SAndrii Nakryiko }
4092c64779e2SAndrii Nakryiko 
4093c64779e2SAndrii Nakryiko struct btf_get_info_test {
4094c64779e2SAndrii Nakryiko 	const char *descr;
4095c64779e2SAndrii Nakryiko 	const char *str_sec;
4096c64779e2SAndrii Nakryiko 	__u32 raw_types[MAX_NR_RAW_U32];
4097c64779e2SAndrii Nakryiko 	__u32 str_sec_size;
4098c64779e2SAndrii Nakryiko 	int btf_size_delta;
4099c64779e2SAndrii Nakryiko 	int (*special_test)(unsigned int test_num);
4100c64779e2SAndrii Nakryiko };
4101c64779e2SAndrii Nakryiko 
4102c64779e2SAndrii Nakryiko static int test_big_btf_info(unsigned int test_num);
4103c64779e2SAndrii Nakryiko static int test_btf_id(unsigned int test_num);
4104c64779e2SAndrii Nakryiko 
4105c64779e2SAndrii Nakryiko const struct btf_get_info_test get_info_tests[] = {
4106c64779e2SAndrii Nakryiko {
4107c64779e2SAndrii Nakryiko 	.descr = "== raw_btf_size+1",
4108c64779e2SAndrii Nakryiko 	.raw_types = {
4109c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
4110c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
4111c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4112c64779e2SAndrii Nakryiko 	},
4113c64779e2SAndrii Nakryiko 	.str_sec = "",
4114c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
4115c64779e2SAndrii Nakryiko 	.btf_size_delta = 1,
4116c64779e2SAndrii Nakryiko },
4117c64779e2SAndrii Nakryiko {
4118c64779e2SAndrii Nakryiko 	.descr = "== raw_btf_size-3",
4119c64779e2SAndrii Nakryiko 	.raw_types = {
4120c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
4121c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
4122c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4123c64779e2SAndrii Nakryiko 	},
4124c64779e2SAndrii Nakryiko 	.str_sec = "",
4125c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
4126c64779e2SAndrii Nakryiko 	.btf_size_delta = -3,
4127c64779e2SAndrii Nakryiko },
4128c64779e2SAndrii Nakryiko {
4129c64779e2SAndrii Nakryiko 	.descr = "Large bpf_btf_info",
4130c64779e2SAndrii Nakryiko 	.raw_types = {
4131c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
4132c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
4133c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4134c64779e2SAndrii Nakryiko 	},
4135c64779e2SAndrii Nakryiko 	.str_sec = "",
4136c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
4137c64779e2SAndrii Nakryiko 	.special_test = test_big_btf_info,
4138c64779e2SAndrii Nakryiko },
4139c64779e2SAndrii Nakryiko {
4140c64779e2SAndrii Nakryiko 	.descr = "BTF ID",
4141c64779e2SAndrii Nakryiko 	.raw_types = {
4142c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
4143c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
4144c64779e2SAndrii Nakryiko 		/* unsigned int */			/* [2] */
4145c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),
4146c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4147c64779e2SAndrii Nakryiko 	},
4148c64779e2SAndrii Nakryiko 	.str_sec = "",
4149c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
4150c64779e2SAndrii Nakryiko 	.special_test = test_btf_id,
4151c64779e2SAndrii Nakryiko },
4152c64779e2SAndrii Nakryiko };
4153c64779e2SAndrii Nakryiko 
4154c64779e2SAndrii Nakryiko static int test_big_btf_info(unsigned int test_num)
4155c64779e2SAndrii Nakryiko {
4156c64779e2SAndrii Nakryiko 	const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
4157c64779e2SAndrii Nakryiko 	uint8_t *raw_btf = NULL, *user_btf = NULL;
4158c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
4159c64779e2SAndrii Nakryiko 	struct {
4160c64779e2SAndrii Nakryiko 		struct bpf_btf_info info;
4161c64779e2SAndrii Nakryiko 		uint64_t garbage;
4162c64779e2SAndrii Nakryiko 	} info_garbage;
4163c64779e2SAndrii Nakryiko 	struct bpf_btf_info *info;
4164c64779e2SAndrii Nakryiko 	int btf_fd = -1, err;
4165c64779e2SAndrii Nakryiko 	uint32_t info_len;
4166c64779e2SAndrii Nakryiko 
4167c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl,
4168c64779e2SAndrii Nakryiko 				 test->raw_types,
4169c64779e2SAndrii Nakryiko 				 test->str_sec,
4170c64779e2SAndrii Nakryiko 				 test->str_sec_size,
4171c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
4172c64779e2SAndrii Nakryiko 
4173c64779e2SAndrii Nakryiko 	if (!raw_btf)
4174c64779e2SAndrii Nakryiko 		return -1;
4175c64779e2SAndrii Nakryiko 
4176c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
4177c64779e2SAndrii Nakryiko 
4178c64779e2SAndrii Nakryiko 	user_btf = malloc(raw_btf_size);
4179c64779e2SAndrii Nakryiko 	if (CHECK(!user_btf, "!user_btf")) {
4180c64779e2SAndrii Nakryiko 		err = -1;
4181c64779e2SAndrii Nakryiko 		goto done;
4182c64779e2SAndrii Nakryiko 	}
4183c64779e2SAndrii Nakryiko 
4184c64779e2SAndrii Nakryiko 	btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
4185c64779e2SAndrii Nakryiko 			      btf_log_buf, BTF_LOG_BUF_SIZE,
4186c64779e2SAndrii Nakryiko 			      always_log);
4187bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd < 0, "errno:%d", errno)) {
4188c64779e2SAndrii Nakryiko 		err = -1;
4189c64779e2SAndrii Nakryiko 		goto done;
4190c64779e2SAndrii Nakryiko 	}
4191c64779e2SAndrii Nakryiko 
4192c64779e2SAndrii Nakryiko 	/*
4193c64779e2SAndrii Nakryiko 	 * GET_INFO should error out if the userspace info
4194c64779e2SAndrii Nakryiko 	 * has non zero tailing bytes.
4195c64779e2SAndrii Nakryiko 	 */
4196c64779e2SAndrii Nakryiko 	info = &info_garbage.info;
4197c64779e2SAndrii Nakryiko 	memset(info, 0, sizeof(*info));
4198c64779e2SAndrii Nakryiko 	info_garbage.garbage = 0xdeadbeef;
4199c64779e2SAndrii Nakryiko 	info_len = sizeof(info_garbage);
4200c64779e2SAndrii Nakryiko 	info->btf = ptr_to_u64(user_btf);
4201c64779e2SAndrii Nakryiko 	info->btf_size = raw_btf_size;
4202c64779e2SAndrii Nakryiko 
4203c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len);
4204c64779e2SAndrii Nakryiko 	if (CHECK(!err, "!err")) {
4205c64779e2SAndrii Nakryiko 		err = -1;
4206c64779e2SAndrii Nakryiko 		goto done;
4207c64779e2SAndrii Nakryiko 	}
4208c64779e2SAndrii Nakryiko 
4209c64779e2SAndrii Nakryiko 	/*
4210c64779e2SAndrii Nakryiko 	 * GET_INFO should succeed even info_len is larger than
4211c64779e2SAndrii Nakryiko 	 * the kernel supported as long as tailing bytes are zero.
4212c64779e2SAndrii Nakryiko 	 * The kernel supported info len should also be returned
4213c64779e2SAndrii Nakryiko 	 * to userspace.
4214c64779e2SAndrii Nakryiko 	 */
4215c64779e2SAndrii Nakryiko 	info_garbage.garbage = 0;
4216c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len);
4217c64779e2SAndrii Nakryiko 	if (CHECK(err || info_len != sizeof(*info),
4218c64779e2SAndrii Nakryiko 		  "err:%d errno:%d info_len:%u sizeof(*info):%zu",
4219c64779e2SAndrii Nakryiko 		  err, errno, info_len, sizeof(*info))) {
4220c64779e2SAndrii Nakryiko 		err = -1;
4221c64779e2SAndrii Nakryiko 		goto done;
4222c64779e2SAndrii Nakryiko 	}
4223c64779e2SAndrii Nakryiko 
4224c64779e2SAndrii Nakryiko 	fprintf(stderr, "OK");
4225c64779e2SAndrii Nakryiko 
4226c64779e2SAndrii Nakryiko done:
4227c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
4228c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
4229c64779e2SAndrii Nakryiko 
4230c64779e2SAndrii Nakryiko 	free(raw_btf);
4231c64779e2SAndrii Nakryiko 	free(user_btf);
4232c64779e2SAndrii Nakryiko 
4233bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
4234c64779e2SAndrii Nakryiko 		close(btf_fd);
4235c64779e2SAndrii Nakryiko 
4236c64779e2SAndrii Nakryiko 	return err;
4237c64779e2SAndrii Nakryiko }
4238c64779e2SAndrii Nakryiko 
4239c64779e2SAndrii Nakryiko static int test_btf_id(unsigned int test_num)
4240c64779e2SAndrii Nakryiko {
4241c64779e2SAndrii Nakryiko 	const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
4242c64779e2SAndrii Nakryiko 	struct bpf_create_map_attr create_attr = {};
4243c64779e2SAndrii Nakryiko 	uint8_t *raw_btf = NULL, *user_btf[2] = {};
4244c64779e2SAndrii Nakryiko 	int btf_fd[2] = {-1, -1}, map_fd = -1;
4245c64779e2SAndrii Nakryiko 	struct bpf_map_info map_info = {};
4246c64779e2SAndrii Nakryiko 	struct bpf_btf_info info[2] = {};
4247c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
4248c64779e2SAndrii Nakryiko 	uint32_t info_len;
4249c64779e2SAndrii Nakryiko 	int err, i, ret;
4250c64779e2SAndrii Nakryiko 
4251c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl,
4252c64779e2SAndrii Nakryiko 				 test->raw_types,
4253c64779e2SAndrii Nakryiko 				 test->str_sec,
4254c64779e2SAndrii Nakryiko 				 test->str_sec_size,
4255c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
4256c64779e2SAndrii Nakryiko 
4257c64779e2SAndrii Nakryiko 	if (!raw_btf)
4258c64779e2SAndrii Nakryiko 		return -1;
4259c64779e2SAndrii Nakryiko 
4260c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
4261c64779e2SAndrii Nakryiko 
4262c64779e2SAndrii Nakryiko 	for (i = 0; i < 2; i++) {
4263c64779e2SAndrii Nakryiko 		user_btf[i] = malloc(raw_btf_size);
4264c64779e2SAndrii Nakryiko 		if (CHECK(!user_btf[i], "!user_btf[%d]", i)) {
4265c64779e2SAndrii Nakryiko 			err = -1;
4266c64779e2SAndrii Nakryiko 			goto done;
4267c64779e2SAndrii Nakryiko 		}
4268c64779e2SAndrii Nakryiko 		info[i].btf = ptr_to_u64(user_btf[i]);
4269c64779e2SAndrii Nakryiko 		info[i].btf_size = raw_btf_size;
4270c64779e2SAndrii Nakryiko 	}
4271c64779e2SAndrii Nakryiko 
4272c64779e2SAndrii Nakryiko 	btf_fd[0] = bpf_load_btf(raw_btf, raw_btf_size,
4273c64779e2SAndrii Nakryiko 				 btf_log_buf, BTF_LOG_BUF_SIZE,
4274c64779e2SAndrii Nakryiko 				 always_log);
4275bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd[0] < 0, "errno:%d", errno)) {
4276c64779e2SAndrii Nakryiko 		err = -1;
4277c64779e2SAndrii Nakryiko 		goto done;
4278c64779e2SAndrii Nakryiko 	}
4279c64779e2SAndrii Nakryiko 
4280c64779e2SAndrii Nakryiko 	/* Test BPF_OBJ_GET_INFO_BY_ID on btf_id */
4281c64779e2SAndrii Nakryiko 	info_len = sizeof(info[0]);
4282c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(btf_fd[0], &info[0], &info_len);
4283c64779e2SAndrii Nakryiko 	if (CHECK(err, "errno:%d", errno)) {
4284c64779e2SAndrii Nakryiko 		err = -1;
4285c64779e2SAndrii Nakryiko 		goto done;
4286c64779e2SAndrii Nakryiko 	}
4287c64779e2SAndrii Nakryiko 
4288c64779e2SAndrii Nakryiko 	btf_fd[1] = bpf_btf_get_fd_by_id(info[0].id);
4289bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd[1] < 0, "errno:%d", errno)) {
4290c64779e2SAndrii Nakryiko 		err = -1;
4291c64779e2SAndrii Nakryiko 		goto done;
4292c64779e2SAndrii Nakryiko 	}
4293c64779e2SAndrii Nakryiko 
4294c64779e2SAndrii Nakryiko 	ret = 0;
4295c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(btf_fd[1], &info[1], &info_len);
4296c64779e2SAndrii Nakryiko 	if (CHECK(err || info[0].id != info[1].id ||
4297c64779e2SAndrii Nakryiko 		  info[0].btf_size != info[1].btf_size ||
4298c64779e2SAndrii Nakryiko 		  (ret = memcmp(user_btf[0], user_btf[1], info[0].btf_size)),
4299c64779e2SAndrii Nakryiko 		  "err:%d errno:%d id0:%u id1:%u btf_size0:%u btf_size1:%u memcmp:%d",
4300c64779e2SAndrii Nakryiko 		  err, errno, info[0].id, info[1].id,
4301c64779e2SAndrii Nakryiko 		  info[0].btf_size, info[1].btf_size, ret)) {
4302c64779e2SAndrii Nakryiko 		err = -1;
4303c64779e2SAndrii Nakryiko 		goto done;
4304c64779e2SAndrii Nakryiko 	}
4305c64779e2SAndrii Nakryiko 
4306c64779e2SAndrii Nakryiko 	/* Test btf members in struct bpf_map_info */
4307c64779e2SAndrii Nakryiko 	create_attr.name = "test_btf_id";
4308c64779e2SAndrii Nakryiko 	create_attr.map_type = BPF_MAP_TYPE_ARRAY;
4309c64779e2SAndrii Nakryiko 	create_attr.key_size = sizeof(int);
4310c64779e2SAndrii Nakryiko 	create_attr.value_size = sizeof(unsigned int);
4311c64779e2SAndrii Nakryiko 	create_attr.max_entries = 4;
4312c64779e2SAndrii Nakryiko 	create_attr.btf_fd = btf_fd[0];
4313c64779e2SAndrii Nakryiko 	create_attr.btf_key_type_id = 1;
4314c64779e2SAndrii Nakryiko 	create_attr.btf_value_type_id = 2;
4315c64779e2SAndrii Nakryiko 
4316c64779e2SAndrii Nakryiko 	map_fd = bpf_create_map_xattr(&create_attr);
4317bad2e478SAndrii Nakryiko 	if (CHECK(map_fd < 0, "errno:%d", errno)) {
4318c64779e2SAndrii Nakryiko 		err = -1;
4319c64779e2SAndrii Nakryiko 		goto done;
4320c64779e2SAndrii Nakryiko 	}
4321c64779e2SAndrii Nakryiko 
4322c64779e2SAndrii Nakryiko 	info_len = sizeof(map_info);
4323c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(map_fd, &map_info, &info_len);
4324c64779e2SAndrii Nakryiko 	if (CHECK(err || map_info.btf_id != info[0].id ||
4325c64779e2SAndrii Nakryiko 		  map_info.btf_key_type_id != 1 || map_info.btf_value_type_id != 2,
4326c64779e2SAndrii Nakryiko 		  "err:%d errno:%d info.id:%u btf_id:%u btf_key_type_id:%u btf_value_type_id:%u",
4327c64779e2SAndrii Nakryiko 		  err, errno, info[0].id, map_info.btf_id, map_info.btf_key_type_id,
4328c64779e2SAndrii Nakryiko 		  map_info.btf_value_type_id)) {
4329c64779e2SAndrii Nakryiko 		err = -1;
4330c64779e2SAndrii Nakryiko 		goto done;
4331c64779e2SAndrii Nakryiko 	}
4332c64779e2SAndrii Nakryiko 
4333c64779e2SAndrii Nakryiko 	for (i = 0; i < 2; i++) {
4334c64779e2SAndrii Nakryiko 		close(btf_fd[i]);
4335c64779e2SAndrii Nakryiko 		btf_fd[i] = -1;
4336c64779e2SAndrii Nakryiko 	}
4337c64779e2SAndrii Nakryiko 
4338c64779e2SAndrii Nakryiko 	/* Test BTF ID is removed from the kernel */
4339c64779e2SAndrii Nakryiko 	btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id);
4340bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd[0] < 0, "errno:%d", errno)) {
4341c64779e2SAndrii Nakryiko 		err = -1;
4342c64779e2SAndrii Nakryiko 		goto done;
4343c64779e2SAndrii Nakryiko 	}
4344c64779e2SAndrii Nakryiko 	close(btf_fd[0]);
4345c64779e2SAndrii Nakryiko 	btf_fd[0] = -1;
4346c64779e2SAndrii Nakryiko 
4347c64779e2SAndrii Nakryiko 	/* The map holds the last ref to BTF and its btf_id */
4348c64779e2SAndrii Nakryiko 	close(map_fd);
4349c64779e2SAndrii Nakryiko 	map_fd = -1;
4350c64779e2SAndrii Nakryiko 	btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id);
4351bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd[0] >= 0, "BTF lingers")) {
4352c64779e2SAndrii Nakryiko 		err = -1;
4353c64779e2SAndrii Nakryiko 		goto done;
4354c64779e2SAndrii Nakryiko 	}
4355c64779e2SAndrii Nakryiko 
4356c64779e2SAndrii Nakryiko 	fprintf(stderr, "OK");
4357c64779e2SAndrii Nakryiko 
4358c64779e2SAndrii Nakryiko done:
4359c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
4360c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
4361c64779e2SAndrii Nakryiko 
4362c64779e2SAndrii Nakryiko 	free(raw_btf);
4363bad2e478SAndrii Nakryiko 	if (map_fd >= 0)
4364c64779e2SAndrii Nakryiko 		close(map_fd);
4365c64779e2SAndrii Nakryiko 	for (i = 0; i < 2; i++) {
4366c64779e2SAndrii Nakryiko 		free(user_btf[i]);
4367bad2e478SAndrii Nakryiko 		if (btf_fd[i] >= 0)
4368c64779e2SAndrii Nakryiko 			close(btf_fd[i]);
4369c64779e2SAndrii Nakryiko 	}
4370c64779e2SAndrii Nakryiko 
4371c64779e2SAndrii Nakryiko 	return err;
4372c64779e2SAndrii Nakryiko }
4373c64779e2SAndrii Nakryiko 
4374c64779e2SAndrii Nakryiko static void do_test_get_info(unsigned int test_num)
4375c64779e2SAndrii Nakryiko {
4376c64779e2SAndrii Nakryiko 	const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
4377c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size, user_btf_size, expected_nbytes;
4378c64779e2SAndrii Nakryiko 	uint8_t *raw_btf = NULL, *user_btf = NULL;
4379c64779e2SAndrii Nakryiko 	struct bpf_btf_info info = {};
4380c64779e2SAndrii Nakryiko 	int btf_fd = -1, err, ret;
4381c64779e2SAndrii Nakryiko 	uint32_t info_len;
4382c64779e2SAndrii Nakryiko 
4383c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
4384c64779e2SAndrii Nakryiko 		return;
4385c64779e2SAndrii Nakryiko 
4386c64779e2SAndrii Nakryiko 	if (test->special_test) {
4387c64779e2SAndrii Nakryiko 		err = test->special_test(test_num);
4388c64779e2SAndrii Nakryiko 		if (CHECK(err, "failed: %d\n", err))
4389c64779e2SAndrii Nakryiko 			return;
4390c64779e2SAndrii Nakryiko 	}
4391c64779e2SAndrii Nakryiko 
4392c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl,
4393c64779e2SAndrii Nakryiko 				 test->raw_types,
4394c64779e2SAndrii Nakryiko 				 test->str_sec,
4395c64779e2SAndrii Nakryiko 				 test->str_sec_size,
4396c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
4397c64779e2SAndrii Nakryiko 
4398c64779e2SAndrii Nakryiko 	if (!raw_btf)
4399c64779e2SAndrii Nakryiko 		return;
4400c64779e2SAndrii Nakryiko 
4401c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
4402c64779e2SAndrii Nakryiko 
4403c64779e2SAndrii Nakryiko 	user_btf = malloc(raw_btf_size);
4404c64779e2SAndrii Nakryiko 	if (CHECK(!user_btf, "!user_btf")) {
4405c64779e2SAndrii Nakryiko 		err = -1;
4406c64779e2SAndrii Nakryiko 		goto done;
4407c64779e2SAndrii Nakryiko 	}
4408c64779e2SAndrii Nakryiko 
4409c64779e2SAndrii Nakryiko 	btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
4410c64779e2SAndrii Nakryiko 			      btf_log_buf, BTF_LOG_BUF_SIZE,
4411c64779e2SAndrii Nakryiko 			      always_log);
4412bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd <= 0, "errno:%d", errno)) {
4413c64779e2SAndrii Nakryiko 		err = -1;
4414c64779e2SAndrii Nakryiko 		goto done;
4415c64779e2SAndrii Nakryiko 	}
4416c64779e2SAndrii Nakryiko 
4417c64779e2SAndrii Nakryiko 	user_btf_size = (int)raw_btf_size + test->btf_size_delta;
4418c64779e2SAndrii Nakryiko 	expected_nbytes = min(raw_btf_size, user_btf_size);
4419c64779e2SAndrii Nakryiko 	if (raw_btf_size > expected_nbytes)
4420c64779e2SAndrii Nakryiko 		memset(user_btf + expected_nbytes, 0xff,
4421c64779e2SAndrii Nakryiko 		       raw_btf_size - expected_nbytes);
4422c64779e2SAndrii Nakryiko 
4423c64779e2SAndrii Nakryiko 	info_len = sizeof(info);
4424c64779e2SAndrii Nakryiko 	info.btf = ptr_to_u64(user_btf);
4425c64779e2SAndrii Nakryiko 	info.btf_size = user_btf_size;
4426c64779e2SAndrii Nakryiko 
4427c64779e2SAndrii Nakryiko 	ret = 0;
4428c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(btf_fd, &info, &info_len);
4429c64779e2SAndrii Nakryiko 	if (CHECK(err || !info.id || info_len != sizeof(info) ||
4430c64779e2SAndrii Nakryiko 		  info.btf_size != raw_btf_size ||
4431c64779e2SAndrii Nakryiko 		  (ret = memcmp(raw_btf, user_btf, expected_nbytes)),
4432c64779e2SAndrii Nakryiko 		  "err:%d errno:%d info.id:%u info_len:%u sizeof(info):%zu raw_btf_size:%u info.btf_size:%u expected_nbytes:%u memcmp:%d",
4433c64779e2SAndrii Nakryiko 		  err, errno, info.id, info_len, sizeof(info),
4434c64779e2SAndrii Nakryiko 		  raw_btf_size, info.btf_size, expected_nbytes, ret)) {
4435c64779e2SAndrii Nakryiko 		err = -1;
4436c64779e2SAndrii Nakryiko 		goto done;
4437c64779e2SAndrii Nakryiko 	}
4438c64779e2SAndrii Nakryiko 
4439c64779e2SAndrii Nakryiko 	while (expected_nbytes < raw_btf_size) {
4440c64779e2SAndrii Nakryiko 		fprintf(stderr, "%u...", expected_nbytes);
4441c64779e2SAndrii Nakryiko 		if (CHECK(user_btf[expected_nbytes++] != 0xff,
4442c64779e2SAndrii Nakryiko 			  "user_btf[%u]:%x != 0xff", expected_nbytes - 1,
4443c64779e2SAndrii Nakryiko 			  user_btf[expected_nbytes - 1])) {
4444c64779e2SAndrii Nakryiko 			err = -1;
4445c64779e2SAndrii Nakryiko 			goto done;
4446c64779e2SAndrii Nakryiko 		}
4447c64779e2SAndrii Nakryiko 	}
4448c64779e2SAndrii Nakryiko 
4449c64779e2SAndrii Nakryiko 	fprintf(stderr, "OK");
4450c64779e2SAndrii Nakryiko 
4451c64779e2SAndrii Nakryiko done:
4452c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
4453c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
4454c64779e2SAndrii Nakryiko 
4455c64779e2SAndrii Nakryiko 	free(raw_btf);
4456c64779e2SAndrii Nakryiko 	free(user_btf);
4457c64779e2SAndrii Nakryiko 
4458bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
4459c64779e2SAndrii Nakryiko 		close(btf_fd);
4460c64779e2SAndrii Nakryiko }
4461c64779e2SAndrii Nakryiko 
4462c64779e2SAndrii Nakryiko struct btf_file_test {
4463c64779e2SAndrii Nakryiko 	const char *file;
4464c64779e2SAndrii Nakryiko 	bool btf_kv_notfound;
4465c64779e2SAndrii Nakryiko };
4466c64779e2SAndrii Nakryiko 
4467c64779e2SAndrii Nakryiko static struct btf_file_test file_tests[] = {
4468c64779e2SAndrii Nakryiko 	{ .file = "test_btf_haskv.o", },
4469c64779e2SAndrii Nakryiko 	{ .file = "test_btf_newkv.o", },
4470c64779e2SAndrii Nakryiko 	{ .file = "test_btf_nokv.o", .btf_kv_notfound = true, },
4471c64779e2SAndrii Nakryiko };
4472c64779e2SAndrii Nakryiko 
4473c64779e2SAndrii Nakryiko static void do_test_file(unsigned int test_num)
4474c64779e2SAndrii Nakryiko {
4475c64779e2SAndrii Nakryiko 	const struct btf_file_test *test = &file_tests[test_num - 1];
4476c64779e2SAndrii Nakryiko 	const char *expected_fnames[] = {"_dummy_tracepoint",
4477c64779e2SAndrii Nakryiko 					 "test_long_fname_1",
4478c64779e2SAndrii Nakryiko 					 "test_long_fname_2"};
4479c64779e2SAndrii Nakryiko 	struct btf_ext *btf_ext = NULL;
4480c64779e2SAndrii Nakryiko 	struct bpf_prog_info info = {};
4481c64779e2SAndrii Nakryiko 	struct bpf_object *obj = NULL;
4482c64779e2SAndrii Nakryiko 	struct bpf_func_info *finfo;
4483c64779e2SAndrii Nakryiko 	struct bpf_program *prog;
4484c64779e2SAndrii Nakryiko 	__u32 info_len, rec_size;
4485c64779e2SAndrii Nakryiko 	bool has_btf_ext = false;
4486c64779e2SAndrii Nakryiko 	struct btf *btf = NULL;
4487c64779e2SAndrii Nakryiko 	void *func_info = NULL;
4488c64779e2SAndrii Nakryiko 	struct bpf_map *map;
4489c64779e2SAndrii Nakryiko 	int i, err, prog_fd;
4490c64779e2SAndrii Nakryiko 
4491c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->file))
4492c64779e2SAndrii Nakryiko 		return;
4493c64779e2SAndrii Nakryiko 
4494c64779e2SAndrii Nakryiko 	btf = btf__parse_elf(test->file, &btf_ext);
4495bad2e478SAndrii Nakryiko 	err = libbpf_get_error(btf);
4496bad2e478SAndrii Nakryiko 	if (err) {
4497bad2e478SAndrii Nakryiko 		if (err == -ENOENT) {
4498c64779e2SAndrii Nakryiko 			printf("%s:SKIP: No ELF %s found", __func__, BTF_ELF_SEC);
4499c64779e2SAndrii Nakryiko 			test__skip();
4500c64779e2SAndrii Nakryiko 			return;
4501c64779e2SAndrii Nakryiko 		}
4502c64779e2SAndrii Nakryiko 		return;
4503c64779e2SAndrii Nakryiko 	}
4504c64779e2SAndrii Nakryiko 	btf__free(btf);
4505c64779e2SAndrii Nakryiko 
4506c64779e2SAndrii Nakryiko 	has_btf_ext = btf_ext != NULL;
4507c64779e2SAndrii Nakryiko 	btf_ext__free(btf_ext);
4508c64779e2SAndrii Nakryiko 
4509c64779e2SAndrii Nakryiko 	obj = bpf_object__open(test->file);
4510bad2e478SAndrii Nakryiko 	err = libbpf_get_error(obj);
4511bad2e478SAndrii Nakryiko 	if (CHECK(err, "obj: %d", err))
4512c64779e2SAndrii Nakryiko 		return;
4513c64779e2SAndrii Nakryiko 
45146f2b219bSHengqi Chen 	prog = bpf_object__next_program(obj, NULL);
4515c64779e2SAndrii Nakryiko 	if (CHECK(!prog, "Cannot find bpf_prog")) {
4516c64779e2SAndrii Nakryiko 		err = -1;
4517c64779e2SAndrii Nakryiko 		goto done;
4518c64779e2SAndrii Nakryiko 	}
4519c64779e2SAndrii Nakryiko 
4520c64779e2SAndrii Nakryiko 	bpf_program__set_type(prog, BPF_PROG_TYPE_TRACEPOINT);
4521c64779e2SAndrii Nakryiko 	err = bpf_object__load(obj);
4522c64779e2SAndrii Nakryiko 	if (CHECK(err < 0, "bpf_object__load: %d", err))
4523c64779e2SAndrii Nakryiko 		goto done;
4524c64779e2SAndrii Nakryiko 	prog_fd = bpf_program__fd(prog);
4525c64779e2SAndrii Nakryiko 
4526c64779e2SAndrii Nakryiko 	map = bpf_object__find_map_by_name(obj, "btf_map");
4527c64779e2SAndrii Nakryiko 	if (CHECK(!map, "btf_map not found")) {
4528c64779e2SAndrii Nakryiko 		err = -1;
4529c64779e2SAndrii Nakryiko 		goto done;
4530c64779e2SAndrii Nakryiko 	}
4531c64779e2SAndrii Nakryiko 
4532c64779e2SAndrii Nakryiko 	err = (bpf_map__btf_key_type_id(map) == 0 || bpf_map__btf_value_type_id(map) == 0)
4533c64779e2SAndrii Nakryiko 		!= test->btf_kv_notfound;
4534c64779e2SAndrii Nakryiko 	if (CHECK(err, "btf_key_type_id:%u btf_value_type_id:%u test->btf_kv_notfound:%u",
4535c64779e2SAndrii Nakryiko 		  bpf_map__btf_key_type_id(map), bpf_map__btf_value_type_id(map),
4536c64779e2SAndrii Nakryiko 		  test->btf_kv_notfound))
4537c64779e2SAndrii Nakryiko 		goto done;
4538c64779e2SAndrii Nakryiko 
4539c64779e2SAndrii Nakryiko 	if (!has_btf_ext)
4540c64779e2SAndrii Nakryiko 		goto skip;
4541c64779e2SAndrii Nakryiko 
4542c64779e2SAndrii Nakryiko 	/* get necessary program info */
4543c64779e2SAndrii Nakryiko 	info_len = sizeof(struct bpf_prog_info);
4544c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
4545c64779e2SAndrii Nakryiko 
4546bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "invalid get info (1st) errno:%d", errno)) {
4547c64779e2SAndrii Nakryiko 		fprintf(stderr, "%s\n", btf_log_buf);
4548c64779e2SAndrii Nakryiko 		err = -1;
4549c64779e2SAndrii Nakryiko 		goto done;
4550c64779e2SAndrii Nakryiko 	}
4551c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_func_info != 3,
4552c64779e2SAndrii Nakryiko 		  "incorrect info.nr_func_info (1st) %d",
4553c64779e2SAndrii Nakryiko 		  info.nr_func_info)) {
4554c64779e2SAndrii Nakryiko 		err = -1;
4555c64779e2SAndrii Nakryiko 		goto done;
4556c64779e2SAndrii Nakryiko 	}
4557c64779e2SAndrii Nakryiko 	rec_size = info.func_info_rec_size;
4558c64779e2SAndrii Nakryiko 	if (CHECK(rec_size != sizeof(struct bpf_func_info),
4559c64779e2SAndrii Nakryiko 		  "incorrect info.func_info_rec_size (1st) %d\n", rec_size)) {
4560c64779e2SAndrii Nakryiko 		err = -1;
4561c64779e2SAndrii Nakryiko 		goto done;
4562c64779e2SAndrii Nakryiko 	}
4563c64779e2SAndrii Nakryiko 
4564c64779e2SAndrii Nakryiko 	func_info = malloc(info.nr_func_info * rec_size);
4565c64779e2SAndrii Nakryiko 	if (CHECK(!func_info, "out of memory")) {
4566c64779e2SAndrii Nakryiko 		err = -1;
4567c64779e2SAndrii Nakryiko 		goto done;
4568c64779e2SAndrii Nakryiko 	}
4569c64779e2SAndrii Nakryiko 
4570c64779e2SAndrii Nakryiko 	/* reset info to only retrieve func_info related data */
4571c64779e2SAndrii Nakryiko 	memset(&info, 0, sizeof(info));
4572c64779e2SAndrii Nakryiko 	info.nr_func_info = 3;
4573c64779e2SAndrii Nakryiko 	info.func_info_rec_size = rec_size;
4574c64779e2SAndrii Nakryiko 	info.func_info = ptr_to_u64(func_info);
4575c64779e2SAndrii Nakryiko 
4576c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
4577c64779e2SAndrii Nakryiko 
4578bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "invalid get info (2nd) errno:%d", errno)) {
4579c64779e2SAndrii Nakryiko 		fprintf(stderr, "%s\n", btf_log_buf);
4580c64779e2SAndrii Nakryiko 		err = -1;
4581c64779e2SAndrii Nakryiko 		goto done;
4582c64779e2SAndrii Nakryiko 	}
4583c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_func_info != 3,
4584c64779e2SAndrii Nakryiko 		  "incorrect info.nr_func_info (2nd) %d",
4585c64779e2SAndrii Nakryiko 		  info.nr_func_info)) {
4586c64779e2SAndrii Nakryiko 		err = -1;
4587c64779e2SAndrii Nakryiko 		goto done;
4588c64779e2SAndrii Nakryiko 	}
4589c64779e2SAndrii Nakryiko 	if (CHECK(info.func_info_rec_size != rec_size,
4590c64779e2SAndrii Nakryiko 		  "incorrect info.func_info_rec_size (2nd) %d",
4591c64779e2SAndrii Nakryiko 		  info.func_info_rec_size)) {
4592c64779e2SAndrii Nakryiko 		err = -1;
4593c64779e2SAndrii Nakryiko 		goto done;
4594c64779e2SAndrii Nakryiko 	}
4595c64779e2SAndrii Nakryiko 
459686f4b7f2SQuentin Monnet 	btf = btf__load_from_kernel_by_id(info.btf_id);
459786f4b7f2SQuentin Monnet 	err = libbpf_get_error(btf);
4598c64779e2SAndrii Nakryiko 	if (CHECK(err, "cannot get btf from kernel, err: %d", err))
4599c64779e2SAndrii Nakryiko 		goto done;
4600c64779e2SAndrii Nakryiko 
4601c64779e2SAndrii Nakryiko 	/* check three functions */
4602c64779e2SAndrii Nakryiko 	finfo = func_info;
4603c64779e2SAndrii Nakryiko 	for (i = 0; i < 3; i++) {
4604c64779e2SAndrii Nakryiko 		const struct btf_type *t;
4605c64779e2SAndrii Nakryiko 		const char *fname;
4606c64779e2SAndrii Nakryiko 
4607c64779e2SAndrii Nakryiko 		t = btf__type_by_id(btf, finfo->type_id);
4608c64779e2SAndrii Nakryiko 		if (CHECK(!t, "btf__type_by_id failure: id %u",
4609c64779e2SAndrii Nakryiko 			  finfo->type_id)) {
4610c64779e2SAndrii Nakryiko 			err = -1;
4611c64779e2SAndrii Nakryiko 			goto done;
4612c64779e2SAndrii Nakryiko 		}
4613c64779e2SAndrii Nakryiko 
4614c64779e2SAndrii Nakryiko 		fname = btf__name_by_offset(btf, t->name_off);
4615c64779e2SAndrii Nakryiko 		err = strcmp(fname, expected_fnames[i]);
4616c64779e2SAndrii Nakryiko 		/* for the second and third functions in .text section,
4617c64779e2SAndrii Nakryiko 		 * the compiler may order them either way.
4618c64779e2SAndrii Nakryiko 		 */
4619c64779e2SAndrii Nakryiko 		if (i && err)
4620c64779e2SAndrii Nakryiko 			err = strcmp(fname, expected_fnames[3 - i]);
4621c64779e2SAndrii Nakryiko 		if (CHECK(err, "incorrect fname %s", fname ? : "")) {
4622c64779e2SAndrii Nakryiko 			err = -1;
4623c64779e2SAndrii Nakryiko 			goto done;
4624c64779e2SAndrii Nakryiko 		}
4625c64779e2SAndrii Nakryiko 
4626c64779e2SAndrii Nakryiko 		finfo = (void *)finfo + rec_size;
4627c64779e2SAndrii Nakryiko 	}
4628c64779e2SAndrii Nakryiko 
4629c64779e2SAndrii Nakryiko skip:
4630c64779e2SAndrii Nakryiko 	fprintf(stderr, "OK");
4631c64779e2SAndrii Nakryiko 
4632c64779e2SAndrii Nakryiko done:
4633369e955bSQuentin Monnet 	btf__free(btf);
4634c64779e2SAndrii Nakryiko 	free(func_info);
4635c64779e2SAndrii Nakryiko 	bpf_object__close(obj);
4636c64779e2SAndrii Nakryiko }
4637c64779e2SAndrii Nakryiko 
4638c64779e2SAndrii Nakryiko const char *pprint_enum_str[] = {
4639c64779e2SAndrii Nakryiko 	"ENUM_ZERO",
4640c64779e2SAndrii Nakryiko 	"ENUM_ONE",
4641c64779e2SAndrii Nakryiko 	"ENUM_TWO",
4642c64779e2SAndrii Nakryiko 	"ENUM_THREE",
4643c64779e2SAndrii Nakryiko };
4644c64779e2SAndrii Nakryiko 
4645c64779e2SAndrii Nakryiko struct pprint_mapv {
4646c64779e2SAndrii Nakryiko 	uint32_t ui32;
4647c64779e2SAndrii Nakryiko 	uint16_t ui16;
4648c64779e2SAndrii Nakryiko 	/* 2 bytes hole */
4649c64779e2SAndrii Nakryiko 	int32_t si32;
4650c64779e2SAndrii Nakryiko 	uint32_t unused_bits2a:2,
4651c64779e2SAndrii Nakryiko 		bits28:28,
4652c64779e2SAndrii Nakryiko 		unused_bits2b:2;
4653c64779e2SAndrii Nakryiko 	union {
4654c64779e2SAndrii Nakryiko 		uint64_t ui64;
4655c64779e2SAndrii Nakryiko 		uint8_t ui8a[8];
4656c64779e2SAndrii Nakryiko 	};
4657c64779e2SAndrii Nakryiko 	enum {
4658c64779e2SAndrii Nakryiko 		ENUM_ZERO,
4659c64779e2SAndrii Nakryiko 		ENUM_ONE,
4660c64779e2SAndrii Nakryiko 		ENUM_TWO,
4661c64779e2SAndrii Nakryiko 		ENUM_THREE,
4662c64779e2SAndrii Nakryiko 	} aenum;
4663c64779e2SAndrii Nakryiko 	uint32_t ui32b;
4664c64779e2SAndrii Nakryiko 	uint32_t bits2c:2;
4665c64779e2SAndrii Nakryiko 	uint8_t si8_4[2][2];
4666c64779e2SAndrii Nakryiko };
4667c64779e2SAndrii Nakryiko 
4668c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
4669c64779e2SAndrii Nakryiko struct pprint_mapv_int128 {
4670c64779e2SAndrii Nakryiko 	__int128 si128a;
4671c64779e2SAndrii Nakryiko 	__int128 si128b;
4672c64779e2SAndrii Nakryiko 	unsigned __int128 bits3:3;
4673c64779e2SAndrii Nakryiko 	unsigned __int128 bits80:80;
4674c64779e2SAndrii Nakryiko 	unsigned __int128 ui128;
4675c64779e2SAndrii Nakryiko };
4676c64779e2SAndrii Nakryiko #endif
4677c64779e2SAndrii Nakryiko 
4678c64779e2SAndrii Nakryiko static struct btf_raw_test pprint_test_template[] = {
4679c64779e2SAndrii Nakryiko {
4680c64779e2SAndrii Nakryiko 	.raw_types = {
4681c64779e2SAndrii Nakryiko 		/* unsighed char */			/* [1] */
4682c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
4683c64779e2SAndrii Nakryiko 		/* unsigned short */			/* [2] */
4684c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
4685c64779e2SAndrii Nakryiko 		/* unsigned int */			/* [3] */
4686c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4687c64779e2SAndrii Nakryiko 		/* int */				/* [4] */
4688c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
4689c64779e2SAndrii Nakryiko 		/* unsigned long long */		/* [5] */
4690c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
4691c64779e2SAndrii Nakryiko 		/* 2 bits */				/* [6] */
4692c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 2, 2),
4693c64779e2SAndrii Nakryiko 		/* 28 bits */				/* [7] */
4694c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 28, 4),
4695c64779e2SAndrii Nakryiko 		/* uint8_t[8] */			/* [8] */
4696c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(9, 1, 8),
4697c64779e2SAndrii Nakryiko 		/* typedef unsigned char uint8_t */	/* [9] */
4698c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),
4699c64779e2SAndrii Nakryiko 		/* typedef unsigned short uint16_t */	/* [10] */
4700c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),
4701c64779e2SAndrii Nakryiko 		/* typedef unsigned int uint32_t */	/* [11] */
4702c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),
4703c64779e2SAndrii Nakryiko 		/* typedef int int32_t */		/* [12] */
4704c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),
4705c64779e2SAndrii Nakryiko 		/* typedef unsigned long long uint64_t *//* [13] */
4706c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 5),
4707c64779e2SAndrii Nakryiko 		/* union (anon) */			/* [14] */
4708c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
4709c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
4710c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 8, 0),	/* uint8_t ui8a[8]; */
4711c64779e2SAndrii Nakryiko 		/* enum (anon) */			/* [15] */
4712c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
4713c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
4714c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
4715c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 2),
4716c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 3),
4717c64779e2SAndrii Nakryiko 		/* struct pprint_mapv */		/* [16] */
4718c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 11), 40),
4719c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, 0),	/* uint32_t ui32 */
4720c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 10, 32),	/* uint16_t ui16 */
4721c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 12, 64),	/* int32_t si32 */
4722c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 96),	/* unused_bits2a */
4723c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 7, 98),	/* bits28 */
4724c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 126),	/* unused_bits2b */
4725c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(0, 14, 128),		/* union (anon) */
4726c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 15, 192),	/* aenum */
4727c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, 224),	/* uint32_t ui32b */
4728c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 256),	/* bits2c */
4729c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 17, 264),	/* si8_4 */
4730c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(18, 1, 2),		/* [17] */
4731c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 2),		/* [18] */
4732c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4733c64779e2SAndrii Nakryiko 	},
4734c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c\0si8_4"),
4735c64779e2SAndrii Nakryiko 	.key_size = sizeof(unsigned int),
4736c64779e2SAndrii Nakryiko 	.value_size = sizeof(struct pprint_mapv),
4737c64779e2SAndrii Nakryiko 	.key_type_id = 3,	/* unsigned int */
4738c64779e2SAndrii Nakryiko 	.value_type_id = 16,	/* struct pprint_mapv */
4739c64779e2SAndrii Nakryiko 	.max_entries = 128,
4740c64779e2SAndrii Nakryiko },
4741c64779e2SAndrii Nakryiko 
4742c64779e2SAndrii Nakryiko {
4743c64779e2SAndrii Nakryiko 	/* this type will have the same type as the
4744c64779e2SAndrii Nakryiko 	 * first .raw_types definition, but struct type will
4745c64779e2SAndrii Nakryiko 	 * be encoded with kind_flag set.
4746c64779e2SAndrii Nakryiko 	 */
4747c64779e2SAndrii Nakryiko 	.raw_types = {
4748c64779e2SAndrii Nakryiko 		/* unsighed char */			/* [1] */
4749c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
4750c64779e2SAndrii Nakryiko 		/* unsigned short */			/* [2] */
4751c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
4752c64779e2SAndrii Nakryiko 		/* unsigned int */			/* [3] */
4753c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4754c64779e2SAndrii Nakryiko 		/* int */				/* [4] */
4755c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
4756c64779e2SAndrii Nakryiko 		/* unsigned long long */		/* [5] */
4757c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
4758c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),	/* [6] */
4759c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),	/* [7] */
4760c64779e2SAndrii Nakryiko 		/* uint8_t[8] */			/* [8] */
4761c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(9, 1, 8),
4762c64779e2SAndrii Nakryiko 		/* typedef unsigned char uint8_t */	/* [9] */
4763c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),
4764c64779e2SAndrii Nakryiko 		/* typedef unsigned short uint16_t */	/* [10] */
4765c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),
4766c64779e2SAndrii Nakryiko 		/* typedef unsigned int uint32_t */	/* [11] */
4767c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),
4768c64779e2SAndrii Nakryiko 		/* typedef int int32_t */		/* [12] */
4769c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),
4770c64779e2SAndrii Nakryiko 		/* typedef unsigned long long uint64_t *//* [13] */
4771c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 5),
4772c64779e2SAndrii Nakryiko 		/* union (anon) */			/* [14] */
4773c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
4774c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
4775c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 8, 0),	/* uint8_t ui8a[8]; */
4776c64779e2SAndrii Nakryiko 		/* enum (anon) */			/* [15] */
4777c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
4778c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
4779c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
4780c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 2),
4781c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 3),
4782c64779e2SAndrii Nakryiko 		/* struct pprint_mapv */		/* [16] */
4783c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40),
4784c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)),	/* uint32_t ui32 */
4785c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)),	/* uint16_t ui16 */
4786c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)),	/* int32_t si32 */
4787c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 96)),	/* unused_bits2a */
4788c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)),	/* bits28 */
4789c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 126)),	/* unused_bits2b */
4790c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)),	/* union (anon) */
4791c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)),	/* aenum */
4792c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)),	/* uint32_t ui32b */
4793c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 256)),	/* bits2c */
4794c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 17, 264),	/* si8_4 */
4795c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(18, 1, 2),		/* [17] */
4796c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 2),		/* [18] */
4797c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4798c64779e2SAndrii Nakryiko 	},
4799c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c\0si8_4"),
4800c64779e2SAndrii Nakryiko 	.key_size = sizeof(unsigned int),
4801c64779e2SAndrii Nakryiko 	.value_size = sizeof(struct pprint_mapv),
4802c64779e2SAndrii Nakryiko 	.key_type_id = 3,	/* unsigned int */
4803c64779e2SAndrii Nakryiko 	.value_type_id = 16,	/* struct pprint_mapv */
4804c64779e2SAndrii Nakryiko 	.max_entries = 128,
4805c64779e2SAndrii Nakryiko },
4806c64779e2SAndrii Nakryiko 
4807c64779e2SAndrii Nakryiko {
4808c64779e2SAndrii Nakryiko 	/* this type will have the same layout as the
4809c64779e2SAndrii Nakryiko 	 * first .raw_types definition. The struct type will
4810c64779e2SAndrii Nakryiko 	 * be encoded with kind_flag set, bitfield members
4811c64779e2SAndrii Nakryiko 	 * are added typedef/const/volatile, and bitfield members
4812c64779e2SAndrii Nakryiko 	 * will have both int and enum types.
4813c64779e2SAndrii Nakryiko 	 */
4814c64779e2SAndrii Nakryiko 	.raw_types = {
4815c64779e2SAndrii Nakryiko 		/* unsighed char */			/* [1] */
4816c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
4817c64779e2SAndrii Nakryiko 		/* unsigned short */			/* [2] */
4818c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
4819c64779e2SAndrii Nakryiko 		/* unsigned int */			/* [3] */
4820c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4821c64779e2SAndrii Nakryiko 		/* int */				/* [4] */
4822c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
4823c64779e2SAndrii Nakryiko 		/* unsigned long long */		/* [5] */
4824c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
4825c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),	/* [6] */
4826c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),	/* [7] */
4827c64779e2SAndrii Nakryiko 		/* uint8_t[8] */			/* [8] */
4828c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(9, 1, 8),
4829c64779e2SAndrii Nakryiko 		/* typedef unsigned char uint8_t */	/* [9] */
4830c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),
4831c64779e2SAndrii Nakryiko 		/* typedef unsigned short uint16_t */	/* [10] */
4832c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),
4833c64779e2SAndrii Nakryiko 		/* typedef unsigned int uint32_t */	/* [11] */
4834c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),
4835c64779e2SAndrii Nakryiko 		/* typedef int int32_t */		/* [12] */
4836c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),
4837c64779e2SAndrii Nakryiko 		/* typedef unsigned long long uint64_t *//* [13] */
4838c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 5),
4839c64779e2SAndrii Nakryiko 		/* union (anon) */			/* [14] */
4840c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
4841c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
4842c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 8, 0),	/* uint8_t ui8a[8]; */
4843c64779e2SAndrii Nakryiko 		/* enum (anon) */			/* [15] */
4844c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
4845c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
4846c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
4847c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 2),
4848c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 3),
4849c64779e2SAndrii Nakryiko 		/* struct pprint_mapv */		/* [16] */
4850c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40),
4851c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)),	/* uint32_t ui32 */
4852c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)),	/* uint16_t ui16 */
4853c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)),	/* int32_t si32 */
4854c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 96)),	/* unused_bits2a */
4855c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)),	/* bits28 */
4856c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 19, BTF_MEMBER_OFFSET(2, 126)),/* unused_bits2b */
4857c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)),	/* union (anon) */
4858c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)),	/* aenum */
4859c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)),	/* uint32_t ui32b */
4860c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 256)),	/* bits2c */
4861c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 20, BTF_MEMBER_OFFSET(0, 264)),	/* si8_4 */
4862c64779e2SAndrii Nakryiko 		/* typedef unsigned int ___int */	/* [17] */
4863c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 18),
4864c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 6),	/* [18] */
4865c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 15),	/* [19] */
4866c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(21, 1, 2),					/* [20] */
4867c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 2),					/* [21] */
4868c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4869c64779e2SAndrii Nakryiko 	},
4870c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0unsigned char\0unsigned short\0unsigned int\0int\0unsigned long long\0uint8_t\0uint16_t\0uint32_t\0int32_t\0uint64_t\0ui64\0ui8a\0ENUM_ZERO\0ENUM_ONE\0ENUM_TWO\0ENUM_THREE\0pprint_mapv\0ui32\0ui16\0si32\0unused_bits2a\0bits28\0unused_bits2b\0aenum\0ui32b\0bits2c\0___int\0si8_4"),
4871c64779e2SAndrii Nakryiko 	.key_size = sizeof(unsigned int),
4872c64779e2SAndrii Nakryiko 	.value_size = sizeof(struct pprint_mapv),
4873c64779e2SAndrii Nakryiko 	.key_type_id = 3,	/* unsigned int */
4874c64779e2SAndrii Nakryiko 	.value_type_id = 16,	/* struct pprint_mapv */
4875c64779e2SAndrii Nakryiko 	.max_entries = 128,
4876c64779e2SAndrii Nakryiko },
4877c64779e2SAndrii Nakryiko 
4878c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
4879c64779e2SAndrii Nakryiko {
4880c64779e2SAndrii Nakryiko 	/* test int128 */
4881c64779e2SAndrii Nakryiko 	.raw_types = {
4882c64779e2SAndrii Nakryiko 		/* unsigned int */				/* [1] */
4883c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4884c64779e2SAndrii Nakryiko 		/* __int128 */					/* [2] */
4885c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 128, 16),
4886c64779e2SAndrii Nakryiko 		/* unsigned __int128 */				/* [3] */
4887c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 128, 16),
4888c64779e2SAndrii Nakryiko 		/* struct pprint_mapv_int128 */			/* [4] */
4889c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 5), 64),
4890c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),		/* si128a */
4891c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 128)),		/* si128b */
4892c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(3, 256)),		/* bits3 */
4893c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(80, 259)),	/* bits80 */
4894c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(0, 384)),		/* ui128 */
4895c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4896c64779e2SAndrii Nakryiko 	},
4897c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0unsigned int\0__int128\0unsigned __int128\0pprint_mapv_int128\0si128a\0si128b\0bits3\0bits80\0ui128"),
4898c64779e2SAndrii Nakryiko 	.key_size = sizeof(unsigned int),
4899c64779e2SAndrii Nakryiko 	.value_size = sizeof(struct pprint_mapv_int128),
4900c64779e2SAndrii Nakryiko 	.key_type_id = 1,
4901c64779e2SAndrii Nakryiko 	.value_type_id = 4,
4902c64779e2SAndrii Nakryiko 	.max_entries = 128,
4903c64779e2SAndrii Nakryiko 	.mapv_kind = PPRINT_MAPV_KIND_INT128,
4904c64779e2SAndrii Nakryiko },
4905c64779e2SAndrii Nakryiko #endif
4906c64779e2SAndrii Nakryiko 
4907c64779e2SAndrii Nakryiko };
4908c64779e2SAndrii Nakryiko 
4909c64779e2SAndrii Nakryiko static struct btf_pprint_test_meta {
4910c64779e2SAndrii Nakryiko 	const char *descr;
4911c64779e2SAndrii Nakryiko 	enum bpf_map_type map_type;
4912c64779e2SAndrii Nakryiko 	const char *map_name;
4913c64779e2SAndrii Nakryiko 	bool ordered_map;
4914c64779e2SAndrii Nakryiko 	bool lossless_map;
4915c64779e2SAndrii Nakryiko 	bool percpu_map;
4916c64779e2SAndrii Nakryiko } pprint_tests_meta[] = {
4917c64779e2SAndrii Nakryiko {
4918c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print array",
4919c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
4920c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_array",
4921c64779e2SAndrii Nakryiko 	.ordered_map = true,
4922c64779e2SAndrii Nakryiko 	.lossless_map = true,
4923c64779e2SAndrii Nakryiko 	.percpu_map = false,
4924c64779e2SAndrii Nakryiko },
4925c64779e2SAndrii Nakryiko 
4926c64779e2SAndrii Nakryiko {
4927c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print hash",
4928c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_HASH,
4929c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_hash",
4930c64779e2SAndrii Nakryiko 	.ordered_map = false,
4931c64779e2SAndrii Nakryiko 	.lossless_map = true,
4932c64779e2SAndrii Nakryiko 	.percpu_map = false,
4933c64779e2SAndrii Nakryiko },
4934c64779e2SAndrii Nakryiko 
4935c64779e2SAndrii Nakryiko {
4936c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print lru hash",
4937c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_LRU_HASH,
4938c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_lru_hash",
4939c64779e2SAndrii Nakryiko 	.ordered_map = false,
4940c64779e2SAndrii Nakryiko 	.lossless_map = false,
4941c64779e2SAndrii Nakryiko 	.percpu_map = false,
4942c64779e2SAndrii Nakryiko },
4943c64779e2SAndrii Nakryiko 
4944c64779e2SAndrii Nakryiko {
4945c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print percpu array",
4946c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_PERCPU_ARRAY,
4947c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_percpu_array",
4948c64779e2SAndrii Nakryiko 	.ordered_map = true,
4949c64779e2SAndrii Nakryiko 	.lossless_map = true,
4950c64779e2SAndrii Nakryiko 	.percpu_map = true,
4951c64779e2SAndrii Nakryiko },
4952c64779e2SAndrii Nakryiko 
4953c64779e2SAndrii Nakryiko {
4954c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print percpu hash",
4955c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_PERCPU_HASH,
4956c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_percpu_hash",
4957c64779e2SAndrii Nakryiko 	.ordered_map = false,
4958c64779e2SAndrii Nakryiko 	.lossless_map = true,
4959c64779e2SAndrii Nakryiko 	.percpu_map = true,
4960c64779e2SAndrii Nakryiko },
4961c64779e2SAndrii Nakryiko 
4962c64779e2SAndrii Nakryiko {
4963c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print lru percpu hash",
4964c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_LRU_PERCPU_HASH,
4965c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_lru_percpu_hash",
4966c64779e2SAndrii Nakryiko 	.ordered_map = false,
4967c64779e2SAndrii Nakryiko 	.lossless_map = false,
4968c64779e2SAndrii Nakryiko 	.percpu_map = true,
4969c64779e2SAndrii Nakryiko },
4970c64779e2SAndrii Nakryiko 
4971c64779e2SAndrii Nakryiko };
4972c64779e2SAndrii Nakryiko 
4973c64779e2SAndrii Nakryiko static size_t get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind)
4974c64779e2SAndrii Nakryiko {
4975c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_BASIC)
4976c64779e2SAndrii Nakryiko 		return sizeof(struct pprint_mapv);
4977c64779e2SAndrii Nakryiko 
4978c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
4979c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_INT128)
4980c64779e2SAndrii Nakryiko 		return sizeof(struct pprint_mapv_int128);
4981c64779e2SAndrii Nakryiko #endif
4982c64779e2SAndrii Nakryiko 
4983c64779e2SAndrii Nakryiko 	assert(0);
4984c64779e2SAndrii Nakryiko }
4985c64779e2SAndrii Nakryiko 
4986c64779e2SAndrii Nakryiko static void set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind,
4987c64779e2SAndrii Nakryiko 			    void *mapv, uint32_t i,
4988c64779e2SAndrii Nakryiko 			    int num_cpus, int rounded_value_size)
4989c64779e2SAndrii Nakryiko {
4990c64779e2SAndrii Nakryiko 	int cpu;
4991c64779e2SAndrii Nakryiko 
4992c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_BASIC) {
4993c64779e2SAndrii Nakryiko 		struct pprint_mapv *v = mapv;
4994c64779e2SAndrii Nakryiko 
4995c64779e2SAndrii Nakryiko 		for (cpu = 0; cpu < num_cpus; cpu++) {
4996c64779e2SAndrii Nakryiko 			v->ui32 = i + cpu;
4997c64779e2SAndrii Nakryiko 			v->si32 = -i;
4998c64779e2SAndrii Nakryiko 			v->unused_bits2a = 3;
4999c64779e2SAndrii Nakryiko 			v->bits28 = i;
5000c64779e2SAndrii Nakryiko 			v->unused_bits2b = 3;
5001c64779e2SAndrii Nakryiko 			v->ui64 = i;
5002c64779e2SAndrii Nakryiko 			v->aenum = i & 0x03;
5003c64779e2SAndrii Nakryiko 			v->ui32b = 4;
5004c64779e2SAndrii Nakryiko 			v->bits2c = 1;
5005c64779e2SAndrii Nakryiko 			v->si8_4[0][0] = (cpu + i) & 0xff;
5006c64779e2SAndrii Nakryiko 			v->si8_4[0][1] = (cpu + i + 1) & 0xff;
5007c64779e2SAndrii Nakryiko 			v->si8_4[1][0] = (cpu + i + 2) & 0xff;
5008c64779e2SAndrii Nakryiko 			v->si8_4[1][1] = (cpu + i + 3) & 0xff;
5009c64779e2SAndrii Nakryiko 			v = (void *)v + rounded_value_size;
5010c64779e2SAndrii Nakryiko 		}
5011c64779e2SAndrii Nakryiko 	}
5012c64779e2SAndrii Nakryiko 
5013c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
5014c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_INT128) {
5015c64779e2SAndrii Nakryiko 		struct pprint_mapv_int128 *v = mapv;
5016c64779e2SAndrii Nakryiko 
5017c64779e2SAndrii Nakryiko 		for (cpu = 0; cpu < num_cpus; cpu++) {
5018c64779e2SAndrii Nakryiko 			v->si128a = i;
5019c64779e2SAndrii Nakryiko 			v->si128b = -i;
5020c64779e2SAndrii Nakryiko 			v->bits3 = i & 0x07;
5021c64779e2SAndrii Nakryiko 			v->bits80 = (((unsigned __int128)1) << 64) + i;
5022c64779e2SAndrii Nakryiko 			v->ui128 = (((unsigned __int128)2) << 64) + i;
5023c64779e2SAndrii Nakryiko 			v = (void *)v + rounded_value_size;
5024c64779e2SAndrii Nakryiko 		}
5025c64779e2SAndrii Nakryiko 	}
5026c64779e2SAndrii Nakryiko #endif
5027c64779e2SAndrii Nakryiko }
5028c64779e2SAndrii Nakryiko 
5029c64779e2SAndrii Nakryiko ssize_t get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind,
5030c64779e2SAndrii Nakryiko 				 char *expected_line, ssize_t line_size,
5031c64779e2SAndrii Nakryiko 				 bool percpu_map, unsigned int next_key,
5032c64779e2SAndrii Nakryiko 				 int cpu, void *mapv)
5033c64779e2SAndrii Nakryiko {
5034c64779e2SAndrii Nakryiko 	ssize_t nexpected_line = -1;
5035c64779e2SAndrii Nakryiko 
5036c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_BASIC) {
5037c64779e2SAndrii Nakryiko 		struct pprint_mapv *v = mapv;
5038c64779e2SAndrii Nakryiko 
5039c64779e2SAndrii Nakryiko 		nexpected_line = snprintf(expected_line, line_size,
5040c64779e2SAndrii Nakryiko 					  "%s%u: {%u,0,%d,0x%x,0x%x,0x%x,"
5041c64779e2SAndrii Nakryiko 					  "{%llu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s,"
5042c64779e2SAndrii Nakryiko 					  "%u,0x%x,[[%d,%d],[%d,%d]]}\n",
5043c64779e2SAndrii Nakryiko 					  percpu_map ? "\tcpu" : "",
5044c64779e2SAndrii Nakryiko 					  percpu_map ? cpu : next_key,
5045c64779e2SAndrii Nakryiko 					  v->ui32, v->si32,
5046c64779e2SAndrii Nakryiko 					  v->unused_bits2a,
5047c64779e2SAndrii Nakryiko 					  v->bits28,
5048c64779e2SAndrii Nakryiko 					  v->unused_bits2b,
5049c64779e2SAndrii Nakryiko 					  (__u64)v->ui64,
5050c64779e2SAndrii Nakryiko 					  v->ui8a[0], v->ui8a[1],
5051c64779e2SAndrii Nakryiko 					  v->ui8a[2], v->ui8a[3],
5052c64779e2SAndrii Nakryiko 					  v->ui8a[4], v->ui8a[5],
5053c64779e2SAndrii Nakryiko 					  v->ui8a[6], v->ui8a[7],
5054c64779e2SAndrii Nakryiko 					  pprint_enum_str[v->aenum],
5055c64779e2SAndrii Nakryiko 					  v->ui32b,
5056c64779e2SAndrii Nakryiko 					  v->bits2c,
5057c64779e2SAndrii Nakryiko 					  v->si8_4[0][0], v->si8_4[0][1],
5058c64779e2SAndrii Nakryiko 					  v->si8_4[1][0], v->si8_4[1][1]);
5059c64779e2SAndrii Nakryiko 	}
5060c64779e2SAndrii Nakryiko 
5061c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
5062c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_INT128) {
5063c64779e2SAndrii Nakryiko 		struct pprint_mapv_int128 *v = mapv;
5064c64779e2SAndrii Nakryiko 
5065c64779e2SAndrii Nakryiko 		nexpected_line = snprintf(expected_line, line_size,
5066c64779e2SAndrii Nakryiko 					  "%s%u: {0x%lx,0x%lx,0x%lx,"
5067c64779e2SAndrii Nakryiko 					  "0x%lx%016lx,0x%lx%016lx}\n",
5068c64779e2SAndrii Nakryiko 					  percpu_map ? "\tcpu" : "",
5069c64779e2SAndrii Nakryiko 					  percpu_map ? cpu : next_key,
5070c64779e2SAndrii Nakryiko 					  (uint64_t)v->si128a,
5071c64779e2SAndrii Nakryiko 					  (uint64_t)v->si128b,
5072c64779e2SAndrii Nakryiko 					  (uint64_t)v->bits3,
5073c64779e2SAndrii Nakryiko 					  (uint64_t)(v->bits80 >> 64),
5074c64779e2SAndrii Nakryiko 					  (uint64_t)v->bits80,
5075c64779e2SAndrii Nakryiko 					  (uint64_t)(v->ui128 >> 64),
5076c64779e2SAndrii Nakryiko 					  (uint64_t)v->ui128);
5077c64779e2SAndrii Nakryiko 	}
5078c64779e2SAndrii Nakryiko #endif
5079c64779e2SAndrii Nakryiko 
5080c64779e2SAndrii Nakryiko 	return nexpected_line;
5081c64779e2SAndrii Nakryiko }
5082c64779e2SAndrii Nakryiko 
5083c64779e2SAndrii Nakryiko static int check_line(const char *expected_line, int nexpected_line,
5084c64779e2SAndrii Nakryiko 		      int expected_line_len, const char *line)
5085c64779e2SAndrii Nakryiko {
5086c64779e2SAndrii Nakryiko 	if (CHECK(nexpected_line == expected_line_len,
5087c64779e2SAndrii Nakryiko 		  "expected_line is too long"))
5088c64779e2SAndrii Nakryiko 		return -1;
5089c64779e2SAndrii Nakryiko 
5090c64779e2SAndrii Nakryiko 	if (strcmp(expected_line, line)) {
5091c64779e2SAndrii Nakryiko 		fprintf(stderr, "unexpected pprint output\n");
5092c64779e2SAndrii Nakryiko 		fprintf(stderr, "expected: %s", expected_line);
5093c64779e2SAndrii Nakryiko 		fprintf(stderr, "    read: %s", line);
5094c64779e2SAndrii Nakryiko 		return -1;
5095c64779e2SAndrii Nakryiko 	}
5096c64779e2SAndrii Nakryiko 
5097c64779e2SAndrii Nakryiko 	return 0;
5098c64779e2SAndrii Nakryiko }
5099c64779e2SAndrii Nakryiko 
5100c64779e2SAndrii Nakryiko 
5101c64779e2SAndrii Nakryiko static void do_test_pprint(int test_num)
5102c64779e2SAndrii Nakryiko {
5103c64779e2SAndrii Nakryiko 	const struct btf_raw_test *test = &pprint_test_template[test_num];
5104c64779e2SAndrii Nakryiko 	enum pprint_mapv_kind_t mapv_kind = test->mapv_kind;
5105c64779e2SAndrii Nakryiko 	struct bpf_create_map_attr create_attr = {};
5106c64779e2SAndrii Nakryiko 	bool ordered_map, lossless_map, percpu_map;
5107c64779e2SAndrii Nakryiko 	int err, ret, num_cpus, rounded_value_size;
5108c64779e2SAndrii Nakryiko 	unsigned int key, nr_read_elems;
5109c64779e2SAndrii Nakryiko 	int map_fd = -1, btf_fd = -1;
5110c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
5111c64779e2SAndrii Nakryiko 	char expected_line[255];
5112c64779e2SAndrii Nakryiko 	FILE *pin_file = NULL;
5113c64779e2SAndrii Nakryiko 	char pin_path[255];
5114c64779e2SAndrii Nakryiko 	size_t line_len = 0;
5115c64779e2SAndrii Nakryiko 	char *line = NULL;
5116c64779e2SAndrii Nakryiko 	void *mapv = NULL;
5117c64779e2SAndrii Nakryiko 	uint8_t *raw_btf;
5118c64779e2SAndrii Nakryiko 	ssize_t nread;
5119c64779e2SAndrii Nakryiko 
5120c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
5121c64779e2SAndrii Nakryiko 		return;
5122c64779e2SAndrii Nakryiko 
5123c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types,
5124c64779e2SAndrii Nakryiko 				 test->str_sec, test->str_sec_size,
5125c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
5126c64779e2SAndrii Nakryiko 
5127c64779e2SAndrii Nakryiko 	if (!raw_btf)
5128c64779e2SAndrii Nakryiko 		return;
5129c64779e2SAndrii Nakryiko 
5130c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
5131c64779e2SAndrii Nakryiko 	btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
5132c64779e2SAndrii Nakryiko 			      btf_log_buf, BTF_LOG_BUF_SIZE,
5133c64779e2SAndrii Nakryiko 			      always_log);
5134c64779e2SAndrii Nakryiko 	free(raw_btf);
5135c64779e2SAndrii Nakryiko 
5136bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd < 0, "errno:%d", errno)) {
5137c64779e2SAndrii Nakryiko 		err = -1;
5138c64779e2SAndrii Nakryiko 		goto done;
5139c64779e2SAndrii Nakryiko 	}
5140c64779e2SAndrii Nakryiko 
5141c64779e2SAndrii Nakryiko 	create_attr.name = test->map_name;
5142c64779e2SAndrii Nakryiko 	create_attr.map_type = test->map_type;
5143c64779e2SAndrii Nakryiko 	create_attr.key_size = test->key_size;
5144c64779e2SAndrii Nakryiko 	create_attr.value_size = test->value_size;
5145c64779e2SAndrii Nakryiko 	create_attr.max_entries = test->max_entries;
5146c64779e2SAndrii Nakryiko 	create_attr.btf_fd = btf_fd;
5147c64779e2SAndrii Nakryiko 	create_attr.btf_key_type_id = test->key_type_id;
5148c64779e2SAndrii Nakryiko 	create_attr.btf_value_type_id = test->value_type_id;
5149c64779e2SAndrii Nakryiko 
5150c64779e2SAndrii Nakryiko 	map_fd = bpf_create_map_xattr(&create_attr);
5151bad2e478SAndrii Nakryiko 	if (CHECK(map_fd < 0, "errno:%d", errno)) {
5152c64779e2SAndrii Nakryiko 		err = -1;
5153c64779e2SAndrii Nakryiko 		goto done;
5154c64779e2SAndrii Nakryiko 	}
5155c64779e2SAndrii Nakryiko 
5156c64779e2SAndrii Nakryiko 	ret = snprintf(pin_path, sizeof(pin_path), "%s/%s",
5157c64779e2SAndrii Nakryiko 		       "/sys/fs/bpf", test->map_name);
5158c64779e2SAndrii Nakryiko 
5159c64779e2SAndrii Nakryiko 	if (CHECK(ret == sizeof(pin_path), "pin_path %s/%s is too long",
5160c64779e2SAndrii Nakryiko 		  "/sys/fs/bpf", test->map_name)) {
5161c64779e2SAndrii Nakryiko 		err = -1;
5162c64779e2SAndrii Nakryiko 		goto done;
5163c64779e2SAndrii Nakryiko 	}
5164c64779e2SAndrii Nakryiko 
5165c64779e2SAndrii Nakryiko 	err = bpf_obj_pin(map_fd, pin_path);
5166c64779e2SAndrii Nakryiko 	if (CHECK(err, "bpf_obj_pin(%s): errno:%d.", pin_path, errno))
5167c64779e2SAndrii Nakryiko 		goto done;
5168c64779e2SAndrii Nakryiko 
5169c64779e2SAndrii Nakryiko 	percpu_map = test->percpu_map;
5170c64779e2SAndrii Nakryiko 	num_cpus = percpu_map ? bpf_num_possible_cpus() : 1;
5171c64779e2SAndrii Nakryiko 	rounded_value_size = round_up(get_pprint_mapv_size(mapv_kind), 8);
5172c64779e2SAndrii Nakryiko 	mapv = calloc(num_cpus, rounded_value_size);
5173c64779e2SAndrii Nakryiko 	if (CHECK(!mapv, "mapv allocation failure")) {
5174c64779e2SAndrii Nakryiko 		err = -1;
5175c64779e2SAndrii Nakryiko 		goto done;
5176c64779e2SAndrii Nakryiko 	}
5177c64779e2SAndrii Nakryiko 
5178c64779e2SAndrii Nakryiko 	for (key = 0; key < test->max_entries; key++) {
5179c64779e2SAndrii Nakryiko 		set_pprint_mapv(mapv_kind, mapv, key, num_cpus, rounded_value_size);
5180c64779e2SAndrii Nakryiko 		bpf_map_update_elem(map_fd, &key, mapv, 0);
5181c64779e2SAndrii Nakryiko 	}
5182c64779e2SAndrii Nakryiko 
5183c64779e2SAndrii Nakryiko 	pin_file = fopen(pin_path, "r");
5184c64779e2SAndrii Nakryiko 	if (CHECK(!pin_file, "fopen(%s): errno:%d", pin_path, errno)) {
5185c64779e2SAndrii Nakryiko 		err = -1;
5186c64779e2SAndrii Nakryiko 		goto done;
5187c64779e2SAndrii Nakryiko 	}
5188c64779e2SAndrii Nakryiko 
5189c64779e2SAndrii Nakryiko 	/* Skip lines start with '#' */
5190c64779e2SAndrii Nakryiko 	while ((nread = getline(&line, &line_len, pin_file)) > 0 &&
5191c64779e2SAndrii Nakryiko 	       *line == '#')
5192c64779e2SAndrii Nakryiko 		;
5193c64779e2SAndrii Nakryiko 
5194c64779e2SAndrii Nakryiko 	if (CHECK(nread <= 0, "Unexpected EOF")) {
5195c64779e2SAndrii Nakryiko 		err = -1;
5196c64779e2SAndrii Nakryiko 		goto done;
5197c64779e2SAndrii Nakryiko 	}
5198c64779e2SAndrii Nakryiko 
5199c64779e2SAndrii Nakryiko 	nr_read_elems = 0;
5200c64779e2SAndrii Nakryiko 	ordered_map = test->ordered_map;
5201c64779e2SAndrii Nakryiko 	lossless_map = test->lossless_map;
5202c64779e2SAndrii Nakryiko 	do {
5203c64779e2SAndrii Nakryiko 		ssize_t nexpected_line;
5204c64779e2SAndrii Nakryiko 		unsigned int next_key;
5205c64779e2SAndrii Nakryiko 		void *cmapv;
5206c64779e2SAndrii Nakryiko 		int cpu;
5207c64779e2SAndrii Nakryiko 
5208c64779e2SAndrii Nakryiko 		next_key = ordered_map ? nr_read_elems : atoi(line);
5209c64779e2SAndrii Nakryiko 		set_pprint_mapv(mapv_kind, mapv, next_key, num_cpus, rounded_value_size);
5210c64779e2SAndrii Nakryiko 		cmapv = mapv;
5211c64779e2SAndrii Nakryiko 
5212c64779e2SAndrii Nakryiko 		for (cpu = 0; cpu < num_cpus; cpu++) {
5213c64779e2SAndrii Nakryiko 			if (percpu_map) {
5214c64779e2SAndrii Nakryiko 				/* for percpu map, the format looks like:
5215c64779e2SAndrii Nakryiko 				 * <key>: {
5216c64779e2SAndrii Nakryiko 				 *	cpu0: <value_on_cpu0>
5217c64779e2SAndrii Nakryiko 				 *	cpu1: <value_on_cpu1>
5218c64779e2SAndrii Nakryiko 				 *	...
5219c64779e2SAndrii Nakryiko 				 *	cpun: <value_on_cpun>
5220c64779e2SAndrii Nakryiko 				 * }
5221c64779e2SAndrii Nakryiko 				 *
5222c64779e2SAndrii Nakryiko 				 * let us verify the line containing the key here.
5223c64779e2SAndrii Nakryiko 				 */
5224c64779e2SAndrii Nakryiko 				if (cpu == 0) {
5225c64779e2SAndrii Nakryiko 					nexpected_line = snprintf(expected_line,
5226c64779e2SAndrii Nakryiko 								  sizeof(expected_line),
5227c64779e2SAndrii Nakryiko 								  "%u: {\n",
5228c64779e2SAndrii Nakryiko 								  next_key);
5229c64779e2SAndrii Nakryiko 
5230c64779e2SAndrii Nakryiko 					err = check_line(expected_line, nexpected_line,
5231c64779e2SAndrii Nakryiko 							 sizeof(expected_line), line);
5232bad2e478SAndrii Nakryiko 					if (err < 0)
5233c64779e2SAndrii Nakryiko 						goto done;
5234c64779e2SAndrii Nakryiko 				}
5235c64779e2SAndrii Nakryiko 
5236c64779e2SAndrii Nakryiko 				/* read value@cpu */
5237c64779e2SAndrii Nakryiko 				nread = getline(&line, &line_len, pin_file);
5238c64779e2SAndrii Nakryiko 				if (nread < 0)
5239c64779e2SAndrii Nakryiko 					break;
5240c64779e2SAndrii Nakryiko 			}
5241c64779e2SAndrii Nakryiko 
5242c64779e2SAndrii Nakryiko 			nexpected_line = get_pprint_expected_line(mapv_kind, expected_line,
5243c64779e2SAndrii Nakryiko 								  sizeof(expected_line),
5244c64779e2SAndrii Nakryiko 								  percpu_map, next_key,
5245c64779e2SAndrii Nakryiko 								  cpu, cmapv);
5246c64779e2SAndrii Nakryiko 			err = check_line(expected_line, nexpected_line,
5247c64779e2SAndrii Nakryiko 					 sizeof(expected_line), line);
5248bad2e478SAndrii Nakryiko 			if (err < 0)
5249c64779e2SAndrii Nakryiko 				goto done;
5250c64779e2SAndrii Nakryiko 
5251c64779e2SAndrii Nakryiko 			cmapv = cmapv + rounded_value_size;
5252c64779e2SAndrii Nakryiko 		}
5253c64779e2SAndrii Nakryiko 
5254c64779e2SAndrii Nakryiko 		if (percpu_map) {
5255c64779e2SAndrii Nakryiko 			/* skip the last bracket for the percpu map */
5256c64779e2SAndrii Nakryiko 			nread = getline(&line, &line_len, pin_file);
5257c64779e2SAndrii Nakryiko 			if (nread < 0)
5258c64779e2SAndrii Nakryiko 				break;
5259c64779e2SAndrii Nakryiko 		}
5260c64779e2SAndrii Nakryiko 
5261c64779e2SAndrii Nakryiko 		nread = getline(&line, &line_len, pin_file);
5262c64779e2SAndrii Nakryiko 	} while (++nr_read_elems < test->max_entries && nread > 0);
5263c64779e2SAndrii Nakryiko 
5264c64779e2SAndrii Nakryiko 	if (lossless_map &&
5265c64779e2SAndrii Nakryiko 	    CHECK(nr_read_elems < test->max_entries,
5266c64779e2SAndrii Nakryiko 		  "Unexpected EOF. nr_read_elems:%u test->max_entries:%u",
5267c64779e2SAndrii Nakryiko 		  nr_read_elems, test->max_entries)) {
5268c64779e2SAndrii Nakryiko 		err = -1;
5269c64779e2SAndrii Nakryiko 		goto done;
5270c64779e2SAndrii Nakryiko 	}
5271c64779e2SAndrii Nakryiko 
5272c64779e2SAndrii Nakryiko 	if (CHECK(nread > 0, "Unexpected extra pprint output: %s", line)) {
5273c64779e2SAndrii Nakryiko 		err = -1;
5274c64779e2SAndrii Nakryiko 		goto done;
5275c64779e2SAndrii Nakryiko 	}
5276c64779e2SAndrii Nakryiko 
5277c64779e2SAndrii Nakryiko 	err = 0;
5278c64779e2SAndrii Nakryiko 
5279c64779e2SAndrii Nakryiko done:
5280c64779e2SAndrii Nakryiko 	if (mapv)
5281c64779e2SAndrii Nakryiko 		free(mapv);
5282c64779e2SAndrii Nakryiko 	if (!err)
5283c64779e2SAndrii Nakryiko 		fprintf(stderr, "OK");
5284c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
5285c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
5286bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
5287c64779e2SAndrii Nakryiko 		close(btf_fd);
5288bad2e478SAndrii Nakryiko 	if (map_fd >= 0)
5289c64779e2SAndrii Nakryiko 		close(map_fd);
5290c64779e2SAndrii Nakryiko 	if (pin_file)
5291c64779e2SAndrii Nakryiko 		fclose(pin_file);
5292c64779e2SAndrii Nakryiko 	unlink(pin_path);
5293c64779e2SAndrii Nakryiko 	free(line);
5294c64779e2SAndrii Nakryiko }
5295c64779e2SAndrii Nakryiko 
5296c64779e2SAndrii Nakryiko static void test_pprint(void)
5297c64779e2SAndrii Nakryiko {
5298c64779e2SAndrii Nakryiko 	unsigned int i;
5299c64779e2SAndrii Nakryiko 
5300c64779e2SAndrii Nakryiko 	/* test various maps with the first test template */
5301c64779e2SAndrii Nakryiko 	for (i = 0; i < ARRAY_SIZE(pprint_tests_meta); i++) {
5302c64779e2SAndrii Nakryiko 		pprint_test_template[0].descr = pprint_tests_meta[i].descr;
5303c64779e2SAndrii Nakryiko 		pprint_test_template[0].map_type = pprint_tests_meta[i].map_type;
5304c64779e2SAndrii Nakryiko 		pprint_test_template[0].map_name = pprint_tests_meta[i].map_name;
5305c64779e2SAndrii Nakryiko 		pprint_test_template[0].ordered_map = pprint_tests_meta[i].ordered_map;
5306c64779e2SAndrii Nakryiko 		pprint_test_template[0].lossless_map = pprint_tests_meta[i].lossless_map;
5307c64779e2SAndrii Nakryiko 		pprint_test_template[0].percpu_map = pprint_tests_meta[i].percpu_map;
5308c64779e2SAndrii Nakryiko 
5309c64779e2SAndrii Nakryiko 		do_test_pprint(0);
5310c64779e2SAndrii Nakryiko 	}
5311c64779e2SAndrii Nakryiko 
5312c64779e2SAndrii Nakryiko 	/* test rest test templates with the first map */
5313c64779e2SAndrii Nakryiko 	for (i = 1; i < ARRAY_SIZE(pprint_test_template); i++) {
5314c64779e2SAndrii Nakryiko 		pprint_test_template[i].descr = pprint_tests_meta[0].descr;
5315c64779e2SAndrii Nakryiko 		pprint_test_template[i].map_type = pprint_tests_meta[0].map_type;
5316c64779e2SAndrii Nakryiko 		pprint_test_template[i].map_name = pprint_tests_meta[0].map_name;
5317c64779e2SAndrii Nakryiko 		pprint_test_template[i].ordered_map = pprint_tests_meta[0].ordered_map;
5318c64779e2SAndrii Nakryiko 		pprint_test_template[i].lossless_map = pprint_tests_meta[0].lossless_map;
5319c64779e2SAndrii Nakryiko 		pprint_test_template[i].percpu_map = pprint_tests_meta[0].percpu_map;
5320c64779e2SAndrii Nakryiko 		do_test_pprint(i);
5321c64779e2SAndrii Nakryiko 	}
5322c64779e2SAndrii Nakryiko }
5323c64779e2SAndrii Nakryiko 
5324c64779e2SAndrii Nakryiko #define BPF_LINE_INFO_ENC(insn_off, file_off, line_off, line_num, line_col) \
5325c64779e2SAndrii Nakryiko 	(insn_off), (file_off), (line_off), ((line_num) << 10 | ((line_col) & 0x3ff))
5326c64779e2SAndrii Nakryiko 
5327c64779e2SAndrii Nakryiko static struct prog_info_raw_test {
5328c64779e2SAndrii Nakryiko 	const char *descr;
5329c64779e2SAndrii Nakryiko 	const char *str_sec;
5330c64779e2SAndrii Nakryiko 	const char *err_str;
5331c64779e2SAndrii Nakryiko 	__u32 raw_types[MAX_NR_RAW_U32];
5332c64779e2SAndrii Nakryiko 	__u32 str_sec_size;
5333c64779e2SAndrii Nakryiko 	struct bpf_insn insns[MAX_INSNS];
5334c64779e2SAndrii Nakryiko 	__u32 prog_type;
5335c64779e2SAndrii Nakryiko 	__u32 func_info[MAX_SUBPROGS][2];
5336c64779e2SAndrii Nakryiko 	__u32 func_info_rec_size;
5337c64779e2SAndrii Nakryiko 	__u32 func_info_cnt;
5338c64779e2SAndrii Nakryiko 	__u32 line_info[MAX_NR_RAW_U32];
5339c64779e2SAndrii Nakryiko 	__u32 line_info_rec_size;
5340c64779e2SAndrii Nakryiko 	__u32 nr_jited_ksyms;
5341c64779e2SAndrii Nakryiko 	bool expected_prog_load_failure;
5342c64779e2SAndrii Nakryiko 	__u32 dead_code_cnt;
5343c64779e2SAndrii Nakryiko 	__u32 dead_code_mask;
5344c64779e2SAndrii Nakryiko 	__u32 dead_func_cnt;
5345c64779e2SAndrii Nakryiko 	__u32 dead_func_mask;
5346c64779e2SAndrii Nakryiko } info_raw_tests[] = {
5347c64779e2SAndrii Nakryiko {
5348c64779e2SAndrii Nakryiko 	.descr = "func_type (main func + one sub)",
5349c64779e2SAndrii Nakryiko 	.raw_types = {
5350c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5351c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),	/* [2] */
5352c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
5353c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5354c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5355c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [4] */
5356c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5357c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5358c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [5] */
5359c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 4),			/* [6] */
5360c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5361c64779e2SAndrii Nakryiko 	},
5362c64779e2SAndrii Nakryiko 	.str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5363c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5364c64779e2SAndrii Nakryiko 	.insns = {
5365c64779e2SAndrii Nakryiko 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5366c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5367c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5368c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 2),
5369c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5370c64779e2SAndrii Nakryiko 	},
5371c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5372c64779e2SAndrii Nakryiko 	.func_info = { {0, 5}, {3, 6} },
5373c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5374c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5375c64779e2SAndrii Nakryiko 	.line_info = { BTF_END_RAW },
5376c64779e2SAndrii Nakryiko },
5377c64779e2SAndrii Nakryiko 
5378c64779e2SAndrii Nakryiko {
5379c64779e2SAndrii Nakryiko 	.descr = "func_type (Incorrect func_info_rec_size)",
5380c64779e2SAndrii Nakryiko 	.raw_types = {
5381c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5382c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),	/* [2] */
5383c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
5384c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5385c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5386c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [4] */
5387c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5388c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5389c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [5] */
5390c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 4),			/* [6] */
5391c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5392c64779e2SAndrii Nakryiko 	},
5393c64779e2SAndrii Nakryiko 	.str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5394c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5395c64779e2SAndrii Nakryiko 	.insns = {
5396c64779e2SAndrii Nakryiko 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5397c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5398c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5399c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 2),
5400c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5401c64779e2SAndrii Nakryiko 	},
5402c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5403c64779e2SAndrii Nakryiko 	.func_info = { {0, 5}, {3, 6} },
5404c64779e2SAndrii Nakryiko 	.func_info_rec_size = 4,
5405c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5406c64779e2SAndrii Nakryiko 	.line_info = { BTF_END_RAW },
5407c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5408c64779e2SAndrii Nakryiko },
5409c64779e2SAndrii Nakryiko 
5410c64779e2SAndrii Nakryiko {
5411c64779e2SAndrii Nakryiko 	.descr = "func_type (Incorrect func_info_cnt)",
5412c64779e2SAndrii Nakryiko 	.raw_types = {
5413c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5414c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),	/* [2] */
5415c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
5416c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5417c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5418c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [4] */
5419c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5420c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5421c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [5] */
5422c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 4),			/* [6] */
5423c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5424c64779e2SAndrii Nakryiko 	},
5425c64779e2SAndrii Nakryiko 	.str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5426c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5427c64779e2SAndrii Nakryiko 	.insns = {
5428c64779e2SAndrii Nakryiko 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5429c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5430c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5431c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 2),
5432c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5433c64779e2SAndrii Nakryiko 	},
5434c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5435c64779e2SAndrii Nakryiko 	.func_info = { {0, 5}, {3, 6} },
5436c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5437c64779e2SAndrii Nakryiko 	.func_info_cnt = 1,
5438c64779e2SAndrii Nakryiko 	.line_info = { BTF_END_RAW },
5439c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5440c64779e2SAndrii Nakryiko },
5441c64779e2SAndrii Nakryiko 
5442c64779e2SAndrii Nakryiko {
5443c64779e2SAndrii Nakryiko 	.descr = "func_type (Incorrect bpf_func_info.insn_off)",
5444c64779e2SAndrii Nakryiko 	.raw_types = {
5445c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5446c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),	/* [2] */
5447c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
5448c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5449c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5450c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [4] */
5451c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5452c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5453c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [5] */
5454c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 4),			/* [6] */
5455c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5456c64779e2SAndrii Nakryiko 	},
5457c64779e2SAndrii Nakryiko 	.str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5458c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5459c64779e2SAndrii Nakryiko 	.insns = {
5460c64779e2SAndrii Nakryiko 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5461c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5462c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5463c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 2),
5464c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5465c64779e2SAndrii Nakryiko 	},
5466c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5467c64779e2SAndrii Nakryiko 	.func_info = { {0, 5}, {2, 6} },
5468c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5469c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5470c64779e2SAndrii Nakryiko 	.line_info = { BTF_END_RAW },
5471c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5472c64779e2SAndrii Nakryiko },
5473c64779e2SAndrii Nakryiko 
5474c64779e2SAndrii Nakryiko {
5475c64779e2SAndrii Nakryiko 	.descr = "line_info (No subprog)",
5476c64779e2SAndrii Nakryiko 	.raw_types = {
5477c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5478c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5479c64779e2SAndrii Nakryiko 	},
5480c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5481c64779e2SAndrii Nakryiko 	.insns = {
5482c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5483c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5484c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5485c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5486c64779e2SAndrii Nakryiko 	},
5487c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5488c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5489c64779e2SAndrii Nakryiko 	.line_info = {
5490c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5491c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
5492c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5493c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
5494c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5495c64779e2SAndrii Nakryiko 	},
5496c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5497c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5498c64779e2SAndrii Nakryiko },
5499c64779e2SAndrii Nakryiko 
5500c64779e2SAndrii Nakryiko {
5501c64779e2SAndrii Nakryiko 	.descr = "line_info (No subprog. insn_off >= prog->len)",
5502c64779e2SAndrii Nakryiko 	.raw_types = {
5503c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5504c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5505c64779e2SAndrii Nakryiko 	},
5506c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5507c64779e2SAndrii Nakryiko 	.insns = {
5508c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5509c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5510c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5511c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5512c64779e2SAndrii Nakryiko 	},
5513c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5514c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5515c64779e2SAndrii Nakryiko 	.line_info = {
5516c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5517c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
5518c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5519c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
5520c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, 0, 5, 6),
5521c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5522c64779e2SAndrii Nakryiko 	},
5523c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5524c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5525c64779e2SAndrii Nakryiko 	.err_str = "line_info[4].insn_off",
5526c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5527c64779e2SAndrii Nakryiko },
5528c64779e2SAndrii Nakryiko 
5529c64779e2SAndrii Nakryiko {
5530c64779e2SAndrii Nakryiko 	.descr = "line_info (Zero bpf insn code)",
5531c64779e2SAndrii Nakryiko 	.raw_types = {
5532c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5533c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),	/* [2] */
5534c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),			/* [3] */
5535c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5536c64779e2SAndrii Nakryiko 	},
5537c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0unsigned long\0u64\0u64 a=1;\0return a;"),
5538c64779e2SAndrii Nakryiko 	.insns = {
5539c64779e2SAndrii Nakryiko 		BPF_LD_IMM64(BPF_REG_0, 1),
5540c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5541c64779e2SAndrii Nakryiko 	},
5542c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5543c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5544c64779e2SAndrii Nakryiko 	.line_info = {
5545c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5546c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, 0, 2, 9),
5547c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5548c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5549c64779e2SAndrii Nakryiko 	},
5550c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5551c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5552c64779e2SAndrii Nakryiko 	.err_str = "Invalid insn code at line_info[1]",
5553c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5554c64779e2SAndrii Nakryiko },
5555c64779e2SAndrii Nakryiko 
5556c64779e2SAndrii Nakryiko {
5557c64779e2SAndrii Nakryiko 	.descr = "line_info (No subprog. zero tailing line_info",
5558c64779e2SAndrii Nakryiko 	.raw_types = {
5559c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5560c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5561c64779e2SAndrii Nakryiko 	},
5562c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5563c64779e2SAndrii Nakryiko 	.insns = {
5564c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5565c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5566c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5567c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5568c64779e2SAndrii Nakryiko 	},
5569c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5570c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5571c64779e2SAndrii Nakryiko 	.line_info = {
5572c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0,
5573c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0,
5574c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0,
5575c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 0,
5576c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5577c64779e2SAndrii Nakryiko 	},
5578c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32),
5579c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5580c64779e2SAndrii Nakryiko },
5581c64779e2SAndrii Nakryiko 
5582c64779e2SAndrii Nakryiko {
5583c64779e2SAndrii Nakryiko 	.descr = "line_info (No subprog. nonzero tailing line_info)",
5584c64779e2SAndrii Nakryiko 	.raw_types = {
5585c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5586c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5587c64779e2SAndrii Nakryiko 	},
5588c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5589c64779e2SAndrii Nakryiko 	.insns = {
5590c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5591c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5592c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5593c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5594c64779e2SAndrii Nakryiko 	},
5595c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5596c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5597c64779e2SAndrii Nakryiko 	.line_info = {
5598c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0,
5599c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0,
5600c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0,
5601c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 1,
5602c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5603c64779e2SAndrii Nakryiko 	},
5604c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32),
5605c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5606c64779e2SAndrii Nakryiko 	.err_str = "nonzero tailing record in line_info",
5607c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5608c64779e2SAndrii Nakryiko },
5609c64779e2SAndrii Nakryiko 
5610c64779e2SAndrii Nakryiko {
5611c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog)",
5612c64779e2SAndrii Nakryiko 	.raw_types = {
5613c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5614c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5615c64779e2SAndrii Nakryiko 	},
5616c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5617c64779e2SAndrii Nakryiko 	.insns = {
5618c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5619c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5620c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5621c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5622c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5623c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5624c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5625c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5626c64779e2SAndrii Nakryiko 	},
5627c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5628c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5629c64779e2SAndrii Nakryiko 	.line_info = {
5630c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5631c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5632c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5633c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5634c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5635c64779e2SAndrii Nakryiko 	},
5636c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5637c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5638c64779e2SAndrii Nakryiko },
5639c64779e2SAndrii Nakryiko 
5640c64779e2SAndrii Nakryiko {
5641c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog + func_info)",
5642c64779e2SAndrii Nakryiko 	.raw_types = {
5643c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5644c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
5645c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5646c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
5647c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
5648c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5649c64779e2SAndrii Nakryiko 	},
5650c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5651c64779e2SAndrii Nakryiko 	.insns = {
5652c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5653c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5654c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5655c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5656c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5657c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5658c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5659c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5660c64779e2SAndrii Nakryiko 	},
5661c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5662c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5663c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5664c64779e2SAndrii Nakryiko 	.func_info = { {0, 4}, {5, 3} },
5665c64779e2SAndrii Nakryiko 	.line_info = {
5666c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5667c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5668c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5669c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5670c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5671c64779e2SAndrii Nakryiko 	},
5672c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5673c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5674c64779e2SAndrii Nakryiko },
5675c64779e2SAndrii Nakryiko 
5676c64779e2SAndrii Nakryiko {
5677c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog. missing 1st func line info)",
5678c64779e2SAndrii Nakryiko 	.raw_types = {
5679c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5680c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5681c64779e2SAndrii Nakryiko 	},
5682c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5683c64779e2SAndrii Nakryiko 	.insns = {
5684c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5685c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5686c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5687c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5688c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5689c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5690c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5691c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5692c64779e2SAndrii Nakryiko 	},
5693c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5694c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5695c64779e2SAndrii Nakryiko 	.line_info = {
5696c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 1, 10),
5697c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5698c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5699c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5700c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5701c64779e2SAndrii Nakryiko 	},
5702c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5703c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5704c64779e2SAndrii Nakryiko 	.err_str = "missing bpf_line_info for func#0",
5705c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5706c64779e2SAndrii Nakryiko },
5707c64779e2SAndrii Nakryiko 
5708c64779e2SAndrii Nakryiko {
5709c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog. missing 2nd func line info)",
5710c64779e2SAndrii Nakryiko 	.raw_types = {
5711c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5712c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5713c64779e2SAndrii Nakryiko 	},
5714c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5715c64779e2SAndrii Nakryiko 	.insns = {
5716c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5717c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5718c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5719c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5720c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5721c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5722c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5723c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5724c64779e2SAndrii Nakryiko 	},
5725c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5726c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5727c64779e2SAndrii Nakryiko 	.line_info = {
5728c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5729c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5730c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 3, 8),
5731c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5732c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5733c64779e2SAndrii Nakryiko 	},
5734c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5735c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5736c64779e2SAndrii Nakryiko 	.err_str = "missing bpf_line_info for func#1",
5737c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5738c64779e2SAndrii Nakryiko },
5739c64779e2SAndrii Nakryiko 
5740c64779e2SAndrii Nakryiko {
5741c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog. unordered insn offset)",
5742c64779e2SAndrii Nakryiko 	.raw_types = {
5743c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5744c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5745c64779e2SAndrii Nakryiko 	},
5746c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5747c64779e2SAndrii Nakryiko 	.insns = {
5748c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5749c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5750c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5751c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5752c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5753c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5754c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5755c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5756c64779e2SAndrii Nakryiko 	},
5757c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5758c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5759c64779e2SAndrii Nakryiko 	.line_info = {
5760c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5761c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 2, 9),
5762c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5763c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5764c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5765c64779e2SAndrii Nakryiko 	},
5766c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5767c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5768c64779e2SAndrii Nakryiko 	.err_str = "Invalid line_info[2].insn_off",
5769c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5770c64779e2SAndrii Nakryiko },
5771c64779e2SAndrii Nakryiko 
5772c64779e2SAndrii Nakryiko {
5773c64779e2SAndrii Nakryiko 	.descr = "line_info (dead start)",
5774c64779e2SAndrii Nakryiko 	.raw_types = {
5775c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5776c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5777c64779e2SAndrii Nakryiko 	},
5778c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0/* dead jmp */\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5779c64779e2SAndrii Nakryiko 	.insns = {
5780c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
5781c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5782c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5783c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5784c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5785c64779e2SAndrii Nakryiko 	},
5786c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5787c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5788c64779e2SAndrii Nakryiko 	.line_info = {
5789c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5790c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
5791c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5792c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
5793c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 6),
5794c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5795c64779e2SAndrii Nakryiko 	},
5796c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5797c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5798c64779e2SAndrii Nakryiko 	.dead_code_cnt = 1,
5799c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x01,
5800c64779e2SAndrii Nakryiko },
5801c64779e2SAndrii Nakryiko 
5802c64779e2SAndrii Nakryiko {
5803c64779e2SAndrii Nakryiko 	.descr = "line_info (dead end)",
5804c64779e2SAndrii Nakryiko 	.raw_types = {
5805c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5806c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5807c64779e2SAndrii Nakryiko 	},
5808c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0/* dead jmp */\0return a + b;\0/* dead exit */"),
5809c64779e2SAndrii Nakryiko 	.insns = {
5810c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5811c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5812c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5813c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
5814c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5815c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5816c64779e2SAndrii Nakryiko 	},
5817c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5818c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5819c64779e2SAndrii Nakryiko 	.line_info = {
5820c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 12),
5821c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 11),
5822c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 10),
5823c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 9),
5824c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 8),
5825c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 6, 7),
5826c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5827c64779e2SAndrii Nakryiko 	},
5828c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5829c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5830c64779e2SAndrii Nakryiko 	.dead_code_cnt = 2,
5831c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x28,
5832c64779e2SAndrii Nakryiko },
5833c64779e2SAndrii Nakryiko 
5834c64779e2SAndrii Nakryiko {
5835c64779e2SAndrii Nakryiko 	.descr = "line_info (dead code + subprog + func_info)",
5836c64779e2SAndrii Nakryiko 	.raw_types = {
5837c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5838c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
5839c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5840c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
5841c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
5842c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5843c64779e2SAndrii Nakryiko 	},
5844c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0/* dead jmp */"
5845c64779e2SAndrii Nakryiko 		    "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
5846c64779e2SAndrii Nakryiko 		    "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
5847c64779e2SAndrii Nakryiko 		    "\0return func(a);\0b+=1;\0return b;"),
5848c64779e2SAndrii Nakryiko 	.insns = {
5849c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5850c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5851c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5852c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 8),
5853c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5854c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5855c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5856c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5857c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5858c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5859c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5860c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5861c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5862c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5863c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5864c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5865c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5866c64779e2SAndrii Nakryiko 	},
5867c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5868c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5869c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5870c64779e2SAndrii Nakryiko 	.func_info = { {0, 4}, {14, 3} },
5871c64779e2SAndrii Nakryiko 	.line_info = {
5872c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5873c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
5874c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
5875c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
5876c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5877c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
5878c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
5879c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
5880c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
5881c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
5882c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
5883c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(14, 0, NAME_TBD, 3, 8),
5884c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(16, 0, NAME_TBD, 4, 7),
5885c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5886c64779e2SAndrii Nakryiko 	},
5887c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5888c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5889c64779e2SAndrii Nakryiko 	.dead_code_cnt = 9,
5890c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x3fe,
5891c64779e2SAndrii Nakryiko },
5892c64779e2SAndrii Nakryiko 
5893c64779e2SAndrii Nakryiko {
5894c64779e2SAndrii Nakryiko 	.descr = "line_info (dead subprog)",
5895c64779e2SAndrii Nakryiko 	.raw_types = {
5896c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5897c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
5898c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5899c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
5900c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
5901c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [5] */
5902c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5903c64779e2SAndrii Nakryiko 	},
5904c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */"
5905c64779e2SAndrii Nakryiko 		    "\0return 0;\0return 0;\0/* dead */\0/* dead */"
5906c64779e2SAndrii Nakryiko 		    "\0/* dead */\0return bla + 1;\0return bla + 1;"
5907c64779e2SAndrii Nakryiko 		    "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"),
5908c64779e2SAndrii Nakryiko 	.insns = {
5909c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5910c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
5911c64779e2SAndrii Nakryiko 		BPF_CALL_REL(3),
5912c64779e2SAndrii Nakryiko 		BPF_CALL_REL(5),
5913c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
5914c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5915c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
5916c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5917c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5918c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, 2),
5919c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5920c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5921c64779e2SAndrii Nakryiko 	},
5922c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5923c64779e2SAndrii Nakryiko 	.func_info_cnt = 3,
5924c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5925c64779e2SAndrii Nakryiko 		.func_info = { {0, 4}, {6, 3}, {9, 5} },
5926c64779e2SAndrii Nakryiko 	.line_info = {
5927c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5928c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
5929c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
5930c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
5931c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5932c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
5933c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
5934c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
5935c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
5936c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
5937c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5938c64779e2SAndrii Nakryiko 	},
5939c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5940c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5941c64779e2SAndrii Nakryiko 	.dead_code_cnt = 3,
5942c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x70,
5943c64779e2SAndrii Nakryiko 	.dead_func_cnt = 1,
5944c64779e2SAndrii Nakryiko 	.dead_func_mask = 0x2,
5945c64779e2SAndrii Nakryiko },
5946c64779e2SAndrii Nakryiko 
5947c64779e2SAndrii Nakryiko {
5948c64779e2SAndrii Nakryiko 	.descr = "line_info (dead last subprog)",
5949c64779e2SAndrii Nakryiko 	.raw_types = {
5950c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5951c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
5952c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5953c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
5954c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [5] */
5955c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5956c64779e2SAndrii Nakryiko 	},
5957c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0dead\0main\0int a=1+1;\0/* live call */"
5958c64779e2SAndrii Nakryiko 		    "\0return 0;\0/* dead */\0/* dead */"),
5959c64779e2SAndrii Nakryiko 	.insns = {
5960c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5961c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
5962c64779e2SAndrii Nakryiko 		BPF_CALL_REL(2),
5963c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
5964c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5965c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
5966c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5967c64779e2SAndrii Nakryiko 	},
5968c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5969c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5970c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5971c64779e2SAndrii Nakryiko 		.func_info = { {0, 4}, {5, 3} },
5972c64779e2SAndrii Nakryiko 	.line_info = {
5973c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5974c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
5975c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
5976c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
5977c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
5978c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5979c64779e2SAndrii Nakryiko 	},
5980c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5981c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5982c64779e2SAndrii Nakryiko 	.dead_code_cnt = 2,
5983c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x18,
5984c64779e2SAndrii Nakryiko 	.dead_func_cnt = 1,
5985c64779e2SAndrii Nakryiko 	.dead_func_mask = 0x2,
5986c64779e2SAndrii Nakryiko },
5987c64779e2SAndrii Nakryiko 
5988c64779e2SAndrii Nakryiko {
5989c64779e2SAndrii Nakryiko 	.descr = "line_info (dead subprog + dead start)",
5990c64779e2SAndrii Nakryiko 	.raw_types = {
5991c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5992c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
5993c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5994c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
5995c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
5996c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [5] */
5997c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5998c64779e2SAndrii Nakryiko 	},
5999c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* dead */"
6000c64779e2SAndrii Nakryiko 		    "\0return 0;\0return 0;\0return 0;"
6001c64779e2SAndrii Nakryiko 		    "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
6002c64779e2SAndrii Nakryiko 		    "\0return b + 1;\0return b + 1;\0return b + 1;"),
6003c64779e2SAndrii Nakryiko 	.insns = {
6004c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6005c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6006c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
6007c64779e2SAndrii Nakryiko 		BPF_CALL_REL(3),
6008c64779e2SAndrii Nakryiko 		BPF_CALL_REL(5),
6009c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6010c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6011c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6012c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
6013c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6014c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6015c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, 2),
6016c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
6017c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6018c64779e2SAndrii Nakryiko 	},
6019c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6020c64779e2SAndrii Nakryiko 	.func_info_cnt = 3,
6021c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6022c64779e2SAndrii Nakryiko 		.func_info = { {0, 4}, {7, 3}, {10, 5} },
6023c64779e2SAndrii Nakryiko 	.line_info = {
6024c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6025c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
6026c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
6027c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
6028c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6029c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
6030c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
6031c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
6032c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
6033c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
6034c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
6035c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(13, 0, NAME_TBD, 2, 9),
6036c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6037c64779e2SAndrii Nakryiko 	},
6038c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6039c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6040c64779e2SAndrii Nakryiko 	.dead_code_cnt = 5,
6041c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x1e2,
6042c64779e2SAndrii Nakryiko 	.dead_func_cnt = 1,
6043c64779e2SAndrii Nakryiko 	.dead_func_mask = 0x2,
6044c64779e2SAndrii Nakryiko },
6045c64779e2SAndrii Nakryiko 
6046c64779e2SAndrii Nakryiko {
6047c64779e2SAndrii Nakryiko 	.descr = "line_info (dead subprog + dead start w/ move)",
6048c64779e2SAndrii Nakryiko 	.raw_types = {
6049c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6050c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
6051c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6052c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
6053c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
6054c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [5] */
6055c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6056c64779e2SAndrii Nakryiko 	},
6057c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */"
6058c64779e2SAndrii Nakryiko 		    "\0return 0;\0return 0;\0/* dead */\0/* dead */"
6059c64779e2SAndrii Nakryiko 		    "\0/* dead */\0return bla + 1;\0return bla + 1;"
6060c64779e2SAndrii Nakryiko 		    "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"),
6061c64779e2SAndrii Nakryiko 	.insns = {
6062c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6063c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
6064c64779e2SAndrii Nakryiko 		BPF_CALL_REL(3),
6065c64779e2SAndrii Nakryiko 		BPF_CALL_REL(5),
6066c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6067c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6068c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6069c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
6070c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6071c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6072c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, 2),
6073c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
6074c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6075c64779e2SAndrii Nakryiko 	},
6076c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6077c64779e2SAndrii Nakryiko 	.func_info_cnt = 3,
6078c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6079c64779e2SAndrii Nakryiko 		.func_info = { {0, 4}, {6, 3}, {9, 5} },
6080c64779e2SAndrii Nakryiko 	.line_info = {
6081c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6082c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
6083c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
6084c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
6085c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6086c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
6087c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
6088c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
6089c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 1, 10),
6090c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
6091c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6092c64779e2SAndrii Nakryiko 	},
6093c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6094c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6095c64779e2SAndrii Nakryiko 	.dead_code_cnt = 3,
6096c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x70,
6097c64779e2SAndrii Nakryiko 	.dead_func_cnt = 1,
6098c64779e2SAndrii Nakryiko 	.dead_func_mask = 0x2,
6099c64779e2SAndrii Nakryiko },
6100c64779e2SAndrii Nakryiko 
6101c64779e2SAndrii Nakryiko {
6102c64779e2SAndrii Nakryiko 	.descr = "line_info (dead end + subprog start w/ no linfo)",
6103c64779e2SAndrii Nakryiko 	.raw_types = {
6104c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6105c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
6106c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6107c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
6108c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
6109c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6110c64779e2SAndrii Nakryiko 	},
6111c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0main\0func\0/* main linfo */\0/* func linfo */"),
6112c64779e2SAndrii Nakryiko 	.insns = {
6113c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6114c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 1, 3),
6115c64779e2SAndrii Nakryiko 		BPF_CALL_REL(3),
6116c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6117c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6118c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6119c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6120c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6121c64779e2SAndrii Nakryiko 	},
6122c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6123c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
6124c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6125c64779e2SAndrii Nakryiko 	.func_info = { {0, 3}, {6, 4}, },
6126c64779e2SAndrii Nakryiko 	.line_info = {
6127c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6128c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6129c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6130c64779e2SAndrii Nakryiko 	},
6131c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6132c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6133c64779e2SAndrii Nakryiko },
6134c64779e2SAndrii Nakryiko 
6135c64779e2SAndrii Nakryiko };
6136c64779e2SAndrii Nakryiko 
6137c64779e2SAndrii Nakryiko static size_t probe_prog_length(const struct bpf_insn *fp)
6138c64779e2SAndrii Nakryiko {
6139c64779e2SAndrii Nakryiko 	size_t len;
6140c64779e2SAndrii Nakryiko 
6141c64779e2SAndrii Nakryiko 	for (len = MAX_INSNS - 1; len > 0; --len)
6142c64779e2SAndrii Nakryiko 		if (fp[len].code != 0 || fp[len].imm != 0)
6143c64779e2SAndrii Nakryiko 			break;
6144c64779e2SAndrii Nakryiko 	return len + 1;
6145c64779e2SAndrii Nakryiko }
6146c64779e2SAndrii Nakryiko 
6147c64779e2SAndrii Nakryiko static __u32 *patch_name_tbd(const __u32 *raw_u32,
6148c64779e2SAndrii Nakryiko 			     const char *str, __u32 str_off,
6149c64779e2SAndrii Nakryiko 			     unsigned int str_sec_size,
6150c64779e2SAndrii Nakryiko 			     unsigned int *ret_size)
6151c64779e2SAndrii Nakryiko {
6152c64779e2SAndrii Nakryiko 	int i, raw_u32_size = get_raw_sec_size(raw_u32);
6153c64779e2SAndrii Nakryiko 	const char *end_str = str + str_sec_size;
6154c64779e2SAndrii Nakryiko 	const char *next_str = str + str_off;
6155c64779e2SAndrii Nakryiko 	__u32 *new_u32 = NULL;
6156c64779e2SAndrii Nakryiko 
6157c64779e2SAndrii Nakryiko 	if (raw_u32_size == -1)
6158c64779e2SAndrii Nakryiko 		return ERR_PTR(-EINVAL);
6159c64779e2SAndrii Nakryiko 
6160c64779e2SAndrii Nakryiko 	if (!raw_u32_size) {
6161c64779e2SAndrii Nakryiko 		*ret_size = 0;
6162c64779e2SAndrii Nakryiko 		return NULL;
6163c64779e2SAndrii Nakryiko 	}
6164c64779e2SAndrii Nakryiko 
6165c64779e2SAndrii Nakryiko 	new_u32 = malloc(raw_u32_size);
6166c64779e2SAndrii Nakryiko 	if (!new_u32)
6167c64779e2SAndrii Nakryiko 		return ERR_PTR(-ENOMEM);
6168c64779e2SAndrii Nakryiko 
6169c64779e2SAndrii Nakryiko 	for (i = 0; i < raw_u32_size / sizeof(raw_u32[0]); i++) {
6170c64779e2SAndrii Nakryiko 		if (raw_u32[i] == NAME_TBD) {
6171c64779e2SAndrii Nakryiko 			next_str = get_next_str(next_str, end_str);
6172c64779e2SAndrii Nakryiko 			if (CHECK(!next_str, "Error in getting next_str\n")) {
6173c64779e2SAndrii Nakryiko 				free(new_u32);
6174c64779e2SAndrii Nakryiko 				return ERR_PTR(-EINVAL);
6175c64779e2SAndrii Nakryiko 			}
6176c64779e2SAndrii Nakryiko 			new_u32[i] = next_str - str;
6177c64779e2SAndrii Nakryiko 			next_str += strlen(next_str);
6178c64779e2SAndrii Nakryiko 		} else {
6179c64779e2SAndrii Nakryiko 			new_u32[i] = raw_u32[i];
6180c64779e2SAndrii Nakryiko 		}
6181c64779e2SAndrii Nakryiko 	}
6182c64779e2SAndrii Nakryiko 
6183c64779e2SAndrii Nakryiko 	*ret_size = raw_u32_size;
6184c64779e2SAndrii Nakryiko 	return new_u32;
6185c64779e2SAndrii Nakryiko }
6186c64779e2SAndrii Nakryiko 
6187c64779e2SAndrii Nakryiko static int test_get_finfo(const struct prog_info_raw_test *test,
6188c64779e2SAndrii Nakryiko 			  int prog_fd)
6189c64779e2SAndrii Nakryiko {
6190c64779e2SAndrii Nakryiko 	struct bpf_prog_info info = {};
6191c64779e2SAndrii Nakryiko 	struct bpf_func_info *finfo;
6192c64779e2SAndrii Nakryiko 	__u32 info_len, rec_size, i;
6193c64779e2SAndrii Nakryiko 	void *func_info = NULL;
6194c64779e2SAndrii Nakryiko 	__u32 nr_func_info;
6195c64779e2SAndrii Nakryiko 	int err;
6196c64779e2SAndrii Nakryiko 
6197c64779e2SAndrii Nakryiko 	/* get necessary lens */
6198c64779e2SAndrii Nakryiko 	info_len = sizeof(struct bpf_prog_info);
6199c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
6200bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "invalid get info (1st) errno:%d", errno)) {
6201c64779e2SAndrii Nakryiko 		fprintf(stderr, "%s\n", btf_log_buf);
6202c64779e2SAndrii Nakryiko 		return -1;
6203c64779e2SAndrii Nakryiko 	}
6204c64779e2SAndrii Nakryiko 	nr_func_info = test->func_info_cnt - test->dead_func_cnt;
6205c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_func_info != nr_func_info,
6206c64779e2SAndrii Nakryiko 		  "incorrect info.nr_func_info (1st) %d",
6207c64779e2SAndrii Nakryiko 		  info.nr_func_info)) {
6208c64779e2SAndrii Nakryiko 		return -1;
6209c64779e2SAndrii Nakryiko 	}
6210c64779e2SAndrii Nakryiko 
6211c64779e2SAndrii Nakryiko 	rec_size = info.func_info_rec_size;
6212c64779e2SAndrii Nakryiko 	if (CHECK(rec_size != sizeof(struct bpf_func_info),
6213c64779e2SAndrii Nakryiko 		  "incorrect info.func_info_rec_size (1st) %d", rec_size)) {
6214c64779e2SAndrii Nakryiko 		return -1;
6215c64779e2SAndrii Nakryiko 	}
6216c64779e2SAndrii Nakryiko 
6217c64779e2SAndrii Nakryiko 	if (!info.nr_func_info)
6218c64779e2SAndrii Nakryiko 		return 0;
6219c64779e2SAndrii Nakryiko 
6220c64779e2SAndrii Nakryiko 	func_info = malloc(info.nr_func_info * rec_size);
6221c64779e2SAndrii Nakryiko 	if (CHECK(!func_info, "out of memory"))
6222c64779e2SAndrii Nakryiko 		return -1;
6223c64779e2SAndrii Nakryiko 
6224c64779e2SAndrii Nakryiko 	/* reset info to only retrieve func_info related data */
6225c64779e2SAndrii Nakryiko 	memset(&info, 0, sizeof(info));
6226c64779e2SAndrii Nakryiko 	info.nr_func_info = nr_func_info;
6227c64779e2SAndrii Nakryiko 	info.func_info_rec_size = rec_size;
6228c64779e2SAndrii Nakryiko 	info.func_info = ptr_to_u64(func_info);
6229c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
6230bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "invalid get info (2nd) errno:%d", errno)) {
6231c64779e2SAndrii Nakryiko 		fprintf(stderr, "%s\n", btf_log_buf);
6232c64779e2SAndrii Nakryiko 		err = -1;
6233c64779e2SAndrii Nakryiko 		goto done;
6234c64779e2SAndrii Nakryiko 	}
6235c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_func_info != nr_func_info,
6236c64779e2SAndrii Nakryiko 		  "incorrect info.nr_func_info (2nd) %d",
6237c64779e2SAndrii Nakryiko 		  info.nr_func_info)) {
6238c64779e2SAndrii Nakryiko 		err = -1;
6239c64779e2SAndrii Nakryiko 		goto done;
6240c64779e2SAndrii Nakryiko 	}
6241c64779e2SAndrii Nakryiko 	if (CHECK(info.func_info_rec_size != rec_size,
6242c64779e2SAndrii Nakryiko 		  "incorrect info.func_info_rec_size (2nd) %d",
6243c64779e2SAndrii Nakryiko 		  info.func_info_rec_size)) {
6244c64779e2SAndrii Nakryiko 		err = -1;
6245c64779e2SAndrii Nakryiko 		goto done;
6246c64779e2SAndrii Nakryiko 	}
6247c64779e2SAndrii Nakryiko 
6248c64779e2SAndrii Nakryiko 	finfo = func_info;
6249c64779e2SAndrii Nakryiko 	for (i = 0; i < nr_func_info; i++) {
6250c64779e2SAndrii Nakryiko 		if (test->dead_func_mask & (1 << i))
6251c64779e2SAndrii Nakryiko 			continue;
6252c64779e2SAndrii Nakryiko 		if (CHECK(finfo->type_id != test->func_info[i][1],
6253c64779e2SAndrii Nakryiko 			  "incorrect func_type %u expected %u",
6254c64779e2SAndrii Nakryiko 			  finfo->type_id, test->func_info[i][1])) {
6255c64779e2SAndrii Nakryiko 			err = -1;
6256c64779e2SAndrii Nakryiko 			goto done;
6257c64779e2SAndrii Nakryiko 		}
6258c64779e2SAndrii Nakryiko 		finfo = (void *)finfo + rec_size;
6259c64779e2SAndrii Nakryiko 	}
6260c64779e2SAndrii Nakryiko 
6261c64779e2SAndrii Nakryiko 	err = 0;
6262c64779e2SAndrii Nakryiko 
6263c64779e2SAndrii Nakryiko done:
6264c64779e2SAndrii Nakryiko 	free(func_info);
6265c64779e2SAndrii Nakryiko 	return err;
6266c64779e2SAndrii Nakryiko }
6267c64779e2SAndrii Nakryiko 
6268c64779e2SAndrii Nakryiko static int test_get_linfo(const struct prog_info_raw_test *test,
6269c64779e2SAndrii Nakryiko 			  const void *patched_linfo,
6270c64779e2SAndrii Nakryiko 			  __u32 cnt, int prog_fd)
6271c64779e2SAndrii Nakryiko {
6272c64779e2SAndrii Nakryiko 	__u32 i, info_len, nr_jited_ksyms, nr_jited_func_lens;
6273c64779e2SAndrii Nakryiko 	__u64 *jited_linfo = NULL, *jited_ksyms = NULL;
6274c64779e2SAndrii Nakryiko 	__u32 rec_size, jited_rec_size, jited_cnt;
6275c64779e2SAndrii Nakryiko 	struct bpf_line_info *linfo = NULL;
6276c64779e2SAndrii Nakryiko 	__u32 cur_func_len, ksyms_found;
6277c64779e2SAndrii Nakryiko 	struct bpf_prog_info info = {};
6278c64779e2SAndrii Nakryiko 	__u32 *jited_func_lens = NULL;
6279c64779e2SAndrii Nakryiko 	__u64 cur_func_ksyms;
6280c64779e2SAndrii Nakryiko 	__u32 dead_insns;
6281c64779e2SAndrii Nakryiko 	int err;
6282c64779e2SAndrii Nakryiko 
6283c64779e2SAndrii Nakryiko 	jited_cnt = cnt;
6284c64779e2SAndrii Nakryiko 	rec_size = sizeof(*linfo);
6285c64779e2SAndrii Nakryiko 	jited_rec_size = sizeof(*jited_linfo);
6286c64779e2SAndrii Nakryiko 	if (test->nr_jited_ksyms)
6287c64779e2SAndrii Nakryiko 		nr_jited_ksyms = test->nr_jited_ksyms;
6288c64779e2SAndrii Nakryiko 	else
6289c64779e2SAndrii Nakryiko 		nr_jited_ksyms = test->func_info_cnt - test->dead_func_cnt;
6290c64779e2SAndrii Nakryiko 	nr_jited_func_lens = nr_jited_ksyms;
6291c64779e2SAndrii Nakryiko 
6292c64779e2SAndrii Nakryiko 	info_len = sizeof(struct bpf_prog_info);
6293c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
6294bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "err:%d errno:%d", err, errno)) {
6295c64779e2SAndrii Nakryiko 		err = -1;
6296c64779e2SAndrii Nakryiko 		goto done;
6297c64779e2SAndrii Nakryiko 	}
6298c64779e2SAndrii Nakryiko 
6299c64779e2SAndrii Nakryiko 	if (!info.jited_prog_len) {
6300c64779e2SAndrii Nakryiko 		/* prog is not jited */
6301c64779e2SAndrii Nakryiko 		jited_cnt = 0;
6302c64779e2SAndrii Nakryiko 		nr_jited_ksyms = 1;
6303c64779e2SAndrii Nakryiko 		nr_jited_func_lens = 1;
6304c64779e2SAndrii Nakryiko 	}
6305c64779e2SAndrii Nakryiko 
6306c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_line_info != cnt ||
6307c64779e2SAndrii Nakryiko 		  info.nr_jited_line_info != jited_cnt ||
6308c64779e2SAndrii Nakryiko 		  info.nr_jited_ksyms != nr_jited_ksyms ||
6309c64779e2SAndrii Nakryiko 		  info.nr_jited_func_lens != nr_jited_func_lens ||
6310c64779e2SAndrii Nakryiko 		  (!info.nr_line_info && info.nr_jited_line_info),
6311c64779e2SAndrii Nakryiko 		  "info: nr_line_info:%u(expected:%u) nr_jited_line_info:%u(expected:%u) nr_jited_ksyms:%u(expected:%u) nr_jited_func_lens:%u(expected:%u)",
6312c64779e2SAndrii Nakryiko 		  info.nr_line_info, cnt,
6313c64779e2SAndrii Nakryiko 		  info.nr_jited_line_info, jited_cnt,
6314c64779e2SAndrii Nakryiko 		  info.nr_jited_ksyms, nr_jited_ksyms,
6315c64779e2SAndrii Nakryiko 		  info.nr_jited_func_lens, nr_jited_func_lens)) {
6316c64779e2SAndrii Nakryiko 		err = -1;
6317c64779e2SAndrii Nakryiko 		goto done;
6318c64779e2SAndrii Nakryiko 	}
6319c64779e2SAndrii Nakryiko 
6320c64779e2SAndrii Nakryiko 	if (CHECK(info.line_info_rec_size != sizeof(struct bpf_line_info) ||
6321c64779e2SAndrii Nakryiko 		  info.jited_line_info_rec_size != sizeof(__u64),
6322c64779e2SAndrii Nakryiko 		  "info: line_info_rec_size:%u(userspace expected:%u) jited_line_info_rec_size:%u(userspace expected:%u)",
6323c64779e2SAndrii Nakryiko 		  info.line_info_rec_size, rec_size,
6324c64779e2SAndrii Nakryiko 		  info.jited_line_info_rec_size, jited_rec_size)) {
6325c64779e2SAndrii Nakryiko 		err = -1;
6326c64779e2SAndrii Nakryiko 		goto done;
6327c64779e2SAndrii Nakryiko 	}
6328c64779e2SAndrii Nakryiko 
6329c64779e2SAndrii Nakryiko 	if (!cnt)
6330c64779e2SAndrii Nakryiko 		return 0;
6331c64779e2SAndrii Nakryiko 
6332c64779e2SAndrii Nakryiko 	rec_size = info.line_info_rec_size;
6333c64779e2SAndrii Nakryiko 	jited_rec_size = info.jited_line_info_rec_size;
6334c64779e2SAndrii Nakryiko 
6335c64779e2SAndrii Nakryiko 	memset(&info, 0, sizeof(info));
6336c64779e2SAndrii Nakryiko 
6337c64779e2SAndrii Nakryiko 	linfo = calloc(cnt, rec_size);
6338c64779e2SAndrii Nakryiko 	if (CHECK(!linfo, "!linfo")) {
6339c64779e2SAndrii Nakryiko 		err = -1;
6340c64779e2SAndrii Nakryiko 		goto done;
6341c64779e2SAndrii Nakryiko 	}
6342c64779e2SAndrii Nakryiko 	info.nr_line_info = cnt;
6343c64779e2SAndrii Nakryiko 	info.line_info_rec_size = rec_size;
6344c64779e2SAndrii Nakryiko 	info.line_info = ptr_to_u64(linfo);
6345c64779e2SAndrii Nakryiko 
6346c64779e2SAndrii Nakryiko 	if (jited_cnt) {
6347c64779e2SAndrii Nakryiko 		jited_linfo = calloc(jited_cnt, jited_rec_size);
6348c64779e2SAndrii Nakryiko 		jited_ksyms = calloc(nr_jited_ksyms, sizeof(*jited_ksyms));
6349c64779e2SAndrii Nakryiko 		jited_func_lens = calloc(nr_jited_func_lens,
6350c64779e2SAndrii Nakryiko 					 sizeof(*jited_func_lens));
6351c64779e2SAndrii Nakryiko 		if (CHECK(!jited_linfo || !jited_ksyms || !jited_func_lens,
6352c64779e2SAndrii Nakryiko 			  "jited_linfo:%p jited_ksyms:%p jited_func_lens:%p",
6353c64779e2SAndrii Nakryiko 			  jited_linfo, jited_ksyms, jited_func_lens)) {
6354c64779e2SAndrii Nakryiko 			err = -1;
6355c64779e2SAndrii Nakryiko 			goto done;
6356c64779e2SAndrii Nakryiko 		}
6357c64779e2SAndrii Nakryiko 
6358c64779e2SAndrii Nakryiko 		info.nr_jited_line_info = jited_cnt;
6359c64779e2SAndrii Nakryiko 		info.jited_line_info_rec_size = jited_rec_size;
6360c64779e2SAndrii Nakryiko 		info.jited_line_info = ptr_to_u64(jited_linfo);
6361c64779e2SAndrii Nakryiko 		info.nr_jited_ksyms = nr_jited_ksyms;
6362c64779e2SAndrii Nakryiko 		info.jited_ksyms = ptr_to_u64(jited_ksyms);
6363c64779e2SAndrii Nakryiko 		info.nr_jited_func_lens = nr_jited_func_lens;
6364c64779e2SAndrii Nakryiko 		info.jited_func_lens = ptr_to_u64(jited_func_lens);
6365c64779e2SAndrii Nakryiko 	}
6366c64779e2SAndrii Nakryiko 
6367c64779e2SAndrii Nakryiko 	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
6368c64779e2SAndrii Nakryiko 
6369c64779e2SAndrii Nakryiko 	/*
6370c64779e2SAndrii Nakryiko 	 * Only recheck the info.*line_info* fields.
6371c64779e2SAndrii Nakryiko 	 * Other fields are not the concern of this test.
6372c64779e2SAndrii Nakryiko 	 */
6373bad2e478SAndrii Nakryiko 	if (CHECK(err < 0 ||
6374c64779e2SAndrii Nakryiko 		  info.nr_line_info != cnt ||
6375c64779e2SAndrii Nakryiko 		  (jited_cnt && !info.jited_line_info) ||
6376c64779e2SAndrii Nakryiko 		  info.nr_jited_line_info != jited_cnt ||
6377c64779e2SAndrii Nakryiko 		  info.line_info_rec_size != rec_size ||
6378c64779e2SAndrii Nakryiko 		  info.jited_line_info_rec_size != jited_rec_size,
6379c64779e2SAndrii Nakryiko 		  "err:%d errno:%d info: nr_line_info:%u(expected:%u) nr_jited_line_info:%u(expected:%u) line_info_rec_size:%u(expected:%u) jited_linfo_rec_size:%u(expected:%u) line_info:%p jited_line_info:%p",
6380c64779e2SAndrii Nakryiko 		  err, errno,
6381c64779e2SAndrii Nakryiko 		  info.nr_line_info, cnt,
6382c64779e2SAndrii Nakryiko 		  info.nr_jited_line_info, jited_cnt,
6383c64779e2SAndrii Nakryiko 		  info.line_info_rec_size, rec_size,
6384c64779e2SAndrii Nakryiko 		  info.jited_line_info_rec_size, jited_rec_size,
6385c64779e2SAndrii Nakryiko 		  (void *)(long)info.line_info,
6386c64779e2SAndrii Nakryiko 		  (void *)(long)info.jited_line_info)) {
6387c64779e2SAndrii Nakryiko 		err = -1;
6388c64779e2SAndrii Nakryiko 		goto done;
6389c64779e2SAndrii Nakryiko 	}
6390c64779e2SAndrii Nakryiko 
6391c64779e2SAndrii Nakryiko 	dead_insns = 0;
6392c64779e2SAndrii Nakryiko 	while (test->dead_code_mask & (1 << dead_insns))
6393c64779e2SAndrii Nakryiko 		dead_insns++;
6394c64779e2SAndrii Nakryiko 
6395c64779e2SAndrii Nakryiko 	CHECK(linfo[0].insn_off, "linfo[0].insn_off:%u",
6396c64779e2SAndrii Nakryiko 	      linfo[0].insn_off);
6397c64779e2SAndrii Nakryiko 	for (i = 1; i < cnt; i++) {
6398c64779e2SAndrii Nakryiko 		const struct bpf_line_info *expected_linfo;
6399c64779e2SAndrii Nakryiko 
6400c64779e2SAndrii Nakryiko 		while (test->dead_code_mask & (1 << (i + dead_insns)))
6401c64779e2SAndrii Nakryiko 			dead_insns++;
6402c64779e2SAndrii Nakryiko 
6403c64779e2SAndrii Nakryiko 		expected_linfo = patched_linfo +
6404c64779e2SAndrii Nakryiko 			((i + dead_insns) * test->line_info_rec_size);
6405c64779e2SAndrii Nakryiko 		if (CHECK(linfo[i].insn_off <= linfo[i - 1].insn_off,
6406c64779e2SAndrii Nakryiko 			  "linfo[%u].insn_off:%u <= linfo[%u].insn_off:%u",
6407c64779e2SAndrii Nakryiko 			  i, linfo[i].insn_off,
6408c64779e2SAndrii Nakryiko 			  i - 1, linfo[i - 1].insn_off)) {
6409c64779e2SAndrii Nakryiko 			err = -1;
6410c64779e2SAndrii Nakryiko 			goto done;
6411c64779e2SAndrii Nakryiko 		}
6412c64779e2SAndrii Nakryiko 		if (CHECK(linfo[i].file_name_off != expected_linfo->file_name_off ||
6413c64779e2SAndrii Nakryiko 			  linfo[i].line_off != expected_linfo->line_off ||
6414c64779e2SAndrii Nakryiko 			  linfo[i].line_col != expected_linfo->line_col,
6415c64779e2SAndrii Nakryiko 			  "linfo[%u] (%u, %u, %u) != (%u, %u, %u)", i,
6416c64779e2SAndrii Nakryiko 			  linfo[i].file_name_off,
6417c64779e2SAndrii Nakryiko 			  linfo[i].line_off,
6418c64779e2SAndrii Nakryiko 			  linfo[i].line_col,
6419c64779e2SAndrii Nakryiko 			  expected_linfo->file_name_off,
6420c64779e2SAndrii Nakryiko 			  expected_linfo->line_off,
6421c64779e2SAndrii Nakryiko 			  expected_linfo->line_col)) {
6422c64779e2SAndrii Nakryiko 			err = -1;
6423c64779e2SAndrii Nakryiko 			goto done;
6424c64779e2SAndrii Nakryiko 		}
6425c64779e2SAndrii Nakryiko 	}
6426c64779e2SAndrii Nakryiko 
6427c64779e2SAndrii Nakryiko 	if (!jited_cnt) {
6428c64779e2SAndrii Nakryiko 		fprintf(stderr, "not jited. skipping jited_line_info check. ");
6429c64779e2SAndrii Nakryiko 		err = 0;
6430c64779e2SAndrii Nakryiko 		goto done;
6431c64779e2SAndrii Nakryiko 	}
6432c64779e2SAndrii Nakryiko 
6433c64779e2SAndrii Nakryiko 	if (CHECK(jited_linfo[0] != jited_ksyms[0],
6434c64779e2SAndrii Nakryiko 		  "jited_linfo[0]:%lx != jited_ksyms[0]:%lx",
6435c64779e2SAndrii Nakryiko 		  (long)(jited_linfo[0]), (long)(jited_ksyms[0]))) {
6436c64779e2SAndrii Nakryiko 		err = -1;
6437c64779e2SAndrii Nakryiko 		goto done;
6438c64779e2SAndrii Nakryiko 	}
6439c64779e2SAndrii Nakryiko 
6440c64779e2SAndrii Nakryiko 	ksyms_found = 1;
6441c64779e2SAndrii Nakryiko 	cur_func_len = jited_func_lens[0];
6442c64779e2SAndrii Nakryiko 	cur_func_ksyms = jited_ksyms[0];
6443c64779e2SAndrii Nakryiko 	for (i = 1; i < jited_cnt; i++) {
6444c64779e2SAndrii Nakryiko 		if (ksyms_found < nr_jited_ksyms &&
6445c64779e2SAndrii Nakryiko 		    jited_linfo[i] == jited_ksyms[ksyms_found]) {
6446c64779e2SAndrii Nakryiko 			cur_func_ksyms = jited_ksyms[ksyms_found];
6447c64779e2SAndrii Nakryiko 			cur_func_len = jited_ksyms[ksyms_found];
6448c64779e2SAndrii Nakryiko 			ksyms_found++;
6449c64779e2SAndrii Nakryiko 			continue;
6450c64779e2SAndrii Nakryiko 		}
6451c64779e2SAndrii Nakryiko 
6452c64779e2SAndrii Nakryiko 		if (CHECK(jited_linfo[i] <= jited_linfo[i - 1],
6453c64779e2SAndrii Nakryiko 			  "jited_linfo[%u]:%lx <= jited_linfo[%u]:%lx",
6454c64779e2SAndrii Nakryiko 			  i, (long)jited_linfo[i],
6455c64779e2SAndrii Nakryiko 			  i - 1, (long)(jited_linfo[i - 1]))) {
6456c64779e2SAndrii Nakryiko 			err = -1;
6457c64779e2SAndrii Nakryiko 			goto done;
6458c64779e2SAndrii Nakryiko 		}
6459c64779e2SAndrii Nakryiko 
6460c64779e2SAndrii Nakryiko 		if (CHECK(jited_linfo[i] - cur_func_ksyms > cur_func_len,
6461c64779e2SAndrii Nakryiko 			  "jited_linfo[%u]:%lx - %lx > %u",
6462c64779e2SAndrii Nakryiko 			  i, (long)jited_linfo[i], (long)cur_func_ksyms,
6463c64779e2SAndrii Nakryiko 			  cur_func_len)) {
6464c64779e2SAndrii Nakryiko 			err = -1;
6465c64779e2SAndrii Nakryiko 			goto done;
6466c64779e2SAndrii Nakryiko 		}
6467c64779e2SAndrii Nakryiko 	}
6468c64779e2SAndrii Nakryiko 
6469c64779e2SAndrii Nakryiko 	if (CHECK(ksyms_found != nr_jited_ksyms,
6470c64779e2SAndrii Nakryiko 		  "ksyms_found:%u != nr_jited_ksyms:%u",
6471c64779e2SAndrii Nakryiko 		  ksyms_found, nr_jited_ksyms)) {
6472c64779e2SAndrii Nakryiko 		err = -1;
6473c64779e2SAndrii Nakryiko 		goto done;
6474c64779e2SAndrii Nakryiko 	}
6475c64779e2SAndrii Nakryiko 
6476c64779e2SAndrii Nakryiko 	err = 0;
6477c64779e2SAndrii Nakryiko 
6478c64779e2SAndrii Nakryiko done:
6479c64779e2SAndrii Nakryiko 	free(linfo);
6480c64779e2SAndrii Nakryiko 	free(jited_linfo);
6481c64779e2SAndrii Nakryiko 	free(jited_ksyms);
6482c64779e2SAndrii Nakryiko 	free(jited_func_lens);
6483c64779e2SAndrii Nakryiko 	return err;
6484c64779e2SAndrii Nakryiko }
6485c64779e2SAndrii Nakryiko 
6486c64779e2SAndrii Nakryiko static void do_test_info_raw(unsigned int test_num)
6487c64779e2SAndrii Nakryiko {
6488c64779e2SAndrii Nakryiko 	const struct prog_info_raw_test *test = &info_raw_tests[test_num - 1];
6489c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size, linfo_str_off, linfo_size;
6490c64779e2SAndrii Nakryiko 	int btf_fd = -1, prog_fd = -1, err = 0;
6491c64779e2SAndrii Nakryiko 	void *raw_btf, *patched_linfo = NULL;
6492c64779e2SAndrii Nakryiko 	const char *ret_next_str;
6493c64779e2SAndrii Nakryiko 	union bpf_attr attr = {};
6494c64779e2SAndrii Nakryiko 
6495c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
6496c64779e2SAndrii Nakryiko 		return;
6497c64779e2SAndrii Nakryiko 
6498c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types,
6499c64779e2SAndrii Nakryiko 				 test->str_sec, test->str_sec_size,
6500c64779e2SAndrii Nakryiko 				 &raw_btf_size, &ret_next_str);
6501c64779e2SAndrii Nakryiko 	if (!raw_btf)
6502c64779e2SAndrii Nakryiko 		return;
6503c64779e2SAndrii Nakryiko 
6504c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
6505c64779e2SAndrii Nakryiko 	btf_fd = bpf_load_btf(raw_btf, raw_btf_size,
6506c64779e2SAndrii Nakryiko 			      btf_log_buf, BTF_LOG_BUF_SIZE,
6507c64779e2SAndrii Nakryiko 			      always_log);
6508c64779e2SAndrii Nakryiko 	free(raw_btf);
6509c64779e2SAndrii Nakryiko 
6510bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd < 0, "invalid btf_fd errno:%d", errno)) {
6511c64779e2SAndrii Nakryiko 		err = -1;
6512c64779e2SAndrii Nakryiko 		goto done;
6513c64779e2SAndrii Nakryiko 	}
6514c64779e2SAndrii Nakryiko 
6515c64779e2SAndrii Nakryiko 	if (*btf_log_buf && always_log)
6516c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
6517c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
6518c64779e2SAndrii Nakryiko 
6519c64779e2SAndrii Nakryiko 	linfo_str_off = ret_next_str - test->str_sec;
6520c64779e2SAndrii Nakryiko 	patched_linfo = patch_name_tbd(test->line_info,
6521c64779e2SAndrii Nakryiko 				       test->str_sec, linfo_str_off,
6522c64779e2SAndrii Nakryiko 				       test->str_sec_size, &linfo_size);
6523bad2e478SAndrii Nakryiko 	err = libbpf_get_error(patched_linfo);
6524bad2e478SAndrii Nakryiko 	if (err) {
6525c64779e2SAndrii Nakryiko 		fprintf(stderr, "error in creating raw bpf_line_info");
6526c64779e2SAndrii Nakryiko 		err = -1;
6527c64779e2SAndrii Nakryiko 		goto done;
6528c64779e2SAndrii Nakryiko 	}
6529c64779e2SAndrii Nakryiko 
6530c64779e2SAndrii Nakryiko 	attr.prog_type = test->prog_type;
6531c64779e2SAndrii Nakryiko 	attr.insns = ptr_to_u64(test->insns);
6532c64779e2SAndrii Nakryiko 	attr.insn_cnt = probe_prog_length(test->insns);
6533c64779e2SAndrii Nakryiko 	attr.license = ptr_to_u64("GPL");
6534c64779e2SAndrii Nakryiko 	attr.prog_btf_fd = btf_fd;
6535c64779e2SAndrii Nakryiko 	attr.func_info_rec_size = test->func_info_rec_size;
6536c64779e2SAndrii Nakryiko 	attr.func_info_cnt = test->func_info_cnt;
6537c64779e2SAndrii Nakryiko 	attr.func_info = ptr_to_u64(test->func_info);
6538c64779e2SAndrii Nakryiko 	attr.log_buf = ptr_to_u64(btf_log_buf);
6539c64779e2SAndrii Nakryiko 	attr.log_size = BTF_LOG_BUF_SIZE;
6540c64779e2SAndrii Nakryiko 	attr.log_level = 1;
6541c64779e2SAndrii Nakryiko 	if (linfo_size) {
6542c64779e2SAndrii Nakryiko 		attr.line_info_rec_size = test->line_info_rec_size;
6543c64779e2SAndrii Nakryiko 		attr.line_info = ptr_to_u64(patched_linfo);
6544c64779e2SAndrii Nakryiko 		attr.line_info_cnt = linfo_size / attr.line_info_rec_size;
6545c64779e2SAndrii Nakryiko 	}
6546c64779e2SAndrii Nakryiko 
6547c64779e2SAndrii Nakryiko 	prog_fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
6548bad2e478SAndrii Nakryiko 	err = ((prog_fd < 0) != test->expected_prog_load_failure);
6549c64779e2SAndrii Nakryiko 	if (CHECK(err, "prog_fd:%d expected_prog_load_failure:%u errno:%d",
6550c64779e2SAndrii Nakryiko 		  prog_fd, test->expected_prog_load_failure, errno) ||
6551c64779e2SAndrii Nakryiko 	    CHECK(test->err_str && !strstr(btf_log_buf, test->err_str),
6552c64779e2SAndrii Nakryiko 		  "expected err_str:%s", test->err_str)) {
6553c64779e2SAndrii Nakryiko 		err = -1;
6554c64779e2SAndrii Nakryiko 		goto done;
6555c64779e2SAndrii Nakryiko 	}
6556c64779e2SAndrii Nakryiko 
6557bad2e478SAndrii Nakryiko 	if (prog_fd < 0)
6558c64779e2SAndrii Nakryiko 		goto done;
6559c64779e2SAndrii Nakryiko 
6560c64779e2SAndrii Nakryiko 	err = test_get_finfo(test, prog_fd);
6561c64779e2SAndrii Nakryiko 	if (err)
6562c64779e2SAndrii Nakryiko 		goto done;
6563c64779e2SAndrii Nakryiko 
6564c64779e2SAndrii Nakryiko 	err = test_get_linfo(test, patched_linfo,
6565c64779e2SAndrii Nakryiko 			     attr.line_info_cnt - test->dead_code_cnt,
6566c64779e2SAndrii Nakryiko 			     prog_fd);
6567c64779e2SAndrii Nakryiko 	if (err)
6568c64779e2SAndrii Nakryiko 		goto done;
6569c64779e2SAndrii Nakryiko 
6570c64779e2SAndrii Nakryiko done:
6571c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
6572c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
6573c64779e2SAndrii Nakryiko 
6574bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
6575c64779e2SAndrii Nakryiko 		close(btf_fd);
6576bad2e478SAndrii Nakryiko 	if (prog_fd >= 0)
6577c64779e2SAndrii Nakryiko 		close(prog_fd);
6578c64779e2SAndrii Nakryiko 
6579bad2e478SAndrii Nakryiko 	if (!libbpf_get_error(patched_linfo))
6580c64779e2SAndrii Nakryiko 		free(patched_linfo);
6581c64779e2SAndrii Nakryiko }
6582c64779e2SAndrii Nakryiko 
6583c64779e2SAndrii Nakryiko struct btf_raw_data {
6584c64779e2SAndrii Nakryiko 	__u32 raw_types[MAX_NR_RAW_U32];
6585c64779e2SAndrii Nakryiko 	const char *str_sec;
6586c64779e2SAndrii Nakryiko 	__u32 str_sec_size;
6587c64779e2SAndrii Nakryiko };
6588c64779e2SAndrii Nakryiko 
6589c64779e2SAndrii Nakryiko struct btf_dedup_test {
6590c64779e2SAndrii Nakryiko 	const char *descr;
6591c64779e2SAndrii Nakryiko 	struct btf_raw_data input;
6592c64779e2SAndrii Nakryiko 	struct btf_raw_data expect;
6593c64779e2SAndrii Nakryiko 	struct btf_dedup_opts opts;
6594c64779e2SAndrii Nakryiko };
6595c64779e2SAndrii Nakryiko 
6596c64779e2SAndrii Nakryiko const struct btf_dedup_test dedup_tests[] = {
6597c64779e2SAndrii Nakryiko 
6598c64779e2SAndrii Nakryiko {
6599c64779e2SAndrii Nakryiko 	.descr = "dedup: unused strings filtering",
6600c64779e2SAndrii Nakryiko 	.input = {
6601c64779e2SAndrii Nakryiko 		.raw_types = {
6602c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 4),
6603c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 64, 8),
6604c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6605c64779e2SAndrii Nakryiko 		},
6606c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0unused\0int\0foo\0bar\0long"),
6607c64779e2SAndrii Nakryiko 	},
6608c64779e2SAndrii Nakryiko 	.expect = {
6609c64779e2SAndrii Nakryiko 		.raw_types = {
6610c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6611c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6612c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6613c64779e2SAndrii Nakryiko 		},
6614c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0int\0long"),
6615c64779e2SAndrii Nakryiko 	},
6616c64779e2SAndrii Nakryiko 	.opts = {
6617c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
6618c64779e2SAndrii Nakryiko 	},
6619c64779e2SAndrii Nakryiko },
6620c64779e2SAndrii Nakryiko {
6621c64779e2SAndrii Nakryiko 	.descr = "dedup: strings deduplication",
6622c64779e2SAndrii Nakryiko 	.input = {
6623c64779e2SAndrii Nakryiko 		.raw_types = {
6624c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6625c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6626c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(3), BTF_INT_SIGNED, 0, 32, 4),
6627c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(4), BTF_INT_SIGNED, 0, 64, 8),
6628c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4),
6629c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6630c64779e2SAndrii Nakryiko 		},
6631c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0int\0long int\0int\0long int\0int"),
6632c64779e2SAndrii Nakryiko 	},
6633c64779e2SAndrii Nakryiko 	.expect = {
6634c64779e2SAndrii Nakryiko 		.raw_types = {
6635c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6636c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6637c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6638c64779e2SAndrii Nakryiko 		},
6639c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0int\0long int"),
6640c64779e2SAndrii Nakryiko 	},
6641c64779e2SAndrii Nakryiko 	.opts = {
6642c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
6643c64779e2SAndrii Nakryiko 	},
6644c64779e2SAndrii Nakryiko },
6645c64779e2SAndrii Nakryiko {
6646c64779e2SAndrii Nakryiko 	.descr = "dedup: struct example #1",
6647c64779e2SAndrii Nakryiko 	/*
6648c64779e2SAndrii Nakryiko 	 * struct s {
6649c64779e2SAndrii Nakryiko 	 *	struct s *next;
6650c64779e2SAndrii Nakryiko 	 *	const int *a;
6651c64779e2SAndrii Nakryiko 	 *	int b[16];
6652c64779e2SAndrii Nakryiko 	 *	int c;
6653c64779e2SAndrii Nakryiko 	 * }
6654c64779e2SAndrii Nakryiko 	 */
6655c64779e2SAndrii Nakryiko 	.input = {
6656c64779e2SAndrii Nakryiko 		.raw_types = {
6657c64779e2SAndrii Nakryiko 			/* int */
6658c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6659c64779e2SAndrii Nakryiko 			/* int[16] */
6660c64779e2SAndrii Nakryiko 			BTF_TYPE_ARRAY_ENC(1, 1, 16),					/* [2] */
6661c64779e2SAndrii Nakryiko 			/* struct s { */
66627999cf7dSIlya Leoshkevich 			BTF_STRUCT_ENC(NAME_NTH(2), 5, 88),				/* [3] */
6663c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(3), 4, 0),	/* struct s *next;	*/
6664c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(4), 5, 64),	/* const int *a;	*/
6665c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(5), 2, 128),	/* int b[16];		*/
6666c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(6), 1, 640),	/* int c;		*/
6667ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(8), 15, 672),	/* float d;		*/
6668c64779e2SAndrii Nakryiko 			/* ptr -> [3] struct s */
6669c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(3),							/* [4] */
6670c64779e2SAndrii Nakryiko 			/* ptr -> [6] const int */
6671c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(6),							/* [5] */
6672c64779e2SAndrii Nakryiko 			/* const -> [1] int */
6673c64779e2SAndrii Nakryiko 			BTF_CONST_ENC(1),						/* [6] */
6674ad526474SYonghong Song 			/* tag -> [3] struct s */
6675223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1),				/* [7] */
6676ad526474SYonghong Song 			/* tag -> [3] struct s, member 1 */
6677223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1),				/* [8] */
6678c64779e2SAndrii Nakryiko 
6679c64779e2SAndrii Nakryiko 			/* full copy of the above */
6680ad526474SYonghong Song 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),	/* [9] */
6681ad526474SYonghong Song 			BTF_TYPE_ARRAY_ENC(9, 9, 16),					/* [10] */
6682ad526474SYonghong Song 			BTF_STRUCT_ENC(NAME_NTH(2), 5, 88),				/* [11] */
6683ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(3), 12, 0),
6684ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(4), 13, 64),
6685ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(5), 10, 128),
6686ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(6), 9, 640),
6687ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(8), 15, 672),
6688ad526474SYonghong Song 			BTF_PTR_ENC(11),						/* [12] */
6689ad526474SYonghong Song 			BTF_PTR_ENC(14),						/* [13] */
6690ad526474SYonghong Song 			BTF_CONST_ENC(9),						/* [14] */
6691ad526474SYonghong Song 			BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4),				/* [15] */
6692223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 11, -1),				/* [16] */
6693223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 11, 1),				/* [17] */
6694c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6695c64779e2SAndrii Nakryiko 		},
66967999cf7dSIlya Leoshkevich 		BTF_STR_SEC("\0int\0s\0next\0a\0b\0c\0float\0d"),
6697c64779e2SAndrii Nakryiko 	},
6698c64779e2SAndrii Nakryiko 	.expect = {
6699c64779e2SAndrii Nakryiko 		.raw_types = {
6700c64779e2SAndrii Nakryiko 			/* int */
67017999cf7dSIlya Leoshkevich 			BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6702c64779e2SAndrii Nakryiko 			/* int[16] */
6703c64779e2SAndrii Nakryiko 			BTF_TYPE_ARRAY_ENC(1, 1, 16),					/* [2] */
6704c64779e2SAndrii Nakryiko 			/* struct s { */
67057999cf7dSIlya Leoshkevich 			BTF_STRUCT_ENC(NAME_NTH(8), 5, 88),				/* [3] */
67067999cf7dSIlya Leoshkevich 				BTF_MEMBER_ENC(NAME_NTH(7), 4, 0),	/* struct s *next;	*/
6707c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(1), 5, 64),	/* const int *a;	*/
6708c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 2, 128),	/* int b[16];		*/
6709c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(3), 1, 640),	/* int c;		*/
6710ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(4), 9, 672),	/* float d;		*/
6711c64779e2SAndrii Nakryiko 			/* ptr -> [3] struct s */
6712c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(3),							/* [4] */
6713c64779e2SAndrii Nakryiko 			/* ptr -> [6] const int */
6714c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(6),							/* [5] */
6715c64779e2SAndrii Nakryiko 			/* const -> [1] int */
6716c64779e2SAndrii Nakryiko 			BTF_CONST_ENC(1),						/* [6] */
6717223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1),				/* [7] */
6718223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1),				/* [8] */
6719ad526474SYonghong Song 			BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4),				/* [9] */
6720c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6721c64779e2SAndrii Nakryiko 		},
67227999cf7dSIlya Leoshkevich 		BTF_STR_SEC("\0a\0b\0c\0d\0int\0float\0next\0s"),
6723c64779e2SAndrii Nakryiko 	},
6724c64779e2SAndrii Nakryiko 	.opts = {
6725c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
6726c64779e2SAndrii Nakryiko 	},
6727c64779e2SAndrii Nakryiko },
6728c64779e2SAndrii Nakryiko {
6729c64779e2SAndrii Nakryiko 	.descr = "dedup: struct <-> fwd resolution w/ hash collision",
6730c64779e2SAndrii Nakryiko 	/*
6731c64779e2SAndrii Nakryiko 	 * // CU 1:
6732c64779e2SAndrii Nakryiko 	 * struct x;
6733c64779e2SAndrii Nakryiko 	 * struct s {
6734c64779e2SAndrii Nakryiko 	 *	struct x *x;
6735c64779e2SAndrii Nakryiko 	 * };
6736c64779e2SAndrii Nakryiko 	 * // CU 2:
6737c64779e2SAndrii Nakryiko 	 * struct x {};
6738c64779e2SAndrii Nakryiko 	 * struct s {
6739c64779e2SAndrii Nakryiko 	 *	struct x *x;
6740c64779e2SAndrii Nakryiko 	 * };
6741c64779e2SAndrii Nakryiko 	 */
6742c64779e2SAndrii Nakryiko 	.input = {
6743c64779e2SAndrii Nakryiko 		.raw_types = {
6744c64779e2SAndrii Nakryiko 			/* CU 1 */
6745c64779e2SAndrii Nakryiko 			BTF_FWD_ENC(NAME_TBD, 0 /* struct fwd */),	/* [1] fwd x      */
6746c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(1),					/* [2] ptr -> [1] */
6747c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [3] struct s   */
6748c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 2, 0),
6749c64779e2SAndrii Nakryiko 			/* CU 2 */
6750c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 0, 0),			/* [4] struct x   */
6751c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(4),					/* [5] ptr -> [4] */
6752c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [6] struct s   */
6753c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 5, 0),
6754c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6755c64779e2SAndrii Nakryiko 		},
6756c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0x\0s\0x\0x\0s\0x\0"),
6757c64779e2SAndrii Nakryiko 	},
6758c64779e2SAndrii Nakryiko 	.expect = {
6759c64779e2SAndrii Nakryiko 		.raw_types = {
6760c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(3),					/* [1] ptr -> [3] */
6761c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [2] struct s   */
6762c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6763c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(2), 0, 0),		/* [3] struct x   */
6764c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6765c64779e2SAndrii Nakryiko 		},
6766c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0s\0x"),
6767c64779e2SAndrii Nakryiko 	},
6768c64779e2SAndrii Nakryiko 	.opts = {
6769c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
6770c64779e2SAndrii Nakryiko 		.dedup_table_size = 1, /* force hash collisions */
6771c64779e2SAndrii Nakryiko 	},
6772c64779e2SAndrii Nakryiko },
6773c64779e2SAndrii Nakryiko {
6774c64779e2SAndrii Nakryiko 	.descr = "dedup: void equiv check",
6775c64779e2SAndrii Nakryiko 	/*
6776c64779e2SAndrii Nakryiko 	 * // CU 1:
6777c64779e2SAndrii Nakryiko 	 * struct s {
6778c64779e2SAndrii Nakryiko 	 *	struct {} *x;
6779c64779e2SAndrii Nakryiko 	 * };
6780c64779e2SAndrii Nakryiko 	 * // CU 2:
6781c64779e2SAndrii Nakryiko 	 * struct s {
6782c64779e2SAndrii Nakryiko 	 *	int *x;
6783c64779e2SAndrii Nakryiko 	 * };
6784c64779e2SAndrii Nakryiko 	 */
6785c64779e2SAndrii Nakryiko 	.input = {
6786c64779e2SAndrii Nakryiko 		.raw_types = {
6787c64779e2SAndrii Nakryiko 			/* CU 1 */
6788c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(0, 0, 1),				/* [1] struct {}  */
6789c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(1),						/* [2] ptr -> [1] */
6790c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [3] struct s   */
6791c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
6792c64779e2SAndrii Nakryiko 			/* CU 2 */
6793c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(0),						/* [4] ptr -> void */
6794c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [5] struct s   */
6795c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 4, 0),
6796c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6797c64779e2SAndrii Nakryiko 		},
6798c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0s\0x"),
6799c64779e2SAndrii Nakryiko 	},
6800c64779e2SAndrii Nakryiko 	.expect = {
6801c64779e2SAndrii Nakryiko 		.raw_types = {
6802c64779e2SAndrii Nakryiko 			/* CU 1 */
6803c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(0, 0, 1),				/* [1] struct {}  */
6804c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(1),						/* [2] ptr -> [1] */
6805c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [3] struct s   */
6806c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
6807c64779e2SAndrii Nakryiko 			/* CU 2 */
6808c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(0),						/* [4] ptr -> void */
6809c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [5] struct s   */
6810c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 4, 0),
6811c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6812c64779e2SAndrii Nakryiko 		},
6813c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0s\0x"),
6814c64779e2SAndrii Nakryiko 	},
6815c64779e2SAndrii Nakryiko 	.opts = {
6816c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
6817c64779e2SAndrii Nakryiko 		.dedup_table_size = 1, /* force hash collisions */
6818c64779e2SAndrii Nakryiko 	},
6819c64779e2SAndrii Nakryiko },
6820c64779e2SAndrii Nakryiko {
6821c64779e2SAndrii Nakryiko 	.descr = "dedup: all possible kinds (no duplicates)",
6822c64779e2SAndrii Nakryiko 	.input = {
6823c64779e2SAndrii Nakryiko 		.raw_types = {
6824c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8),		/* [1] int */
6825c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4),	/* [2] enum */
6826c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_TBD, 0),
6827c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_TBD, 1),
6828c64779e2SAndrii Nakryiko 			BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */),			/* [3] fwd */
6829c64779e2SAndrii Nakryiko 			BTF_TYPE_ARRAY_ENC(2, 1, 7),					/* [4] array */
6830c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 4),					/* [5] struct */
6831c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6832c64779e2SAndrii Nakryiko 			BTF_UNION_ENC(NAME_TBD, 1, 4),					/* [6] union */
6833c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6834c64779e2SAndrii Nakryiko 			BTF_TYPEDEF_ENC(NAME_TBD, 1),					/* [7] typedef */
6835c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(0),							/* [8] ptr */
6836c64779e2SAndrii Nakryiko 			BTF_CONST_ENC(8),						/* [9] const */
6837c64779e2SAndrii Nakryiko 			BTF_VOLATILE_ENC(8),						/* [10] volatile */
6838c64779e2SAndrii Nakryiko 			BTF_RESTRICT_ENC(8),						/* [11] restrict */
6839c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ENC(1, 2),					/* [12] func_proto */
6840c64779e2SAndrii Nakryiko 				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6841c64779e2SAndrii Nakryiko 				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 8),
6842c64779e2SAndrii Nakryiko 			BTF_FUNC_ENC(NAME_TBD, 12),					/* [13] func */
68437999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_TBD, 2),				/* [14] float */
6844223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 13, -1),				/* [15] tag */
6845223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 13, 1),				/* [16] tag */
6846c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6847c64779e2SAndrii Nakryiko 		},
6848ad526474SYonghong Song 		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"),
6849c64779e2SAndrii Nakryiko 	},
6850c64779e2SAndrii Nakryiko 	.expect = {
6851c64779e2SAndrii Nakryiko 		.raw_types = {
6852c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8),		/* [1] int */
6853c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4),	/* [2] enum */
6854c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_TBD, 0),
6855c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_TBD, 1),
6856c64779e2SAndrii Nakryiko 			BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */),			/* [3] fwd */
6857c64779e2SAndrii Nakryiko 			BTF_TYPE_ARRAY_ENC(2, 1, 7),					/* [4] array */
6858c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 4),					/* [5] struct */
6859c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6860c64779e2SAndrii Nakryiko 			BTF_UNION_ENC(NAME_TBD, 1, 4),					/* [6] union */
6861c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
6862c64779e2SAndrii Nakryiko 			BTF_TYPEDEF_ENC(NAME_TBD, 1),					/* [7] typedef */
6863c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(0),							/* [8] ptr */
6864c64779e2SAndrii Nakryiko 			BTF_CONST_ENC(8),						/* [9] const */
6865c64779e2SAndrii Nakryiko 			BTF_VOLATILE_ENC(8),						/* [10] volatile */
6866c64779e2SAndrii Nakryiko 			BTF_RESTRICT_ENC(8),						/* [11] restrict */
6867c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ENC(1, 2),					/* [12] func_proto */
6868c64779e2SAndrii Nakryiko 				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6869c64779e2SAndrii Nakryiko 				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 8),
6870c64779e2SAndrii Nakryiko 			BTF_FUNC_ENC(NAME_TBD, 12),					/* [13] func */
68717999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_TBD, 2),				/* [14] float */
6872223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 13, -1),				/* [15] tag */
6873223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 13, 1),				/* [16] tag */
6874c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6875c64779e2SAndrii Nakryiko 		},
6876ad526474SYonghong Song 		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"),
6877c64779e2SAndrii Nakryiko 	},
6878c64779e2SAndrii Nakryiko 	.opts = {
6879c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
6880c64779e2SAndrii Nakryiko 	},
6881c64779e2SAndrii Nakryiko },
6882c64779e2SAndrii Nakryiko {
68837999cf7dSIlya Leoshkevich 	.descr = "dedup: no int/float duplicates",
6884c64779e2SAndrii Nakryiko 	.input = {
6885c64779e2SAndrii Nakryiko 		.raw_types = {
6886c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8),
6887c64779e2SAndrii Nakryiko 			/* different name */
6888c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8),
6889c64779e2SAndrii Nakryiko 			/* different encoding */
6890c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8),
6891c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8),
6892c64779e2SAndrii Nakryiko 			/* different bit offset */
6893c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8),
6894c64779e2SAndrii Nakryiko 			/* different bit size */
6895c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8),
6896c64779e2SAndrii Nakryiko 			/* different byte size */
6897c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
68987999cf7dSIlya Leoshkevich 			/* all allowed sizes */
68997999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 2),
69007999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 4),
69017999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 8),
69027999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 12),
69037999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 16),
6904c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6905c64779e2SAndrii Nakryiko 		},
69067999cf7dSIlya Leoshkevich 		BTF_STR_SEC("\0int\0some other int\0float"),
6907c64779e2SAndrii Nakryiko 	},
6908c64779e2SAndrii Nakryiko 	.expect = {
6909c64779e2SAndrii Nakryiko 		.raw_types = {
6910c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8),
6911c64779e2SAndrii Nakryiko 			/* different name */
6912c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8),
6913c64779e2SAndrii Nakryiko 			/* different encoding */
6914c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8),
6915c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8),
6916c64779e2SAndrii Nakryiko 			/* different bit offset */
6917c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8),
6918c64779e2SAndrii Nakryiko 			/* different bit size */
6919c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8),
6920c64779e2SAndrii Nakryiko 			/* different byte size */
6921c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
69227999cf7dSIlya Leoshkevich 			/* all allowed sizes */
69237999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 2),
69247999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 4),
69257999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 8),
69267999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 12),
69277999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 16),
6928c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6929c64779e2SAndrii Nakryiko 		},
69307999cf7dSIlya Leoshkevich 		BTF_STR_SEC("\0int\0some other int\0float"),
6931c64779e2SAndrii Nakryiko 	},
6932c64779e2SAndrii Nakryiko 	.opts = {
6933c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
6934c64779e2SAndrii Nakryiko 	},
6935c64779e2SAndrii Nakryiko },
6936c64779e2SAndrii Nakryiko {
6937c64779e2SAndrii Nakryiko 	.descr = "dedup: enum fwd resolution",
6938c64779e2SAndrii Nakryiko 	.input = {
6939c64779e2SAndrii Nakryiko 		.raw_types = {
6940c64779e2SAndrii Nakryiko 			/* [1] fwd enum 'e1' before full enum */
6941c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4),
6942c64779e2SAndrii Nakryiko 			/* [2] full enum 'e1' after fwd */
6943c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6944c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(2), 123),
6945c64779e2SAndrii Nakryiko 			/* [3] full enum 'e2' before fwd */
6946c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6947c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(4), 456),
6948c64779e2SAndrii Nakryiko 			/* [4] fwd enum 'e2' after full enum */
6949c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4),
6950c64779e2SAndrii Nakryiko 			/* [5] incompatible fwd enum with different size */
6951c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1),
6952c64779e2SAndrii Nakryiko 			/* [6] incompatible full enum with different value */
6953c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6954c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(2), 321),
6955c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6956c64779e2SAndrii Nakryiko 		},
6957c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
6958c64779e2SAndrii Nakryiko 	},
6959c64779e2SAndrii Nakryiko 	.expect = {
6960c64779e2SAndrii Nakryiko 		.raw_types = {
6961c64779e2SAndrii Nakryiko 			/* [1] full enum 'e1' */
6962c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6963c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(2), 123),
6964c64779e2SAndrii Nakryiko 			/* [2] full enum 'e2' */
6965c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6966c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(4), 456),
6967c64779e2SAndrii Nakryiko 			/* [3] incompatible fwd enum with different size */
6968c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1),
6969c64779e2SAndrii Nakryiko 			/* [4] incompatible full enum with different value */
6970c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
6971c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(2), 321),
6972c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6973c64779e2SAndrii Nakryiko 		},
6974c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
6975c64779e2SAndrii Nakryiko 	},
6976c64779e2SAndrii Nakryiko 	.opts = {
6977c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
6978c64779e2SAndrii Nakryiko 	},
6979c64779e2SAndrii Nakryiko },
6980c64779e2SAndrii Nakryiko {
6981c64779e2SAndrii Nakryiko 	.descr = "dedup: datasec and vars pass-through",
6982c64779e2SAndrii Nakryiko 	.input = {
6983c64779e2SAndrii Nakryiko 		.raw_types = {
6984c64779e2SAndrii Nakryiko 			/* int */
6985c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6986c64779e2SAndrii Nakryiko 			/* static int t */
6987c64779e2SAndrii Nakryiko 			BTF_VAR_ENC(NAME_NTH(2), 1, 0),			/* [2] */
6988c64779e2SAndrii Nakryiko 			/* .bss section */				/* [3] */
6989c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
6990c64779e2SAndrii Nakryiko 			BTF_VAR_SECINFO_ENC(2, 0, 4),
6991c64779e2SAndrii Nakryiko 			/* int, referenced from [5] */
6992c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [4] */
6993c64779e2SAndrii Nakryiko 			/* another static int t */
6994c64779e2SAndrii Nakryiko 			BTF_VAR_ENC(NAME_NTH(2), 4, 0),			/* [5] */
6995c64779e2SAndrii Nakryiko 			/* another .bss section */			/* [6] */
6996c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
6997c64779e2SAndrii Nakryiko 			BTF_VAR_SECINFO_ENC(5, 0, 4),
6998c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6999c64779e2SAndrii Nakryiko 		},
7000c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0.bss\0t"),
7001c64779e2SAndrii Nakryiko 	},
7002c64779e2SAndrii Nakryiko 	.expect = {
7003c64779e2SAndrii Nakryiko 		.raw_types = {
7004c64779e2SAndrii Nakryiko 			/* int */
7005c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7006c64779e2SAndrii Nakryiko 			/* static int t */
7007c64779e2SAndrii Nakryiko 			BTF_VAR_ENC(NAME_NTH(2), 1, 0),			/* [2] */
7008c64779e2SAndrii Nakryiko 			/* .bss section */				/* [3] */
7009c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
7010c64779e2SAndrii Nakryiko 			BTF_VAR_SECINFO_ENC(2, 0, 4),
7011c64779e2SAndrii Nakryiko 			/* another static int t */
7012c64779e2SAndrii Nakryiko 			BTF_VAR_ENC(NAME_NTH(2), 1, 0),			/* [4] */
7013c64779e2SAndrii Nakryiko 			/* another .bss section */			/* [5] */
7014c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
7015c64779e2SAndrii Nakryiko 			BTF_VAR_SECINFO_ENC(4, 0, 4),
7016c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7017c64779e2SAndrii Nakryiko 		},
7018c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0.bss\0t"),
7019c64779e2SAndrii Nakryiko 	},
7020c64779e2SAndrii Nakryiko 	.opts = {
7021c64779e2SAndrii Nakryiko 		.dont_resolve_fwds = false,
7022c64779e2SAndrii Nakryiko 		.dedup_table_size = 1
7023c64779e2SAndrii Nakryiko 	},
7024c64779e2SAndrii Nakryiko },
7025ad526474SYonghong Song {
7026ad526474SYonghong Song 	.descr = "dedup: func/func_arg/var tags",
7027ad526474SYonghong Song 	.input = {
7028ad526474SYonghong Song 		.raw_types = {
7029ad526474SYonghong Song 			/* int */
7030ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7031ad526474SYonghong Song 			/* static int t */
7032ad526474SYonghong Song 			BTF_VAR_ENC(NAME_NTH(1), 1, 0),			/* [2] */
7033ad526474SYonghong Song 			/* void f(int a1, int a2) */
7034ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
7035ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7036ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1),
7037ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(4), 2),			/* [4] */
7038ad526474SYonghong Song 			/* tag -> t */
7039223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */
7040223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [6] */
7041ad526474SYonghong Song 			/* tag -> func */
7042223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [7] */
7043223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [8] */
7044ad526474SYonghong Song 			/* tag -> func arg a1 */
7045223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [9] */
7046223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [10] */
7047ad526474SYonghong Song 			BTF_END_RAW,
7048ad526474SYonghong Song 		},
7049ad526474SYonghong Song 		BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"),
7050ad526474SYonghong Song 	},
7051ad526474SYonghong Song 	.expect = {
7052ad526474SYonghong Song 		.raw_types = {
7053ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7054ad526474SYonghong Song 			BTF_VAR_ENC(NAME_NTH(1), 1, 0),			/* [2] */
7055ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
7056ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7057ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1),
7058ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(4), 2),			/* [4] */
7059223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */
7060223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [6] */
7061223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [7] */
7062ad526474SYonghong Song 			BTF_END_RAW,
7063ad526474SYonghong Song 		},
7064ad526474SYonghong Song 		BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"),
7065ad526474SYonghong Song 	},
7066ad526474SYonghong Song 	.opts = {
7067ad526474SYonghong Song 		.dont_resolve_fwds = false,
7068ad526474SYonghong Song 	},
7069ad526474SYonghong Song },
7070ad526474SYonghong Song {
7071ad526474SYonghong Song 	.descr = "dedup: func/func_param tags",
7072ad526474SYonghong Song 	.input = {
7073ad526474SYonghong Song 		.raw_types = {
7074ad526474SYonghong Song 			/* int */
7075ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7076ad526474SYonghong Song 			/* void f(int a1, int a2) */
7077ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
7078ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1),
7079ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7080ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(3), 2),			/* [3] */
7081ad526474SYonghong Song 			/* void f(int a1, int a2) */
7082ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [4] */
7083ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1),
7084ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7085ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(3), 4),			/* [5] */
7086ad526474SYonghong Song 			/* tag -> f: tag1, tag2 */
7087223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [6] */
7088223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1),		/* [7] */
7089ad526474SYonghong Song 			/* tag -> f/a2: tag1, tag2 */
7090223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [8] */
7091223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1),		/* [9] */
7092ad526474SYonghong Song 			/* tag -> f: tag1, tag3 */
7093223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 5, -1),		/* [10] */
7094223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 5, -1),		/* [11] */
7095ad526474SYonghong Song 			/* tag -> f/a2: tag1, tag3 */
7096223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 5, 1),		/* [12] */
7097223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 5, 1),		/* [13] */
7098ad526474SYonghong Song 			BTF_END_RAW,
7099ad526474SYonghong Song 		},
7100ad526474SYonghong Song 		BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"),
7101ad526474SYonghong Song 	},
7102ad526474SYonghong Song 	.expect = {
7103ad526474SYonghong Song 		.raw_types = {
7104ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7105ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
7106ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1),
7107ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7108ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(3), 2),			/* [3] */
7109223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [4] */
7110223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1),		/* [5] */
7111223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1),		/* [6] */
7112223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [7] */
7113223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1),		/* [8] */
7114223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1),		/* [9] */
7115ad526474SYonghong Song 			BTF_END_RAW,
7116ad526474SYonghong Song 		},
7117ad526474SYonghong Song 		BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"),
7118ad526474SYonghong Song 	},
7119ad526474SYonghong Song 	.opts = {
7120ad526474SYonghong Song 		.dont_resolve_fwds = false,
7121ad526474SYonghong Song 	},
7122ad526474SYonghong Song },
7123ad526474SYonghong Song {
7124ad526474SYonghong Song 	.descr = "dedup: struct/struct_member tags",
7125ad526474SYonghong Song 	.input = {
7126ad526474SYonghong Song 		.raw_types = {
7127ad526474SYonghong Song 			/* int */
7128ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7129ad526474SYonghong Song 			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),		/* [2] */
7130ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(2), 1, 0),
7131ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(3), 1, 32),
7132ad526474SYonghong Song 			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),		/* [3] */
7133ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(2), 1, 0),
7134ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(3), 1, 32),
7135ad526474SYonghong Song 			/* tag -> t: tag1, tag2 */
7136223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1),		/* [4] */
7137223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */
7138ad526474SYonghong Song 			/* tag -> t/m2: tag1, tag2 */
7139223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1),		/* [6] */
7140223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1),		/* [7] */
7141ad526474SYonghong Song 			/* tag -> t: tag1, tag3 */
7142223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [8] */
7143223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1),		/* [9] */
7144ad526474SYonghong Song 			/* tag -> t/m2: tag1, tag3 */
7145223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [10] */
7146223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1),		/* [11] */
7147ad526474SYonghong Song 			BTF_END_RAW,
7148ad526474SYonghong Song 		},
7149ad526474SYonghong Song 		BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"),
7150ad526474SYonghong Song 	},
7151ad526474SYonghong Song 	.expect = {
7152ad526474SYonghong Song 		.raw_types = {
7153ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7154ad526474SYonghong Song 			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),		/* [2] */
7155ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(2), 1, 0),
7156ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(3), 1, 32),
7157223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1),		/* [3] */
7158223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [4] */
7159223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 2, -1),		/* [5] */
7160223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1),		/* [6] */
7161223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1),		/* [7] */
7162223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 2, 1),		/* [8] */
7163ad526474SYonghong Song 			BTF_END_RAW,
7164ad526474SYonghong Song 		},
7165ad526474SYonghong Song 		BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"),
7166ad526474SYonghong Song 	},
7167ad526474SYonghong Song 	.opts = {
7168ad526474SYonghong Song 		.dont_resolve_fwds = false,
7169ad526474SYonghong Song 	},
7170ad526474SYonghong Song },
7171c64779e2SAndrii Nakryiko 
7172c64779e2SAndrii Nakryiko };
7173c64779e2SAndrii Nakryiko 
7174c64779e2SAndrii Nakryiko static int btf_type_size(const struct btf_type *t)
7175c64779e2SAndrii Nakryiko {
7176c64779e2SAndrii Nakryiko 	int base_size = sizeof(struct btf_type);
7177c64779e2SAndrii Nakryiko 	__u16 vlen = BTF_INFO_VLEN(t->info);
7178c64779e2SAndrii Nakryiko 	__u16 kind = BTF_INFO_KIND(t->info);
7179c64779e2SAndrii Nakryiko 
7180c64779e2SAndrii Nakryiko 	switch (kind) {
7181c64779e2SAndrii Nakryiko 	case BTF_KIND_FWD:
7182c64779e2SAndrii Nakryiko 	case BTF_KIND_CONST:
7183c64779e2SAndrii Nakryiko 	case BTF_KIND_VOLATILE:
7184c64779e2SAndrii Nakryiko 	case BTF_KIND_RESTRICT:
7185c64779e2SAndrii Nakryiko 	case BTF_KIND_PTR:
7186c64779e2SAndrii Nakryiko 	case BTF_KIND_TYPEDEF:
7187c64779e2SAndrii Nakryiko 	case BTF_KIND_FUNC:
71887e72aad3SIlya Leoshkevich 	case BTF_KIND_FLOAT:
7189c64779e2SAndrii Nakryiko 		return base_size;
7190c64779e2SAndrii Nakryiko 	case BTF_KIND_INT:
7191c64779e2SAndrii Nakryiko 		return base_size + sizeof(__u32);
7192c64779e2SAndrii Nakryiko 	case BTF_KIND_ENUM:
7193c64779e2SAndrii Nakryiko 		return base_size + vlen * sizeof(struct btf_enum);
7194c64779e2SAndrii Nakryiko 	case BTF_KIND_ARRAY:
7195c64779e2SAndrii Nakryiko 		return base_size + sizeof(struct btf_array);
7196c64779e2SAndrii Nakryiko 	case BTF_KIND_STRUCT:
7197c64779e2SAndrii Nakryiko 	case BTF_KIND_UNION:
7198c64779e2SAndrii Nakryiko 		return base_size + vlen * sizeof(struct btf_member);
7199c64779e2SAndrii Nakryiko 	case BTF_KIND_FUNC_PROTO:
7200c64779e2SAndrii Nakryiko 		return base_size + vlen * sizeof(struct btf_param);
7201c64779e2SAndrii Nakryiko 	case BTF_KIND_VAR:
7202c64779e2SAndrii Nakryiko 		return base_size + sizeof(struct btf_var);
7203c64779e2SAndrii Nakryiko 	case BTF_KIND_DATASEC:
7204c64779e2SAndrii Nakryiko 		return base_size + vlen * sizeof(struct btf_var_secinfo);
7205223f903eSYonghong Song 	case BTF_KIND_DECL_TAG:
7206223f903eSYonghong Song 		return base_size + sizeof(struct btf_decl_tag);
7207c64779e2SAndrii Nakryiko 	default:
7208c64779e2SAndrii Nakryiko 		fprintf(stderr, "Unsupported BTF_KIND:%u\n", kind);
7209c64779e2SAndrii Nakryiko 		return -EINVAL;
7210c64779e2SAndrii Nakryiko 	}
7211c64779e2SAndrii Nakryiko }
7212c64779e2SAndrii Nakryiko 
7213c64779e2SAndrii Nakryiko static void dump_btf_strings(const char *strs, __u32 len)
7214c64779e2SAndrii Nakryiko {
7215c64779e2SAndrii Nakryiko 	const char *cur = strs;
7216c64779e2SAndrii Nakryiko 	int i = 0;
7217c64779e2SAndrii Nakryiko 
7218c64779e2SAndrii Nakryiko 	while (cur < strs + len) {
7219c64779e2SAndrii Nakryiko 		fprintf(stderr, "string #%d: '%s'\n", i, cur);
7220c64779e2SAndrii Nakryiko 		cur += strlen(cur) + 1;
7221c64779e2SAndrii Nakryiko 		i++;
7222c64779e2SAndrii Nakryiko 	}
7223c64779e2SAndrii Nakryiko }
7224c64779e2SAndrii Nakryiko 
7225c64779e2SAndrii Nakryiko static void do_test_dedup(unsigned int test_num)
7226c64779e2SAndrii Nakryiko {
7227c64779e2SAndrii Nakryiko 	const struct btf_dedup_test *test = &dedup_tests[test_num - 1];
7228c64779e2SAndrii Nakryiko 	__u32 test_nr_types, expect_nr_types, test_btf_size, expect_btf_size;
7229c64779e2SAndrii Nakryiko 	const struct btf_header *test_hdr, *expect_hdr;
7230c64779e2SAndrii Nakryiko 	struct btf *test_btf = NULL, *expect_btf = NULL;
7231c64779e2SAndrii Nakryiko 	const void *test_btf_data, *expect_btf_data;
7232c64779e2SAndrii Nakryiko 	const char *ret_test_next_str, *ret_expect_next_str;
7233c64779e2SAndrii Nakryiko 	const char *test_strs, *expect_strs;
7234d9448f94SAndrii Nakryiko 	const char *test_str_cur;
7235c64779e2SAndrii Nakryiko 	const char *expect_str_cur, *expect_str_end;
7236c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
7237c64779e2SAndrii Nakryiko 	void *raw_btf;
7238c64779e2SAndrii Nakryiko 	int err = 0, i;
7239c64779e2SAndrii Nakryiko 
7240c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
7241c64779e2SAndrii Nakryiko 		return;
7242c64779e2SAndrii Nakryiko 
7243c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl, test->input.raw_types,
7244c64779e2SAndrii Nakryiko 				 test->input.str_sec, test->input.str_sec_size,
7245c64779e2SAndrii Nakryiko 				 &raw_btf_size, &ret_test_next_str);
7246c64779e2SAndrii Nakryiko 	if (!raw_btf)
7247c64779e2SAndrii Nakryiko 		return;
7248c64779e2SAndrii Nakryiko 
7249c64779e2SAndrii Nakryiko 	test_btf = btf__new((__u8 *)raw_btf, raw_btf_size);
7250bad2e478SAndrii Nakryiko 	err = libbpf_get_error(test_btf);
7251c64779e2SAndrii Nakryiko 	free(raw_btf);
7252bad2e478SAndrii Nakryiko 	if (CHECK(err, "invalid test_btf errno:%d", err)) {
7253c64779e2SAndrii Nakryiko 		err = -1;
7254c64779e2SAndrii Nakryiko 		goto done;
7255c64779e2SAndrii Nakryiko 	}
7256c64779e2SAndrii Nakryiko 
7257c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl, test->expect.raw_types,
7258c64779e2SAndrii Nakryiko 				 test->expect.str_sec,
7259c64779e2SAndrii Nakryiko 				 test->expect.str_sec_size,
7260c64779e2SAndrii Nakryiko 				 &raw_btf_size, &ret_expect_next_str);
7261c64779e2SAndrii Nakryiko 	if (!raw_btf)
7262c64779e2SAndrii Nakryiko 		return;
7263c64779e2SAndrii Nakryiko 	expect_btf = btf__new((__u8 *)raw_btf, raw_btf_size);
7264bad2e478SAndrii Nakryiko 	err = libbpf_get_error(expect_btf);
7265c64779e2SAndrii Nakryiko 	free(raw_btf);
7266bad2e478SAndrii Nakryiko 	if (CHECK(err, "invalid expect_btf errno:%d", err)) {
7267c64779e2SAndrii Nakryiko 		err = -1;
7268c64779e2SAndrii Nakryiko 		goto done;
7269c64779e2SAndrii Nakryiko 	}
7270c64779e2SAndrii Nakryiko 
7271c64779e2SAndrii Nakryiko 	err = btf__dedup(test_btf, NULL, &test->opts);
7272c64779e2SAndrii Nakryiko 	if (CHECK(err, "btf_dedup failed errno:%d", err)) {
7273c64779e2SAndrii Nakryiko 		err = -1;
7274c64779e2SAndrii Nakryiko 		goto done;
7275c64779e2SAndrii Nakryiko 	}
7276c64779e2SAndrii Nakryiko 
7277*487ef148SHengqi Chen 	test_btf_data = btf__raw_data(test_btf, &test_btf_size);
7278*487ef148SHengqi Chen 	expect_btf_data = btf__raw_data(expect_btf, &expect_btf_size);
7279c64779e2SAndrii Nakryiko 	if (CHECK(test_btf_size != expect_btf_size,
7280c64779e2SAndrii Nakryiko 		  "test_btf_size:%u != expect_btf_size:%u",
7281c64779e2SAndrii Nakryiko 		  test_btf_size, expect_btf_size)) {
7282c64779e2SAndrii Nakryiko 		err = -1;
7283c64779e2SAndrii Nakryiko 		goto done;
7284c64779e2SAndrii Nakryiko 	}
7285c64779e2SAndrii Nakryiko 
7286c64779e2SAndrii Nakryiko 	test_hdr = test_btf_data;
7287c64779e2SAndrii Nakryiko 	test_strs = test_btf_data + sizeof(*test_hdr) + test_hdr->str_off;
7288c64779e2SAndrii Nakryiko 	expect_hdr = expect_btf_data;
7289c64779e2SAndrii Nakryiko 	expect_strs = expect_btf_data + sizeof(*test_hdr) + expect_hdr->str_off;
7290c64779e2SAndrii Nakryiko 	if (CHECK(test_hdr->str_len != expect_hdr->str_len,
7291c64779e2SAndrii Nakryiko 		  "test_hdr->str_len:%u != expect_hdr->str_len:%u",
7292c64779e2SAndrii Nakryiko 		  test_hdr->str_len, expect_hdr->str_len)) {
7293c64779e2SAndrii Nakryiko 		fprintf(stderr, "\ntest strings:\n");
7294c64779e2SAndrii Nakryiko 		dump_btf_strings(test_strs, test_hdr->str_len);
7295c64779e2SAndrii Nakryiko 		fprintf(stderr, "\nexpected strings:\n");
7296c64779e2SAndrii Nakryiko 		dump_btf_strings(expect_strs, expect_hdr->str_len);
7297c64779e2SAndrii Nakryiko 		err = -1;
7298c64779e2SAndrii Nakryiko 		goto done;
7299c64779e2SAndrii Nakryiko 	}
7300c64779e2SAndrii Nakryiko 
7301c64779e2SAndrii Nakryiko 	expect_str_cur = expect_strs;
7302c64779e2SAndrii Nakryiko 	expect_str_end = expect_strs + expect_hdr->str_len;
7303d9448f94SAndrii Nakryiko 	while (expect_str_cur < expect_str_end) {
7304c64779e2SAndrii Nakryiko 		size_t test_len, expect_len;
7305d9448f94SAndrii Nakryiko 		int off;
7306d9448f94SAndrii Nakryiko 
7307d9448f94SAndrii Nakryiko 		off = btf__find_str(test_btf, expect_str_cur);
7308d9448f94SAndrii Nakryiko 		if (CHECK(off < 0, "exp str '%s' not found: %d\n", expect_str_cur, off)) {
7309d9448f94SAndrii Nakryiko 			err = -1;
7310d9448f94SAndrii Nakryiko 			goto done;
7311d9448f94SAndrii Nakryiko 		}
7312d9448f94SAndrii Nakryiko 		test_str_cur = btf__str_by_offset(test_btf, off);
7313c64779e2SAndrii Nakryiko 
7314c64779e2SAndrii Nakryiko 		test_len = strlen(test_str_cur);
7315c64779e2SAndrii Nakryiko 		expect_len = strlen(expect_str_cur);
7316c64779e2SAndrii Nakryiko 		if (CHECK(test_len != expect_len,
7317c64779e2SAndrii Nakryiko 			  "test_len:%zu != expect_len:%zu "
7318c64779e2SAndrii Nakryiko 			  "(test_str:%s, expect_str:%s)",
7319c64779e2SAndrii Nakryiko 			  test_len, expect_len, test_str_cur, expect_str_cur)) {
7320c64779e2SAndrii Nakryiko 			err = -1;
7321c64779e2SAndrii Nakryiko 			goto done;
7322c64779e2SAndrii Nakryiko 		}
7323c64779e2SAndrii Nakryiko 		if (CHECK(strcmp(test_str_cur, expect_str_cur),
7324c64779e2SAndrii Nakryiko 			  "test_str:%s != expect_str:%s",
7325c64779e2SAndrii Nakryiko 			  test_str_cur, expect_str_cur)) {
7326c64779e2SAndrii Nakryiko 			err = -1;
7327c64779e2SAndrii Nakryiko 			goto done;
7328c64779e2SAndrii Nakryiko 		}
7329c64779e2SAndrii Nakryiko 		expect_str_cur += expect_len + 1;
7330c64779e2SAndrii Nakryiko 	}
7331c64779e2SAndrii Nakryiko 
7332*487ef148SHengqi Chen 	test_nr_types = btf__type_cnt(test_btf);
7333*487ef148SHengqi Chen 	expect_nr_types = btf__type_cnt(expect_btf);
7334c64779e2SAndrii Nakryiko 	if (CHECK(test_nr_types != expect_nr_types,
7335c64779e2SAndrii Nakryiko 		  "test_nr_types:%u != expect_nr_types:%u",
7336c64779e2SAndrii Nakryiko 		  test_nr_types, expect_nr_types)) {
7337c64779e2SAndrii Nakryiko 		err = -1;
7338c64779e2SAndrii Nakryiko 		goto done;
7339c64779e2SAndrii Nakryiko 	}
7340c64779e2SAndrii Nakryiko 
7341*487ef148SHengqi Chen 	for (i = 1; i < test_nr_types; i++) {
7342c64779e2SAndrii Nakryiko 		const struct btf_type *test_type, *expect_type;
7343c64779e2SAndrii Nakryiko 		int test_size, expect_size;
7344c64779e2SAndrii Nakryiko 
7345c64779e2SAndrii Nakryiko 		test_type = btf__type_by_id(test_btf, i);
7346c64779e2SAndrii Nakryiko 		expect_type = btf__type_by_id(expect_btf, i);
7347c64779e2SAndrii Nakryiko 		test_size = btf_type_size(test_type);
7348c64779e2SAndrii Nakryiko 		expect_size = btf_type_size(expect_type);
7349c64779e2SAndrii Nakryiko 
7350c64779e2SAndrii Nakryiko 		if (CHECK(test_size != expect_size,
7351c64779e2SAndrii Nakryiko 			  "type #%d: test_size:%d != expect_size:%u",
7352c64779e2SAndrii Nakryiko 			  i, test_size, expect_size)) {
7353c64779e2SAndrii Nakryiko 			err = -1;
7354c64779e2SAndrii Nakryiko 			goto done;
7355c64779e2SAndrii Nakryiko 		}
7356d9448f94SAndrii Nakryiko 		if (CHECK(btf_kind(test_type) != btf_kind(expect_type),
7357d9448f94SAndrii Nakryiko 			  "type %d kind: exp %d != got %u\n",
7358d9448f94SAndrii Nakryiko 			  i, btf_kind(expect_type), btf_kind(test_type))) {
7359d9448f94SAndrii Nakryiko 			err = -1;
7360d9448f94SAndrii Nakryiko 			goto done;
7361d9448f94SAndrii Nakryiko 		}
7362d9448f94SAndrii Nakryiko 		if (CHECK(test_type->info != expect_type->info,
7363d9448f94SAndrii Nakryiko 			  "type %d info: exp %d != got %u\n",
7364d9448f94SAndrii Nakryiko 			  i, expect_type->info, test_type->info)) {
7365d9448f94SAndrii Nakryiko 			err = -1;
7366d9448f94SAndrii Nakryiko 			goto done;
7367d9448f94SAndrii Nakryiko 		}
7368d9448f94SAndrii Nakryiko 		if (CHECK(test_type->size != expect_type->size,
7369d9448f94SAndrii Nakryiko 			  "type %d size/type: exp %d != got %u\n",
7370d9448f94SAndrii Nakryiko 			  i, expect_type->size, test_type->size)) {
7371c64779e2SAndrii Nakryiko 			err = -1;
7372c64779e2SAndrii Nakryiko 			goto done;
7373c64779e2SAndrii Nakryiko 		}
7374c64779e2SAndrii Nakryiko 	}
7375c64779e2SAndrii Nakryiko 
7376c64779e2SAndrii Nakryiko done:
7377c64779e2SAndrii Nakryiko 	btf__free(test_btf);
7378c64779e2SAndrii Nakryiko 	btf__free(expect_btf);
7379c64779e2SAndrii Nakryiko }
7380c64779e2SAndrii Nakryiko 
7381c64779e2SAndrii Nakryiko void test_btf(void)
7382c64779e2SAndrii Nakryiko {
7383c64779e2SAndrii Nakryiko 	int i;
7384c64779e2SAndrii Nakryiko 
7385c64779e2SAndrii Nakryiko 	always_log = env.verbosity > VERBOSE_NONE;
7386c64779e2SAndrii Nakryiko 
7387c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(raw_tests); i++)
7388c64779e2SAndrii Nakryiko 		do_test_raw(i);
7389c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(get_info_tests); i++)
7390c64779e2SAndrii Nakryiko 		do_test_get_info(i);
7391c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(file_tests); i++)
7392c64779e2SAndrii Nakryiko 		do_test_file(i);
7393c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(info_raw_tests); i++)
7394c64779e2SAndrii Nakryiko 		do_test_info_raw(i);
7395c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(dedup_tests); i++)
7396c64779e2SAndrii Nakryiko 		do_test_dedup(i);
7397c64779e2SAndrii Nakryiko 	test_pprint();
7398c64779e2SAndrii Nakryiko }
7399