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