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 },
882dfdd608cSLorenz Bauer {
883dfdd608cSLorenz Bauer 	.descr = "var after datasec, ptr followed by modifier",
884dfdd608cSLorenz Bauer 	.raw_types = {
885dfdd608cSLorenz Bauer 		/* .bss section */				/* [1] */
886dfdd608cSLorenz Bauer 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 2),
887dfdd608cSLorenz Bauer 			sizeof(void*)+4),
888dfdd608cSLorenz Bauer 		BTF_VAR_SECINFO_ENC(4, 0, sizeof(void*)),
889dfdd608cSLorenz Bauer 		BTF_VAR_SECINFO_ENC(6, sizeof(void*), 4),
890dfdd608cSLorenz Bauer 		/* int */					/* [2] */
891dfdd608cSLorenz Bauer 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
892dfdd608cSLorenz Bauer 		/* int* */					/* [3] */
893dfdd608cSLorenz Bauer 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),
894dfdd608cSLorenz Bauer 		BTF_VAR_ENC(NAME_TBD, 3, 0),			/* [4] */
895dfdd608cSLorenz Bauer 		/* const int */					/* [5] */
896dfdd608cSLorenz Bauer 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2),
897dfdd608cSLorenz Bauer 		BTF_VAR_ENC(NAME_TBD, 5, 0),			/* [6] */
898dfdd608cSLorenz Bauer 		BTF_END_RAW,
899dfdd608cSLorenz Bauer 	},
900dfdd608cSLorenz Bauer 	.str_sec = "\0a\0b\0c\0",
901dfdd608cSLorenz Bauer 	.str_sec_size = sizeof("\0a\0b\0c\0"),
902dfdd608cSLorenz Bauer 	.map_type = BPF_MAP_TYPE_ARRAY,
903dfdd608cSLorenz Bauer 	.map_name = ".bss",
904dfdd608cSLorenz Bauer 	.key_size = sizeof(int),
905dfdd608cSLorenz Bauer 	.value_size = sizeof(void*)+4,
906dfdd608cSLorenz Bauer 	.key_type_id = 0,
907dfdd608cSLorenz Bauer 	.value_type_id = 1,
908dfdd608cSLorenz Bauer 	.max_entries = 1,
909dfdd608cSLorenz Bauer },
910c64779e2SAndrii Nakryiko /* Test member exceeds the size of struct.
911c64779e2SAndrii Nakryiko  *
912c64779e2SAndrii Nakryiko  * struct A {
913c64779e2SAndrii Nakryiko  *     int m;
914c64779e2SAndrii Nakryiko  *     int n;
915c64779e2SAndrii Nakryiko  * };
916c64779e2SAndrii Nakryiko  */
917c64779e2SAndrii Nakryiko {
918c64779e2SAndrii Nakryiko 	.descr = "size check test #1",
919c64779e2SAndrii Nakryiko 	.raw_types = {
920c64779e2SAndrii Nakryiko 		/* int */					/* [1] */
921c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
922c64779e2SAndrii Nakryiko 		/* struct A { */				/* [2] */
923c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2 -  1),
924c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
925c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),/* int n; */
926c64779e2SAndrii Nakryiko 		/* } */
927c64779e2SAndrii Nakryiko 		BTF_END_RAW,
928c64779e2SAndrii Nakryiko 	},
929c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n",
930c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n"),
931c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
932c64779e2SAndrii Nakryiko 	.map_name = "size_check1_map",
933c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
934c64779e2SAndrii Nakryiko 	.value_size = 1,
935c64779e2SAndrii Nakryiko 	.key_type_id = 1,
936c64779e2SAndrii Nakryiko 	.value_type_id = 2,
937c64779e2SAndrii Nakryiko 	.max_entries = 4,
938c64779e2SAndrii Nakryiko 	.btf_load_err = true,
939c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
940c64779e2SAndrii Nakryiko },
941c64779e2SAndrii Nakryiko 
942443edcefSJunlin Yang /* Test member exceeds the size of struct
943c64779e2SAndrii Nakryiko  *
944c64779e2SAndrii Nakryiko  * struct A {
945c64779e2SAndrii Nakryiko  *     int m;
946c64779e2SAndrii Nakryiko  *     int n[2];
947c64779e2SAndrii Nakryiko  * };
948c64779e2SAndrii Nakryiko  */
949c64779e2SAndrii Nakryiko {
950c64779e2SAndrii Nakryiko 	.descr = "size check test #2",
951c64779e2SAndrii Nakryiko 	.raw_types = {
952c64779e2SAndrii Nakryiko 		/* int */					/* [1] */
953c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
954c64779e2SAndrii Nakryiko 		/* int[2] */					/* [2] */
955c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 2),
956c64779e2SAndrii Nakryiko 		/* struct A { */				/* [3] */
957c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 3 - 1),
958c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
959c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* int n[2]; */
960c64779e2SAndrii Nakryiko 		/* } */
961c64779e2SAndrii Nakryiko 		BTF_END_RAW,
962c64779e2SAndrii Nakryiko 	},
963c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n",
964c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n"),
965c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
966c64779e2SAndrii Nakryiko 	.map_name = "size_check2_map",
967c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
968c64779e2SAndrii Nakryiko 	.value_size = 1,
969c64779e2SAndrii Nakryiko 	.key_type_id = 1,
970c64779e2SAndrii Nakryiko 	.value_type_id = 3,
971c64779e2SAndrii Nakryiko 	.max_entries = 4,
972c64779e2SAndrii Nakryiko 	.btf_load_err = true,
973c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
974c64779e2SAndrii Nakryiko },
975c64779e2SAndrii Nakryiko 
976443edcefSJunlin Yang /* Test member exceeds the size of struct
977c64779e2SAndrii Nakryiko  *
978c64779e2SAndrii Nakryiko  * struct A {
979c64779e2SAndrii Nakryiko  *     int m;
980c64779e2SAndrii Nakryiko  *     void *n;
981c64779e2SAndrii Nakryiko  * };
982c64779e2SAndrii Nakryiko  */
983c64779e2SAndrii Nakryiko {
984c64779e2SAndrii Nakryiko 	.descr = "size check test #3",
985c64779e2SAndrii Nakryiko 	.raw_types = {
986c64779e2SAndrii Nakryiko 		/* int */					/* [1] */
987c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
988c64779e2SAndrii Nakryiko 		/* void* */					/* [2] */
989c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
990c64779e2SAndrii Nakryiko 		/* struct A { */				/* [3] */
991c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) + sizeof(void *) - 1),
992c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
993c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* void *n; */
994c64779e2SAndrii Nakryiko 		/* } */
995c64779e2SAndrii Nakryiko 		BTF_END_RAW,
996c64779e2SAndrii Nakryiko 	},
997c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0n",
998c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0n"),
999c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1000c64779e2SAndrii Nakryiko 	.map_name = "size_check3_map",
1001c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1002c64779e2SAndrii Nakryiko 	.value_size = 1,
1003c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1004c64779e2SAndrii Nakryiko 	.value_type_id = 3,
1005c64779e2SAndrii Nakryiko 	.max_entries = 4,
1006c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1007c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
1008c64779e2SAndrii Nakryiko },
1009c64779e2SAndrii Nakryiko 
1010c64779e2SAndrii Nakryiko /* Test member exceeds the size of struct
1011c64779e2SAndrii Nakryiko  *
1012c64779e2SAndrii Nakryiko  * enum E {
1013c64779e2SAndrii Nakryiko  *     E0,
1014c64779e2SAndrii Nakryiko  *     E1,
1015c64779e2SAndrii Nakryiko  * };
1016c64779e2SAndrii Nakryiko  *
1017c64779e2SAndrii Nakryiko  * struct A {
1018c64779e2SAndrii Nakryiko  *     int m;
1019c64779e2SAndrii Nakryiko  *     enum E n;
1020c64779e2SAndrii Nakryiko  * };
1021c64779e2SAndrii Nakryiko  */
1022c64779e2SAndrii Nakryiko {
1023c64779e2SAndrii Nakryiko 	.descr = "size check test #4",
1024c64779e2SAndrii Nakryiko 	.raw_types = {
1025c64779e2SAndrii Nakryiko 		/* int */			/* [1] */
1026c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
1027c64779e2SAndrii Nakryiko 		/* enum E { */			/* [2] */
1028c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), sizeof(int)),
1029c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
1030c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
1031c64779e2SAndrii Nakryiko 		/* } */
1032c64779e2SAndrii Nakryiko 		/* struct A { */		/* [3] */
1033c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), sizeof(int) * 2 - 1),
1034c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int m; */
1035c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* enum E n; */
1036c64779e2SAndrii Nakryiko 		/* } */
1037c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1038c64779e2SAndrii Nakryiko 	},
1039c64779e2SAndrii Nakryiko 	.str_sec = "\0E\0E0\0E1\0A\0m\0n",
1040c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"),
1041c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1042c64779e2SAndrii Nakryiko 	.map_name = "size_check4_map",
1043c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1044c64779e2SAndrii Nakryiko 	.value_size = 1,
1045c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1046c64779e2SAndrii Nakryiko 	.value_type_id = 3,
1047c64779e2SAndrii Nakryiko 	.max_entries = 4,
1048c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1049c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
1050c64779e2SAndrii Nakryiko },
1051c64779e2SAndrii Nakryiko 
1052c64779e2SAndrii Nakryiko /* Test member unexceeds the size of struct
1053c64779e2SAndrii Nakryiko  *
1054c64779e2SAndrii Nakryiko  * enum E {
1055c64779e2SAndrii Nakryiko  *     E0,
1056c64779e2SAndrii Nakryiko  *     E1,
1057c64779e2SAndrii Nakryiko  * };
1058c64779e2SAndrii Nakryiko  *
1059c64779e2SAndrii Nakryiko  * struct A {
1060c64779e2SAndrii Nakryiko  *     char m;
1061c64779e2SAndrii Nakryiko  *     enum E __attribute__((packed)) n;
1062c64779e2SAndrii Nakryiko  * };
1063c64779e2SAndrii Nakryiko  */
1064c64779e2SAndrii Nakryiko {
1065c64779e2SAndrii Nakryiko 	.descr = "size check test #5",
1066c64779e2SAndrii Nakryiko 	.raw_types = {
1067c64779e2SAndrii Nakryiko 		/* int */			/* [1] */
1068c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
1069c64779e2SAndrii Nakryiko 		/* char */			/* [2] */
1070c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),
1071c64779e2SAndrii Nakryiko 		/* enum E { */			/* [3] */
1072c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 1),
1073c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
1074c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
1075c64779e2SAndrii Nakryiko 		/* } */
1076c64779e2SAndrii Nakryiko 		/* struct A { */		/* [4] */
1077c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 2),
1078c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),	/* char m; */
1079c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 8),/* enum E __attribute__((packed)) n; */
1080c64779e2SAndrii Nakryiko 		/* } */
1081c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1082c64779e2SAndrii Nakryiko 	},
1083c64779e2SAndrii Nakryiko 	.str_sec = "\0E\0E0\0E1\0A\0m\0n",
1084c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"),
1085c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1086c64779e2SAndrii Nakryiko 	.map_name = "size_check5_map",
1087c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1088c64779e2SAndrii Nakryiko 	.value_size = 2,
1089c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1090c64779e2SAndrii Nakryiko 	.value_type_id = 4,
1091c64779e2SAndrii Nakryiko 	.max_entries = 4,
1092c64779e2SAndrii Nakryiko },
1093c64779e2SAndrii Nakryiko 
1094c64779e2SAndrii Nakryiko /* typedef const void * const_void_ptr;
1095c64779e2SAndrii Nakryiko  * struct A {
1096c64779e2SAndrii Nakryiko  *	const_void_ptr m;
1097c64779e2SAndrii Nakryiko  * };
1098c64779e2SAndrii Nakryiko  */
1099c64779e2SAndrii Nakryiko {
1100c64779e2SAndrii Nakryiko 	.descr = "void test #1",
1101c64779e2SAndrii Nakryiko 	.raw_types = {
1102c64779e2SAndrii Nakryiko 		/* int */		/* [1] */
1103c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1104c64779e2SAndrii Nakryiko 		/* const void */	/* [2] */
1105c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1106c64779e2SAndrii Nakryiko 		/* const void* */	/* [3] */
1107c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),
1108c64779e2SAndrii Nakryiko 		/* typedef const void * const_void_ptr */
1109c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),	/* [4] */
1110c64779e2SAndrii Nakryiko 		/* struct A { */	/* [5] */
1111c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1112c64779e2SAndrii Nakryiko 		/* const_void_ptr m; */
1113c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 0),
1114c64779e2SAndrii Nakryiko 		/* } */
1115c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1116c64779e2SAndrii Nakryiko 	},
1117c64779e2SAndrii Nakryiko 	.str_sec = "\0const_void_ptr\0A\0m",
1118c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0const_void_ptr\0A\0m"),
1119c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1120c64779e2SAndrii Nakryiko 	.map_name = "void_test1_map",
1121c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1122c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *),
1123c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1124c64779e2SAndrii Nakryiko 	.value_type_id = 4,
1125c64779e2SAndrii Nakryiko 	.max_entries = 4,
1126c64779e2SAndrii Nakryiko },
1127c64779e2SAndrii Nakryiko 
1128c64779e2SAndrii Nakryiko /* struct A {
1129c64779e2SAndrii Nakryiko  *     const void m;
1130c64779e2SAndrii Nakryiko  * };
1131c64779e2SAndrii Nakryiko  */
1132c64779e2SAndrii Nakryiko {
1133c64779e2SAndrii Nakryiko 	.descr = "void test #2",
1134c64779e2SAndrii Nakryiko 	.raw_types = {
1135c64779e2SAndrii Nakryiko 		/* int */		/* [1] */
1136c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1137c64779e2SAndrii Nakryiko 		/* const void */	/* [2] */
1138c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1139c64779e2SAndrii Nakryiko 		/* struct A { */	/* [3] */
1140c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 8),
1141c64779e2SAndrii Nakryiko 		/* const void m; */
1142c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
1143c64779e2SAndrii Nakryiko 		/* } */
1144c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1145c64779e2SAndrii Nakryiko 	},
1146c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m",
1147c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m"),
1148c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1149c64779e2SAndrii Nakryiko 	.map_name = "void_test2_map",
1150c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1151c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *),
1152c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1153c64779e2SAndrii Nakryiko 	.value_type_id = 3,
1154c64779e2SAndrii Nakryiko 	.max_entries = 4,
1155c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1156c64779e2SAndrii Nakryiko 	.err_str = "Invalid member",
1157c64779e2SAndrii Nakryiko },
1158c64779e2SAndrii Nakryiko 
1159c64779e2SAndrii Nakryiko /* typedef const void * const_void_ptr;
1160c64779e2SAndrii Nakryiko  * const_void_ptr[4]
1161c64779e2SAndrii Nakryiko  */
1162c64779e2SAndrii Nakryiko {
1163c64779e2SAndrii Nakryiko 	.descr = "void test #3",
1164c64779e2SAndrii Nakryiko 	.raw_types = {
1165c64779e2SAndrii Nakryiko 		/* int */		/* [1] */
1166c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1167c64779e2SAndrii Nakryiko 		/* const void */	/* [2] */
1168c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1169c64779e2SAndrii Nakryiko 		/* const void* */	/* [3] */
1170c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2),
1171c64779e2SAndrii Nakryiko 		/* typedef const void * const_void_ptr */
1172c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),	/* [4] */
1173c64779e2SAndrii Nakryiko 		/* const_void_ptr[4] */
1174c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(4, 1, 4),	/* [5] */
1175c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1176c64779e2SAndrii Nakryiko 	},
1177c64779e2SAndrii Nakryiko 	.str_sec = "\0const_void_ptr",
1178c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0const_void_ptr"),
1179c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1180c64779e2SAndrii Nakryiko 	.map_name = "void_test3_map",
1181c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1182c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *) * 4,
1183c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1184c64779e2SAndrii Nakryiko 	.value_type_id = 5,
1185c64779e2SAndrii Nakryiko 	.max_entries = 4,
1186c64779e2SAndrii Nakryiko },
1187c64779e2SAndrii Nakryiko 
1188c64779e2SAndrii Nakryiko /* const void[4]  */
1189c64779e2SAndrii Nakryiko {
1190c64779e2SAndrii Nakryiko 	.descr = "void test #4",
1191c64779e2SAndrii Nakryiko 	.raw_types = {
1192c64779e2SAndrii Nakryiko 		/* int */		/* [1] */
1193c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1194c64779e2SAndrii Nakryiko 		/* const void */	/* [2] */
1195c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1196c64779e2SAndrii Nakryiko 		/* const void[4] */	/* [3] */
1197c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 4),
1198c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1199c64779e2SAndrii Nakryiko 	},
1200c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m",
1201c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m"),
1202c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1203c64779e2SAndrii Nakryiko 	.map_name = "void_test4_map",
1204c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1205c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *) * 4,
1206c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1207c64779e2SAndrii Nakryiko 	.value_type_id = 3,
1208c64779e2SAndrii Nakryiko 	.max_entries = 4,
1209c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1210c64779e2SAndrii Nakryiko 	.err_str = "Invalid elem",
1211c64779e2SAndrii Nakryiko },
1212c64779e2SAndrii Nakryiko 
1213c64779e2SAndrii Nakryiko /* Array_A  <------------------+
1214c64779e2SAndrii Nakryiko  *     elem_type == Array_B    |
1215c64779e2SAndrii Nakryiko  *                    |        |
1216c64779e2SAndrii Nakryiko  *                    |        |
1217c64779e2SAndrii Nakryiko  * Array_B  <-------- +        |
1218c64779e2SAndrii Nakryiko  *      elem_type == Array A --+
1219c64779e2SAndrii Nakryiko  */
1220c64779e2SAndrii Nakryiko {
1221c64779e2SAndrii Nakryiko 	.descr = "loop test #1",
1222c64779e2SAndrii Nakryiko 	.raw_types = {
1223c64779e2SAndrii Nakryiko 		/* int */			/* [1] */
1224c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1225c64779e2SAndrii Nakryiko 		/* Array_A */			/* [2] */
1226c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 8),
1227c64779e2SAndrii Nakryiko 		/* Array_B */			/* [3] */
1228c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 8),
1229c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1230c64779e2SAndrii Nakryiko 	},
1231c64779e2SAndrii Nakryiko 	.str_sec = "",
1232c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1233c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1234c64779e2SAndrii Nakryiko 	.map_name = "loop_test1_map",
1235c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1236c64779e2SAndrii Nakryiko 	.value_size = sizeof(sizeof(int) * 8),
1237c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1238c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1239c64779e2SAndrii Nakryiko 	.max_entries = 4,
1240c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1241c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1242c64779e2SAndrii Nakryiko },
1243c64779e2SAndrii Nakryiko 
1244c64779e2SAndrii Nakryiko /* typedef is _before_ the BTF type of Array_A and Array_B
1245c64779e2SAndrii Nakryiko  *
1246c64779e2SAndrii Nakryiko  * typedef Array_B int_array;
1247c64779e2SAndrii Nakryiko  *
1248c64779e2SAndrii Nakryiko  * Array_A  <------------------+
1249c64779e2SAndrii Nakryiko  *     elem_type == int_array  |
1250c64779e2SAndrii Nakryiko  *                    |        |
1251c64779e2SAndrii Nakryiko  *                    |        |
1252c64779e2SAndrii Nakryiko  * Array_B  <-------- +        |
1253c64779e2SAndrii Nakryiko  *      elem_type == Array_A --+
1254c64779e2SAndrii Nakryiko  */
1255c64779e2SAndrii Nakryiko {
1256c64779e2SAndrii Nakryiko 	.descr = "loop test #2",
1257c64779e2SAndrii Nakryiko 	.raw_types = {
1258c64779e2SAndrii Nakryiko 		/* int */
1259c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1260c64779e2SAndrii Nakryiko 		/* typedef Array_B int_array */
1261c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(1, 4),				/* [2] */
1262c64779e2SAndrii Nakryiko 		/* Array_A */
1263c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 8),			/* [3] */
1264c64779e2SAndrii Nakryiko 		/* Array_B */
1265c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 8),			/* [4] */
1266c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1267c64779e2SAndrii Nakryiko 	},
1268c64779e2SAndrii Nakryiko 	.str_sec = "\0int_array\0",
1269c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int_array"),
1270c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1271c64779e2SAndrii Nakryiko 	.map_name = "loop_test2_map",
1272c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1273c64779e2SAndrii Nakryiko 	.value_size = sizeof(sizeof(int) * 8),
1274c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1275c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1276c64779e2SAndrii Nakryiko 	.max_entries = 4,
1277c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1278c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1279c64779e2SAndrii Nakryiko },
1280c64779e2SAndrii Nakryiko 
1281c64779e2SAndrii Nakryiko /* Array_A  <------------------+
1282c64779e2SAndrii Nakryiko  *     elem_type == Array_B    |
1283c64779e2SAndrii Nakryiko  *                    |        |
1284c64779e2SAndrii Nakryiko  *                    |        |
1285c64779e2SAndrii Nakryiko  * Array_B  <-------- +        |
1286c64779e2SAndrii Nakryiko  *      elem_type == Array_A --+
1287c64779e2SAndrii Nakryiko  */
1288c64779e2SAndrii Nakryiko {
1289c64779e2SAndrii Nakryiko 	.descr = "loop test #3",
1290c64779e2SAndrii Nakryiko 	.raw_types = {
1291c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1292c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1293c64779e2SAndrii Nakryiko 		/* Array_A */				/* [2] */
1294c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 8),
1295c64779e2SAndrii Nakryiko 		/* Array_B */				/* [3] */
1296c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 8),
1297c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1298c64779e2SAndrii Nakryiko 	},
1299c64779e2SAndrii Nakryiko 	.str_sec = "",
1300c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1301c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1302c64779e2SAndrii Nakryiko 	.map_name = "loop_test3_map",
1303c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1304c64779e2SAndrii Nakryiko 	.value_size = sizeof(sizeof(int) * 8),
1305c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1306c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1307c64779e2SAndrii Nakryiko 	.max_entries = 4,
1308c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1309c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1310c64779e2SAndrii Nakryiko },
1311c64779e2SAndrii Nakryiko 
1312c64779e2SAndrii Nakryiko /* typedef is _between_ the BTF type of Array_A and Array_B
1313c64779e2SAndrii Nakryiko  *
1314c64779e2SAndrii Nakryiko  * typedef Array_B int_array;
1315c64779e2SAndrii Nakryiko  *
1316c64779e2SAndrii Nakryiko  * Array_A  <------------------+
1317c64779e2SAndrii Nakryiko  *     elem_type == int_array  |
1318c64779e2SAndrii Nakryiko  *                    |        |
1319c64779e2SAndrii Nakryiko  *                    |        |
1320c64779e2SAndrii Nakryiko  * Array_B  <-------- +        |
1321c64779e2SAndrii Nakryiko  *      elem_type == Array_A --+
1322c64779e2SAndrii Nakryiko  */
1323c64779e2SAndrii Nakryiko {
1324c64779e2SAndrii Nakryiko 	.descr = "loop test #4",
1325c64779e2SAndrii Nakryiko 	.raw_types = {
1326c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1327c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1328c64779e2SAndrii Nakryiko 		/* Array_A */				/* [2] */
1329c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 8),
1330c64779e2SAndrii Nakryiko 		/* typedef Array_B int_array */		/* [3] */
1331c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),
1332c64779e2SAndrii Nakryiko 		/* Array_B */				/* [4] */
1333c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(2, 1, 8),
1334c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1335c64779e2SAndrii Nakryiko 	},
1336c64779e2SAndrii Nakryiko 	.str_sec = "\0int_array\0",
1337c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int_array"),
1338c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1339c64779e2SAndrii Nakryiko 	.map_name = "loop_test4_map",
1340c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1341c64779e2SAndrii Nakryiko 	.value_size = sizeof(sizeof(int) * 8),
1342c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1343c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1344c64779e2SAndrii Nakryiko 	.max_entries = 4,
1345c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1346c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1347c64779e2SAndrii Nakryiko },
1348c64779e2SAndrii Nakryiko 
1349c64779e2SAndrii Nakryiko /* typedef struct B Struct_B
1350c64779e2SAndrii Nakryiko  *
1351c64779e2SAndrii Nakryiko  * struct A {
1352c64779e2SAndrii Nakryiko  *     int x;
1353c64779e2SAndrii Nakryiko  *     Struct_B y;
1354c64779e2SAndrii Nakryiko  * };
1355c64779e2SAndrii Nakryiko  *
1356c64779e2SAndrii Nakryiko  * struct B {
1357c64779e2SAndrii Nakryiko  *     int x;
1358c64779e2SAndrii Nakryiko  *     struct A y;
1359c64779e2SAndrii Nakryiko  * };
1360c64779e2SAndrii Nakryiko  */
1361c64779e2SAndrii Nakryiko {
1362c64779e2SAndrii Nakryiko 	.descr = "loop test #5",
1363c64779e2SAndrii Nakryiko 	.raw_types = {
1364c64779e2SAndrii Nakryiko 		/* int */
1365c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1366c64779e2SAndrii Nakryiko 		/* struct A */					/* [2] */
1367c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1368c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int x;	*/
1369c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, 32),/* Struct_B y;	*/
1370c64779e2SAndrii Nakryiko 		/* typedef struct B Struct_B */
1371c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
1372c64779e2SAndrii Nakryiko 		/* struct B */					/* [4] */
1373c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1374c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int x;	*/
1375c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct A y;	*/
1376c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1377c64779e2SAndrii Nakryiko 	},
1378c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0x\0y\0Struct_B\0B\0x\0y",
1379c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0x\0y\0Struct_B\0B\0x\0y"),
1380c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1381c64779e2SAndrii Nakryiko 	.map_name = "loop_test5_map",
1382c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1383c64779e2SAndrii Nakryiko 	.value_size = 8,
1384c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1385c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1386c64779e2SAndrii Nakryiko 	.max_entries = 4,
1387c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1388c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1389c64779e2SAndrii Nakryiko },
1390c64779e2SAndrii Nakryiko 
1391c64779e2SAndrii Nakryiko /* struct A {
1392c64779e2SAndrii Nakryiko  *     int x;
1393c64779e2SAndrii Nakryiko  *     struct A array_a[4];
1394c64779e2SAndrii Nakryiko  * };
1395c64779e2SAndrii Nakryiko  */
1396c64779e2SAndrii Nakryiko {
1397c64779e2SAndrii Nakryiko 	.descr = "loop test #6",
1398c64779e2SAndrii Nakryiko 	.raw_types = {
1399c64779e2SAndrii Nakryiko 		/* int */
1400c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1401c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 4),			/* [2] */
1402c64779e2SAndrii Nakryiko 		/* struct A */					/* [3] */
1403c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8),
1404c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),	/* int x;		*/
1405c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 32),/* struct A array_a[4];	*/
1406c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1407c64779e2SAndrii Nakryiko 	},
1408c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0x\0y",
1409c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0x\0y"),
1410c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1411c64779e2SAndrii Nakryiko 	.map_name = "loop_test6_map",
1412c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1413c64779e2SAndrii Nakryiko 	.value_size = 8,
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 #7",
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, 3, 0),
1430c64779e2SAndrii Nakryiko 		/* CONST type_id=3	*/		/* [3] */
1431c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1432c64779e2SAndrii Nakryiko 		/* PTR type_id=2	*/		/* [4] */
1433c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 3),
1434c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1435c64779e2SAndrii Nakryiko 	},
1436c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m",
1437c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m"),
1438c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1439c64779e2SAndrii Nakryiko 	.map_name = "loop_test7_map",
1440c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1441c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *),
1442c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1443c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1444c64779e2SAndrii Nakryiko 	.max_entries = 4,
1445c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1446c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1447c64779e2SAndrii Nakryiko },
1448c64779e2SAndrii Nakryiko 
1449c64779e2SAndrii Nakryiko {
1450c64779e2SAndrii Nakryiko 	.descr = "loop test #8",
1451c64779e2SAndrii Nakryiko 	.raw_types = {
1452c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1453c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1454c64779e2SAndrii Nakryiko 		/* struct A { */			/* [2] */
1455c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1456c64779e2SAndrii Nakryiko 		/*     const void *m;	*/
1457c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, 0),
1458c64779e2SAndrii Nakryiko 		/* struct B { */			/* [3] */
1459c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), sizeof(void *)),
1460c64779e2SAndrii Nakryiko 		/*     const void *n;	*/
1461c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 0),
1462c64779e2SAndrii Nakryiko 		/* CONST type_id=5	*/		/* [4] */
1463c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 5),
1464c64779e2SAndrii Nakryiko 		/* PTR type_id=6	*/		/* [5] */
1465c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 6),
1466c64779e2SAndrii Nakryiko 		/* CONST type_id=7	*/		/* [6] */
1467c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 7),
1468c64779e2SAndrii Nakryiko 		/* PTR type_id=4	*/		/* [7] */
1469c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 4),
1470c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1471c64779e2SAndrii Nakryiko 	},
1472c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0m\0B\0n",
1473c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0m\0B\0n"),
1474c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1475c64779e2SAndrii Nakryiko 	.map_name = "loop_test8_map",
1476c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1477c64779e2SAndrii Nakryiko 	.value_size = sizeof(void *),
1478c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1479c64779e2SAndrii Nakryiko 	.value_type_id = 2,
1480c64779e2SAndrii Nakryiko 	.max_entries = 4,
1481c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1482c64779e2SAndrii Nakryiko 	.err_str = "Loop detected",
1483c64779e2SAndrii Nakryiko },
1484c64779e2SAndrii Nakryiko 
1485c64779e2SAndrii Nakryiko {
1486c64779e2SAndrii Nakryiko 	.descr = "string section does not end with null",
1487c64779e2SAndrii Nakryiko 	.raw_types = {
1488c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1489c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1490c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1491c64779e2SAndrii Nakryiko 	},
1492c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1493c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int") - 1,
1494c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1495c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1496c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1497c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1498c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1499c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1500c64779e2SAndrii Nakryiko 	.max_entries = 4,
1501c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1502c64779e2SAndrii Nakryiko 	.err_str = "Invalid string section",
1503c64779e2SAndrii Nakryiko },
1504c64779e2SAndrii Nakryiko 
1505c64779e2SAndrii Nakryiko {
1506c64779e2SAndrii Nakryiko 	.descr = "empty string section",
1507c64779e2SAndrii Nakryiko 	.raw_types = {
1508c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1509c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1510c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1511c64779e2SAndrii Nakryiko 	},
1512c64779e2SAndrii Nakryiko 	.str_sec = "",
1513c64779e2SAndrii Nakryiko 	.str_sec_size = 0,
1514c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1515c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1516c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1517c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1518c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1519c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1520c64779e2SAndrii Nakryiko 	.max_entries = 4,
1521c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1522c64779e2SAndrii Nakryiko 	.err_str = "Invalid string section",
1523c64779e2SAndrii Nakryiko },
1524c64779e2SAndrii Nakryiko 
1525c64779e2SAndrii Nakryiko {
1526c64779e2SAndrii Nakryiko 	.descr = "empty type section",
1527c64779e2SAndrii Nakryiko 	.raw_types = {
1528c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1529c64779e2SAndrii Nakryiko 	},
1530c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1531c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1532c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1533c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1534c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1535c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1536c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1537c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1538c64779e2SAndrii Nakryiko 	.max_entries = 4,
1539c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1540c64779e2SAndrii Nakryiko 	.err_str = "No type found",
1541c64779e2SAndrii Nakryiko },
1542c64779e2SAndrii Nakryiko 
1543c64779e2SAndrii Nakryiko {
1544c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Longer hdr_len",
1545c64779e2SAndrii Nakryiko 	.raw_types = {
1546c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1547c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1548c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1549c64779e2SAndrii Nakryiko 	},
1550c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1551c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1552c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1553c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1554c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1555c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1556c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1557c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1558c64779e2SAndrii Nakryiko 	.max_entries = 4,
1559c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1560c64779e2SAndrii Nakryiko 	.hdr_len_delta = 4,
1561c64779e2SAndrii Nakryiko 	.err_str = "Unsupported btf_header",
1562c64779e2SAndrii Nakryiko },
1563c64779e2SAndrii Nakryiko 
1564c64779e2SAndrii Nakryiko {
1565c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Gap between hdr and type",
1566c64779e2SAndrii Nakryiko 	.raw_types = {
1567c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1568c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1569c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1570c64779e2SAndrii Nakryiko 	},
1571c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1572c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1573c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1574c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1575c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1576c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1577c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1578c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1579c64779e2SAndrii Nakryiko 	.max_entries = 4,
1580c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1581c64779e2SAndrii Nakryiko 	.type_off_delta = 4,
1582c64779e2SAndrii Nakryiko 	.err_str = "Unsupported section found",
1583c64779e2SAndrii Nakryiko },
1584c64779e2SAndrii Nakryiko 
1585c64779e2SAndrii Nakryiko {
1586c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Gap between type and str",
1587c64779e2SAndrii Nakryiko 	.raw_types = {
1588c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1589c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1590c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1591c64779e2SAndrii Nakryiko 	},
1592c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1593c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1594c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1595c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1596c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1597c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1598c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1599c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1600c64779e2SAndrii Nakryiko 	.max_entries = 4,
1601c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1602c64779e2SAndrii Nakryiko 	.str_off_delta = 4,
1603c64779e2SAndrii Nakryiko 	.err_str = "Unsupported section found",
1604c64779e2SAndrii Nakryiko },
1605c64779e2SAndrii Nakryiko 
1606c64779e2SAndrii Nakryiko {
1607c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Overlap between type and str",
1608c64779e2SAndrii Nakryiko 	.raw_types = {
1609c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1610c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1611c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1612c64779e2SAndrii Nakryiko 	},
1613c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1614c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1615c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1616c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1617c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1618c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1619c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1620c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1621c64779e2SAndrii Nakryiko 	.max_entries = 4,
1622c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1623c64779e2SAndrii Nakryiko 	.str_off_delta = -4,
1624c64779e2SAndrii Nakryiko 	.err_str = "Section overlap found",
1625c64779e2SAndrii Nakryiko },
1626c64779e2SAndrii Nakryiko 
1627c64779e2SAndrii Nakryiko {
1628c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Larger BTF size",
1629c64779e2SAndrii Nakryiko 	.raw_types = {
1630c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1631c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1632c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1633c64779e2SAndrii Nakryiko 	},
1634c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1635c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1636c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1637c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1638c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1639c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1640c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1641c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1642c64779e2SAndrii Nakryiko 	.max_entries = 4,
1643c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1644c64779e2SAndrii Nakryiko 	.str_len_delta = -4,
1645c64779e2SAndrii Nakryiko 	.err_str = "Unsupported section found",
1646c64779e2SAndrii Nakryiko },
1647c64779e2SAndrii Nakryiko 
1648c64779e2SAndrii Nakryiko {
1649c64779e2SAndrii Nakryiko 	.descr = "btf_header test. Smaller BTF size",
1650c64779e2SAndrii Nakryiko 	.raw_types = {
1651c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1652c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
1653c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1654c64779e2SAndrii Nakryiko 	},
1655c64779e2SAndrii Nakryiko 	.str_sec = "\0int",
1656c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int"),
1657c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1658c64779e2SAndrii Nakryiko 	.map_name = "hdr_test_map",
1659c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1660c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1661c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1662c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1663c64779e2SAndrii Nakryiko 	.max_entries = 4,
1664c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1665c64779e2SAndrii Nakryiko 	.str_len_delta = 4,
1666c64779e2SAndrii Nakryiko 	.err_str = "Total section length too long",
1667c64779e2SAndrii Nakryiko },
1668c64779e2SAndrii Nakryiko 
1669c64779e2SAndrii Nakryiko {
1670c64779e2SAndrii Nakryiko 	.descr = "array test. index_type/elem_type \"int\"",
1671c64779e2SAndrii Nakryiko 	.raw_types = {
1672c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1673c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1674c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1675c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 16),
1676c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1677c64779e2SAndrii Nakryiko 	},
1678c64779e2SAndrii Nakryiko 	.str_sec = "",
1679c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1680c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1681c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1682c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1683c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1684c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1685c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1686c64779e2SAndrii Nakryiko 	.max_entries = 4,
1687c64779e2SAndrii Nakryiko },
1688c64779e2SAndrii Nakryiko 
1689c64779e2SAndrii Nakryiko {
1690c64779e2SAndrii Nakryiko 	.descr = "array test. index_type/elem_type \"const int\"",
1691c64779e2SAndrii Nakryiko 	.raw_types = {
1692c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1693c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1694c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1695c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 3, 16),
1696c64779e2SAndrii Nakryiko 		/* CONST type_id=1 */			/* [3] */
1697c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1),
1698c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1699c64779e2SAndrii Nakryiko 	},
1700c64779e2SAndrii Nakryiko 	.str_sec = "",
1701c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1702c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1703c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1704c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1705c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1706c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1707c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1708c64779e2SAndrii Nakryiko 	.max_entries = 4,
1709c64779e2SAndrii Nakryiko },
1710c64779e2SAndrii Nakryiko 
1711c64779e2SAndrii Nakryiko {
1712c64779e2SAndrii Nakryiko 	.descr = "array test. index_type \"const int:31\"",
1713c64779e2SAndrii Nakryiko 	.raw_types = {
1714c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1715c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1716c64779e2SAndrii Nakryiko 		/* int:31 */				/* [2] */
1717c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 31, 4),
1718c64779e2SAndrii Nakryiko 		/* int[16] */				/* [3] */
1719c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 4, 16),
1720c64779e2SAndrii Nakryiko 		/* CONST type_id=2 */			/* [4] */
1721c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2),
1722c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1723c64779e2SAndrii Nakryiko 	},
1724c64779e2SAndrii Nakryiko 	.str_sec = "",
1725c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1726c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1727c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1728c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1729c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1730c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1731c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1732c64779e2SAndrii Nakryiko 	.max_entries = 4,
1733c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1734c64779e2SAndrii Nakryiko 	.err_str = "Invalid index",
1735c64779e2SAndrii Nakryiko },
1736c64779e2SAndrii Nakryiko 
1737c64779e2SAndrii Nakryiko {
1738c64779e2SAndrii Nakryiko 	.descr = "array test. elem_type \"const int:31\"",
1739c64779e2SAndrii Nakryiko 	.raw_types = {
1740c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1741c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1742c64779e2SAndrii Nakryiko 		/* int:31 */				/* [2] */
1743c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 31, 4),
1744c64779e2SAndrii Nakryiko 		/* int[16] */				/* [3] */
1745c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(4, 1, 16),
1746c64779e2SAndrii Nakryiko 		/* CONST type_id=2 */			/* [4] */
1747c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 2),
1748c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1749c64779e2SAndrii Nakryiko 	},
1750c64779e2SAndrii Nakryiko 	.str_sec = "",
1751c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1752c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1753c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1754c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1755c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1756c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1757c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1758c64779e2SAndrii Nakryiko 	.max_entries = 4,
1759c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1760c64779e2SAndrii Nakryiko 	.err_str = "Invalid array of int",
1761c64779e2SAndrii Nakryiko },
1762c64779e2SAndrii Nakryiko 
1763c64779e2SAndrii Nakryiko {
1764c64779e2SAndrii Nakryiko 	.descr = "array test. index_type \"void\"",
1765c64779e2SAndrii Nakryiko 	.raw_types = {
1766c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1767c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1768c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1769c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 0, 16),
1770c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1771c64779e2SAndrii Nakryiko 	},
1772c64779e2SAndrii Nakryiko 	.str_sec = "",
1773c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1774c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1775c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1776c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1777c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1778c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1779c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1780c64779e2SAndrii Nakryiko 	.max_entries = 4,
1781c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1782c64779e2SAndrii Nakryiko 	.err_str = "Invalid index",
1783c64779e2SAndrii Nakryiko },
1784c64779e2SAndrii Nakryiko 
1785c64779e2SAndrii Nakryiko {
1786c64779e2SAndrii Nakryiko 	.descr = "array test. index_type \"const void\"",
1787c64779e2SAndrii Nakryiko 	.raw_types = {
1788c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1789c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1790c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1791c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 3, 16),
1792c64779e2SAndrii Nakryiko 		/* CONST type_id=0 (void) */		/* [3] */
1793c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1794c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1795c64779e2SAndrii Nakryiko 	},
1796c64779e2SAndrii Nakryiko 	.str_sec = "",
1797c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1798c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1799c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1800c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1801c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1802c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1803c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1804c64779e2SAndrii Nakryiko 	.max_entries = 4,
1805c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1806c64779e2SAndrii Nakryiko 	.err_str = "Invalid index",
1807c64779e2SAndrii Nakryiko },
1808c64779e2SAndrii Nakryiko 
1809c64779e2SAndrii Nakryiko {
1810c64779e2SAndrii Nakryiko 	.descr = "array test. elem_type \"const void\"",
1811c64779e2SAndrii Nakryiko 	.raw_types = {
1812c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1813c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1814c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1815c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 16),
1816c64779e2SAndrii Nakryiko 		/* CONST type_id=0 (void) */		/* [3] */
1817c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 0),
1818c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1819c64779e2SAndrii Nakryiko 	},
1820c64779e2SAndrii Nakryiko 	.str_sec = "",
1821c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1822c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1823c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1824c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1825c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1826c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1827c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1828c64779e2SAndrii Nakryiko 	.max_entries = 4,
1829c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1830c64779e2SAndrii Nakryiko 	.err_str = "Invalid elem",
1831c64779e2SAndrii Nakryiko },
1832c64779e2SAndrii Nakryiko 
1833c64779e2SAndrii Nakryiko {
1834c64779e2SAndrii Nakryiko 	.descr = "array test. elem_type \"const void *\"",
1835c64779e2SAndrii Nakryiko 	.raw_types = {
1836c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1837c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1838c64779e2SAndrii Nakryiko 		/* const void *[16] */			/* [2] */
1839c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 1, 16),
1840c64779e2SAndrii Nakryiko 		/* CONST type_id=4 */			/* [3] */
1841c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1842c64779e2SAndrii Nakryiko 		/* void* */				/* [4] */
1843c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
1844c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1845c64779e2SAndrii Nakryiko 	},
1846c64779e2SAndrii Nakryiko 	.str_sec = "",
1847c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1848c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1849c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1850c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1851c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1852c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1853c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1854c64779e2SAndrii Nakryiko 	.max_entries = 4,
1855c64779e2SAndrii Nakryiko },
1856c64779e2SAndrii Nakryiko 
1857c64779e2SAndrii Nakryiko {
1858c64779e2SAndrii Nakryiko 	.descr = "array test. index_type \"const void *\"",
1859c64779e2SAndrii Nakryiko 	.raw_types = {
1860c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1861c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1862c64779e2SAndrii Nakryiko 		/* const void *[16] */			/* [2] */
1863c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(3, 3, 16),
1864c64779e2SAndrii Nakryiko 		/* CONST type_id=4 */			/* [3] */
1865c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 4),
1866c64779e2SAndrii Nakryiko 		/* void* */				/* [4] */
1867c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0),
1868c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1869c64779e2SAndrii Nakryiko 	},
1870c64779e2SAndrii Nakryiko 	.str_sec = "",
1871c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1872c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1873c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1874c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1875c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1876c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1877c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1878c64779e2SAndrii Nakryiko 	.max_entries = 4,
1879c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1880c64779e2SAndrii Nakryiko 	.err_str = "Invalid index",
1881c64779e2SAndrii Nakryiko },
1882c64779e2SAndrii Nakryiko 
1883c64779e2SAndrii Nakryiko {
1884c64779e2SAndrii Nakryiko 	.descr = "array test. t->size != 0\"",
1885c64779e2SAndrii Nakryiko 	.raw_types = {
1886c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1887c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1888c64779e2SAndrii Nakryiko 		/* int[16] */				/* [2] */
1889c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY, 0, 0), 1),
1890c64779e2SAndrii Nakryiko 		BTF_ARRAY_ENC(1, 1, 16),
1891c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1892c64779e2SAndrii Nakryiko 	},
1893c64779e2SAndrii Nakryiko 	.str_sec = "",
1894c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1895c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1896c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1897c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1898c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1899c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1900c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1901c64779e2SAndrii Nakryiko 	.max_entries = 4,
1902c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1903c64779e2SAndrii Nakryiko 	.err_str = "size != 0",
1904c64779e2SAndrii Nakryiko },
1905c64779e2SAndrii Nakryiko 
1906c64779e2SAndrii Nakryiko {
1907c64779e2SAndrii Nakryiko 	.descr = "int test. invalid int_data",
1908c64779e2SAndrii Nakryiko 	.raw_types = {
1909c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), 4),
1910c64779e2SAndrii Nakryiko 		0x10000000,
1911c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1912c64779e2SAndrii Nakryiko 	},
1913c64779e2SAndrii Nakryiko 	.str_sec = "",
1914c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1915c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1916c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1917c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1918c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1919c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1920c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1921c64779e2SAndrii Nakryiko 	.max_entries = 4,
1922c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1923c64779e2SAndrii Nakryiko 	.err_str = "Invalid int_data",
1924c64779e2SAndrii Nakryiko },
1925c64779e2SAndrii Nakryiko 
1926c64779e2SAndrii Nakryiko {
1927c64779e2SAndrii Nakryiko 	.descr = "invalid BTF_INFO",
1928c64779e2SAndrii Nakryiko 	.raw_types = {
1929c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1930c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1931eea154a8SIlya Leoshkevich 		BTF_TYPE_ENC(0, 0x20000000, 4),
1932c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1933c64779e2SAndrii Nakryiko 	},
1934c64779e2SAndrii Nakryiko 	.str_sec = "",
1935c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1936c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1937c64779e2SAndrii Nakryiko 	.map_name = "array_test_map",
1938c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1939c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1940c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1941c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1942c64779e2SAndrii Nakryiko 	.max_entries = 4,
1943c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1944c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info",
1945c64779e2SAndrii Nakryiko },
1946c64779e2SAndrii Nakryiko 
1947c64779e2SAndrii Nakryiko {
1948c64779e2SAndrii Nakryiko 	.descr = "fwd test. t->type != 0\"",
1949c64779e2SAndrii Nakryiko 	.raw_types = {
1950c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
1951c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
1952c64779e2SAndrii Nakryiko 		/* fwd type */				/* [2] */
1953c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 1),
1954c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1955c64779e2SAndrii Nakryiko 	},
1956c64779e2SAndrii Nakryiko 	.str_sec = "",
1957c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
1958c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1959c64779e2SAndrii Nakryiko 	.map_name = "fwd_test_map",
1960c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1961c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1962c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1963c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1964c64779e2SAndrii Nakryiko 	.max_entries = 4,
1965c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1966c64779e2SAndrii Nakryiko 	.err_str = "type != 0",
1967c64779e2SAndrii Nakryiko },
1968c64779e2SAndrii Nakryiko 
1969c64779e2SAndrii Nakryiko {
1970c64779e2SAndrii Nakryiko 	.descr = "typedef (invalid name, name_off = 0)",
1971c64779e2SAndrii Nakryiko 	.raw_types = {
1972c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1973c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(0, 1),				/* [2] */
1974c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1975c64779e2SAndrii Nakryiko 	},
1976c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
1977c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
1978c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1979c64779e2SAndrii Nakryiko 	.map_name = "typedef_check_btf",
1980c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
1981c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
1982c64779e2SAndrii Nakryiko 	.key_type_id = 1,
1983c64779e2SAndrii Nakryiko 	.value_type_id = 1,
1984c64779e2SAndrii Nakryiko 	.max_entries = 4,
1985c64779e2SAndrii Nakryiko 	.btf_load_err = true,
1986c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
1987c64779e2SAndrii Nakryiko },
1988c64779e2SAndrii Nakryiko 
1989c64779e2SAndrii Nakryiko {
1990c64779e2SAndrii Nakryiko 	.descr = "typedef (invalid name, invalid identifier)",
1991c64779e2SAndrii Nakryiko 	.raw_types = {
1992c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
1993c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),			/* [2] */
1994c64779e2SAndrii Nakryiko 		BTF_END_RAW,
1995c64779e2SAndrii Nakryiko 	},
1996c64779e2SAndrii Nakryiko 	.str_sec = "\0__!int",
1997c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__!int"),
1998c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
1999c64779e2SAndrii Nakryiko 	.map_name = "typedef_check_btf",
2000c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2001c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2002c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2003c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2004c64779e2SAndrii Nakryiko 	.max_entries = 4,
2005c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2006c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2007c64779e2SAndrii Nakryiko },
2008c64779e2SAndrii Nakryiko 
2009c64779e2SAndrii Nakryiko {
2010c64779e2SAndrii Nakryiko 	.descr = "ptr type (invalid name, name_off <> 0)",
2011c64779e2SAndrii Nakryiko 	.raw_types = {
2012c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2013c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2014c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 1),	/* [2] */
2015c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2016c64779e2SAndrii Nakryiko 	},
2017c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
2018c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
2019c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2020c64779e2SAndrii Nakryiko 	.map_name = "ptr_type_check_btf",
2021c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2022c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2023c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2024c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2025c64779e2SAndrii Nakryiko 	.max_entries = 4,
2026c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2027c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2028c64779e2SAndrii Nakryiko },
2029c64779e2SAndrii Nakryiko 
2030c64779e2SAndrii Nakryiko {
2031c64779e2SAndrii Nakryiko 	.descr = "volatile type (invalid name, name_off <> 0)",
2032c64779e2SAndrii Nakryiko 	.raw_types = {
2033c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2034c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2035c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 1),	/* [2] */
2036c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2037c64779e2SAndrii Nakryiko 	},
2038c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
2039c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
2040c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2041c64779e2SAndrii Nakryiko 	.map_name = "volatile_type_check_btf",
2042c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2043c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2044c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2045c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2046c64779e2SAndrii Nakryiko 	.max_entries = 4,
2047c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2048c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2049c64779e2SAndrii Nakryiko },
2050c64779e2SAndrii Nakryiko 
2051c64779e2SAndrii Nakryiko {
2052c64779e2SAndrii Nakryiko 	.descr = "const type (invalid name, name_off <> 0)",
2053c64779e2SAndrii Nakryiko 	.raw_types = {
2054c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2055c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2056c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 1),	/* [2] */
2057c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2058c64779e2SAndrii Nakryiko 	},
2059c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
2060c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
2061c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2062c64779e2SAndrii Nakryiko 	.map_name = "const_type_check_btf",
2063c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2064c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2065c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2066c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2067c64779e2SAndrii Nakryiko 	.max_entries = 4,
2068c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2069c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2070c64779e2SAndrii Nakryiko },
2071c64779e2SAndrii Nakryiko 
2072c64779e2SAndrii Nakryiko {
2073c64779e2SAndrii Nakryiko 	.descr = "restrict type (invalid name, name_off <> 0)",
2074c64779e2SAndrii Nakryiko 	.raw_types = {
2075c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2076c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 1),	/* [2] */
2077c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2078c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_RESTRICT, 0, 0), 2),	/* [3] */
2079c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2080c64779e2SAndrii Nakryiko 	},
2081c64779e2SAndrii Nakryiko 	.str_sec = "\0__int",
2082c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__int"),
2083c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2084c64779e2SAndrii Nakryiko 	.map_name = "restrict_type_check_btf",
2085c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2086c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2087c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2088c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2089c64779e2SAndrii Nakryiko 	.max_entries = 4,
2090c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2091c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2092c64779e2SAndrii Nakryiko },
2093c64779e2SAndrii Nakryiko 
2094c64779e2SAndrii Nakryiko {
2095c64779e2SAndrii Nakryiko 	.descr = "fwd type (invalid name, name_off = 0)",
2096c64779e2SAndrii Nakryiko 	.raw_types = {
2097c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2098c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 0),	/* [2] */
2099c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2100c64779e2SAndrii Nakryiko 	},
2101c64779e2SAndrii Nakryiko 	.str_sec = "\0__skb",
2102c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__skb"),
2103c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2104c64779e2SAndrii Nakryiko 	.map_name = "fwd_type_check_btf",
2105c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2106c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2107c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2108c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2109c64779e2SAndrii Nakryiko 	.max_entries = 4,
2110c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2111c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2112c64779e2SAndrii Nakryiko },
2113c64779e2SAndrii Nakryiko 
2114c64779e2SAndrii Nakryiko {
2115c64779e2SAndrii Nakryiko 	.descr = "fwd type (invalid name, invalid identifier)",
2116c64779e2SAndrii Nakryiko 	.raw_types = {
2117c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2118c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2119c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_FWD, 0, 0), 0),	/* [2] */
2120c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2121c64779e2SAndrii Nakryiko 	},
2122c64779e2SAndrii Nakryiko 	.str_sec = "\0__!skb",
2123c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__!skb"),
2124c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2125c64779e2SAndrii Nakryiko 	.map_name = "fwd_type_check_btf",
2126c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2127c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2128c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2129c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2130c64779e2SAndrii Nakryiko 	.max_entries = 4,
2131c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2132c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2133c64779e2SAndrii Nakryiko },
2134c64779e2SAndrii Nakryiko 
2135c64779e2SAndrii Nakryiko {
2136c64779e2SAndrii Nakryiko 	.descr = "array type (invalid name, name_off <> 0)",
2137c64779e2SAndrii Nakryiko 	.raw_types = {
2138c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2139c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2140c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ARRAY, 0, 0), 0),	/* [2] */
2141c64779e2SAndrii Nakryiko 		BTF_ARRAY_ENC(1, 1, 4),
2142c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2143c64779e2SAndrii Nakryiko 	},
2144c64779e2SAndrii Nakryiko 	.str_sec = "\0__skb",
2145c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0__skb"),
2146c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2147c64779e2SAndrii Nakryiko 	.map_name = "array_type_check_btf",
2148c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2149c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2150c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2151c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2152c64779e2SAndrii Nakryiko 	.max_entries = 4,
2153c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2154c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2155c64779e2SAndrii Nakryiko },
2156c64779e2SAndrii Nakryiko 
2157c64779e2SAndrii Nakryiko {
2158c64779e2SAndrii Nakryiko 	.descr = "struct type (name_off = 0)",
2159c64779e2SAndrii Nakryiko 	.raw_types = {
2160c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2161c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2162c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4),	/* [2] */
2163c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2164c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2165c64779e2SAndrii Nakryiko 	},
2166c64779e2SAndrii Nakryiko 	.str_sec = "\0A",
2167c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A"),
2168c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2169c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
2170c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2171c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2172c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2173c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2174c64779e2SAndrii Nakryiko 	.max_entries = 4,
2175c64779e2SAndrii Nakryiko },
2176c64779e2SAndrii Nakryiko 
2177c64779e2SAndrii Nakryiko {
2178c64779e2SAndrii Nakryiko 	.descr = "struct type (invalid name, invalid identifier)",
2179c64779e2SAndrii Nakryiko 	.raw_types = {
2180c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2181c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2182c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4),	/* [2] */
2183c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2184c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2185c64779e2SAndrii Nakryiko 	},
2186c64779e2SAndrii Nakryiko 	.str_sec = "\0A!\0B",
2187c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A!\0B"),
2188c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2189c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
2190c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2191c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2192c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2193c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2194c64779e2SAndrii Nakryiko 	.max_entries = 4,
2195c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2196c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2197c64779e2SAndrii Nakryiko },
2198c64779e2SAndrii Nakryiko 
2199c64779e2SAndrii Nakryiko {
2200c64779e2SAndrii Nakryiko 	.descr = "struct member (name_off = 0)",
2201c64779e2SAndrii Nakryiko 	.raw_types = {
2202c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2203c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2204c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4),	/* [2] */
2205c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2206c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2207c64779e2SAndrii Nakryiko 	},
2208c64779e2SAndrii Nakryiko 	.str_sec = "\0A",
2209c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A"),
2210c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2211c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
2212c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2213c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2214c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2215c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2216c64779e2SAndrii Nakryiko 	.max_entries = 4,
2217c64779e2SAndrii Nakryiko },
2218c64779e2SAndrii Nakryiko 
2219c64779e2SAndrii Nakryiko {
2220c64779e2SAndrii Nakryiko 	.descr = "struct member (invalid name, invalid identifier)",
2221c64779e2SAndrii Nakryiko 	.raw_types = {
2222c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2223c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2224c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4),	/* [2] */
2225c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
2226c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2227c64779e2SAndrii Nakryiko 	},
2228c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0B*",
2229c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0B*"),
2230c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2231c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
2232c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2233c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2234c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2235c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2236c64779e2SAndrii Nakryiko 	.max_entries = 4,
2237c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2238c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2239c64779e2SAndrii Nakryiko },
2240c64779e2SAndrii Nakryiko 
2241c64779e2SAndrii Nakryiko {
2242c64779e2SAndrii Nakryiko 	.descr = "enum type (name_off = 0)",
2243c64779e2SAndrii Nakryiko 	.raw_types = {
2244c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2245c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2246c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2247c64779e2SAndrii Nakryiko 			     sizeof(int)),				/* [2] */
2248c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
2249c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2250c64779e2SAndrii Nakryiko 	},
2251c64779e2SAndrii Nakryiko 	.str_sec = "\0A\0B",
2252c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A\0B"),
2253c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2254c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2255c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2256c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2257c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2258c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2259c64779e2SAndrii Nakryiko 	.max_entries = 4,
2260c64779e2SAndrii Nakryiko },
2261c64779e2SAndrii Nakryiko 
2262c64779e2SAndrii Nakryiko {
2263c64779e2SAndrii Nakryiko 	.descr = "enum type (invalid name, invalid identifier)",
2264c64779e2SAndrii Nakryiko 	.raw_types = {
2265c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2266c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2267c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2268c64779e2SAndrii Nakryiko 			     sizeof(int)),				/* [2] */
2269c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
2270c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2271c64779e2SAndrii Nakryiko 	},
2272c64779e2SAndrii Nakryiko 	.str_sec = "\0A!\0B",
2273c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A!\0B"),
2274c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2275c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2276c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2277c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2278c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2279c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2280c64779e2SAndrii Nakryiko 	.max_entries = 4,
2281c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2282c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2283c64779e2SAndrii Nakryiko },
2284c64779e2SAndrii Nakryiko 
2285c64779e2SAndrii Nakryiko {
2286c64779e2SAndrii Nakryiko 	.descr = "enum member (invalid name, name_off = 0)",
2287c64779e2SAndrii Nakryiko 	.raw_types = {
2288c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2289c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2290c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2291c64779e2SAndrii Nakryiko 			     sizeof(int)),				/* [2] */
2292c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(0, 0),
2293c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2294c64779e2SAndrii Nakryiko 	},
2295c64779e2SAndrii Nakryiko 	.str_sec = "",
2296c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2297c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2298c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2299c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2300c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2301c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2302c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2303c64779e2SAndrii Nakryiko 	.max_entries = 4,
2304c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2305c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2306c64779e2SAndrii Nakryiko },
2307c64779e2SAndrii Nakryiko 
2308c64779e2SAndrii Nakryiko {
2309c64779e2SAndrii Nakryiko 	.descr = "enum member (invalid name, invalid identifier)",
2310c64779e2SAndrii Nakryiko 	.raw_types = {
2311c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2312c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0,
2313c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1),
2314c64779e2SAndrii Nakryiko 			     sizeof(int)),				/* [2] */
2315c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
2316c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2317c64779e2SAndrii Nakryiko 	},
2318c64779e2SAndrii Nakryiko 	.str_sec = "\0A!",
2319c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0A!"),
2320c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2321c64779e2SAndrii Nakryiko 	.map_name = "enum_type_check_btf",
2322c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2323c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2324c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2325c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2326c64779e2SAndrii Nakryiko 	.max_entries = 4,
2327c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2328c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2329c64779e2SAndrii Nakryiko },
2330c64779e2SAndrii Nakryiko {
2331c64779e2SAndrii Nakryiko 	.descr = "arraymap invalid btf key (a bit field)",
2332c64779e2SAndrii Nakryiko 	.raw_types = {
2333c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
2334c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2335c64779e2SAndrii Nakryiko 		/* 32 bit int with 32 bit offset */	/* [2] */
2336c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 32, 32, 8),
2337c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2338c64779e2SAndrii Nakryiko 	},
2339c64779e2SAndrii Nakryiko 	.str_sec = "",
2340c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2341c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2342c64779e2SAndrii Nakryiko 	.map_name = "array_map_check_btf",
2343c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2344c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2345c64779e2SAndrii Nakryiko 	.key_type_id = 2,
2346c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2347c64779e2SAndrii Nakryiko 	.max_entries = 4,
2348c64779e2SAndrii Nakryiko 	.map_create_err = true,
2349c64779e2SAndrii Nakryiko },
2350c64779e2SAndrii Nakryiko 
2351c64779e2SAndrii Nakryiko {
2352c64779e2SAndrii Nakryiko 	.descr = "arraymap invalid btf key (!= 32 bits)",
2353c64779e2SAndrii Nakryiko 	.raw_types = {
2354c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
2355c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2356c64779e2SAndrii Nakryiko 		/* 16 bit int with 0 bit offset */	/* [2] */
2357c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 16, 2),
2358c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2359c64779e2SAndrii Nakryiko 	},
2360c64779e2SAndrii Nakryiko 	.str_sec = "",
2361c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2362c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2363c64779e2SAndrii Nakryiko 	.map_name = "array_map_check_btf",
2364c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2365c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2366c64779e2SAndrii Nakryiko 	.key_type_id = 2,
2367c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2368c64779e2SAndrii Nakryiko 	.max_entries = 4,
2369c64779e2SAndrii Nakryiko 	.map_create_err = true,
2370c64779e2SAndrii Nakryiko },
2371c64779e2SAndrii Nakryiko 
2372c64779e2SAndrii Nakryiko {
2373c64779e2SAndrii Nakryiko 	.descr = "arraymap invalid btf value (too small)",
2374c64779e2SAndrii Nakryiko 	.raw_types = {
2375c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
2376c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2377c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2378c64779e2SAndrii Nakryiko 	},
2379c64779e2SAndrii Nakryiko 	.str_sec = "",
2380c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2381c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2382c64779e2SAndrii Nakryiko 	.map_name = "array_map_check_btf",
2383c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2384c64779e2SAndrii Nakryiko 	/* btf_value_size < map->value_size */
2385c64779e2SAndrii Nakryiko 	.value_size = sizeof(__u64),
2386c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2387c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2388c64779e2SAndrii Nakryiko 	.max_entries = 4,
2389c64779e2SAndrii Nakryiko 	.map_create_err = true,
2390c64779e2SAndrii Nakryiko },
2391c64779e2SAndrii Nakryiko 
2392c64779e2SAndrii Nakryiko {
2393c64779e2SAndrii Nakryiko 	.descr = "arraymap invalid btf value (too big)",
2394c64779e2SAndrii Nakryiko 	.raw_types = {
2395c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
2396c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
2397c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2398c64779e2SAndrii Nakryiko 	},
2399c64779e2SAndrii Nakryiko 	.str_sec = "",
2400c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2401c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2402c64779e2SAndrii Nakryiko 	.map_name = "array_map_check_btf",
2403c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2404c64779e2SAndrii Nakryiko 	/* btf_value_size > map->value_size */
2405c64779e2SAndrii Nakryiko 	.value_size = sizeof(__u16),
2406c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2407c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2408c64779e2SAndrii Nakryiko 	.max_entries = 4,
2409c64779e2SAndrii Nakryiko 	.map_create_err = true,
2410c64779e2SAndrii Nakryiko },
2411c64779e2SAndrii Nakryiko 
2412c64779e2SAndrii Nakryiko {
2413c64779e2SAndrii Nakryiko 	.descr = "func proto (int (*)(int, unsigned int))",
2414c64779e2SAndrii Nakryiko 	.raw_types = {
2415c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */
2416c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2417c64779e2SAndrii Nakryiko 		/* int (*)(int, unsigned int) */
2418c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
2419c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2420c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2421c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2422c64779e2SAndrii Nakryiko 	},
2423c64779e2SAndrii Nakryiko 	.str_sec = "",
2424c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2425c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2426c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2427c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2428c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2429c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2430c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2431c64779e2SAndrii Nakryiko 	.max_entries = 4,
2432c64779e2SAndrii Nakryiko },
2433c64779e2SAndrii Nakryiko 
2434c64779e2SAndrii Nakryiko {
2435c64779e2SAndrii Nakryiko 	.descr = "func proto (vararg)",
2436c64779e2SAndrii Nakryiko 	.raw_types = {
2437c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2438c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2439c64779e2SAndrii Nakryiko 		/* void (*)(int, unsigned int, ...) */
2440c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 3),			/* [3] */
2441c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2442c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2443c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 0),
2444c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2445c64779e2SAndrii Nakryiko 	},
2446c64779e2SAndrii Nakryiko 	.str_sec = "",
2447c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2448c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2449c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2450c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2451c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2452c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2453c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2454c64779e2SAndrii Nakryiko 	.max_entries = 4,
2455c64779e2SAndrii Nakryiko },
2456c64779e2SAndrii Nakryiko 
2457c64779e2SAndrii Nakryiko {
2458c64779e2SAndrii Nakryiko 	.descr = "func proto (vararg with name)",
2459c64779e2SAndrii Nakryiko 	.raw_types = {
2460c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2461c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2462c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b, ... c) */
2463c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 3),			/* [3] */
2464c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2465c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2466c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 0),
2467c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2468c64779e2SAndrii Nakryiko 	},
2469c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b\0c",
2470c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b\0c"),
2471c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2472c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2473c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2474c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2475c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2476c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2477c64779e2SAndrii Nakryiko 	.max_entries = 4,
2478c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2479c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#3",
2480c64779e2SAndrii Nakryiko },
2481c64779e2SAndrii Nakryiko 
2482c64779e2SAndrii Nakryiko {
2483c64779e2SAndrii Nakryiko 	.descr = "func proto (arg after vararg)",
2484c64779e2SAndrii Nakryiko 	.raw_types = {
2485c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2486c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2487c64779e2SAndrii Nakryiko 		/* void (*)(int a, ..., unsigned int b) */
2488c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 3),			/* [3] */
2489c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2490c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 0),
2491c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2492c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2493c64779e2SAndrii Nakryiko 	},
2494c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b",
2495c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b"),
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 	.btf_load_err = true,
2504c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#2",
2505c64779e2SAndrii Nakryiko },
2506c64779e2SAndrii Nakryiko 
2507c64779e2SAndrii Nakryiko {
2508c64779e2SAndrii Nakryiko 	.descr = "func proto (CONST=>TYPEDEF=>PTR=>FUNC_PROTO)",
2509c64779e2SAndrii Nakryiko 	.raw_types = {
2510c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2511c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2512c64779e2SAndrii Nakryiko 		/* typedef void (*func_ptr)(int, unsigned int) */
2513c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 5),			/* [3] */
2514c64779e2SAndrii Nakryiko 		/* const func_ptr */
2515c64779e2SAndrii Nakryiko 		BTF_CONST_ENC(3),				/* [4] */
2516c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(6),					/* [5] */
2517c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [6] */
2518c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2519c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2520c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2521c64779e2SAndrii Nakryiko 	},
2522c64779e2SAndrii Nakryiko 	.str_sec = "\0func_ptr",
2523c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0func_ptr"),
2524c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2525c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2526c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2527c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2528c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2529c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2530c64779e2SAndrii Nakryiko 	.max_entries = 4,
2531c64779e2SAndrii Nakryiko },
2532c64779e2SAndrii Nakryiko 
2533c64779e2SAndrii Nakryiko {
2534c64779e2SAndrii Nakryiko 	.descr = "func proto (TYPEDEF=>FUNC_PROTO)",
2535c64779e2SAndrii Nakryiko 	.raw_types = {
2536c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2537c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2538c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
2539c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [4] */
2540c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2541c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2542c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2543c64779e2SAndrii Nakryiko 	},
2544c64779e2SAndrii Nakryiko 	.str_sec = "\0func_typedef",
2545c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0func_typedef"),
2546c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2547c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2548c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2549c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2550c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2551c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2552c64779e2SAndrii Nakryiko 	.max_entries = 4,
2553c64779e2SAndrii Nakryiko },
2554c64779e2SAndrii Nakryiko 
2555c64779e2SAndrii Nakryiko {
2556c64779e2SAndrii Nakryiko 	.descr = "func proto (btf_resolve(arg))",
2557c64779e2SAndrii Nakryiko 	.raw_types = {
2558c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2559c64779e2SAndrii Nakryiko 		/* void (*)(const void *) */
2560c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 1),			/* [2] */
2561c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 3),
2562c64779e2SAndrii Nakryiko 		BTF_CONST_ENC(4),				/* [3] */
2563c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(0),					/* [4] */
2564c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2565c64779e2SAndrii Nakryiko 	},
2566c64779e2SAndrii Nakryiko 	.str_sec = "",
2567c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2568c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2569c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2570c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2571c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2572c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2573c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2574c64779e2SAndrii Nakryiko 	.max_entries = 4,
2575c64779e2SAndrii Nakryiko },
2576c64779e2SAndrii Nakryiko 
2577c64779e2SAndrii Nakryiko {
2578c64779e2SAndrii Nakryiko 	.descr = "func proto (Not all arg has name)",
2579c64779e2SAndrii Nakryiko 	.raw_types = {
2580c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2581c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2582c64779e2SAndrii Nakryiko 		/* void (*)(int, unsigned int b) */
2583c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2584c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2585c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2586c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2587c64779e2SAndrii Nakryiko 	},
2588c64779e2SAndrii Nakryiko 	.str_sec = "\0b",
2589c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0b"),
2590c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2591c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2592c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2593c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2594c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2595c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2596c64779e2SAndrii Nakryiko 	.max_entries = 4,
2597c64779e2SAndrii Nakryiko },
2598c64779e2SAndrii Nakryiko 
2599c64779e2SAndrii Nakryiko {
2600c64779e2SAndrii Nakryiko 	.descr = "func proto (Bad arg name_off)",
2601c64779e2SAndrii Nakryiko 	.raw_types = {
2602c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2603c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2604c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int <bad_name_off>) */
2605c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2606c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2607c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0x0fffffff, 2),
2608c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2609c64779e2SAndrii Nakryiko 	},
2610c64779e2SAndrii Nakryiko 	.str_sec = "\0a",
2611c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a"),
2612c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2613c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2614c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2615c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2616c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2617c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2618c64779e2SAndrii Nakryiko 	.max_entries = 4,
2619c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2620c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#2",
2621c64779e2SAndrii Nakryiko },
2622c64779e2SAndrii Nakryiko 
2623c64779e2SAndrii Nakryiko {
2624c64779e2SAndrii Nakryiko 	.descr = "func proto (Bad arg name)",
2625c64779e2SAndrii Nakryiko 	.raw_types = {
2626c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2627c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2628c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int !!!) */
2629c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2630c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2631c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2632c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2633c64779e2SAndrii Nakryiko 	},
2634c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0!!!",
2635c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0!!!"),
2636c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2637c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2638c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2639c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2640c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2641c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2642c64779e2SAndrii Nakryiko 	.max_entries = 4,
2643c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2644c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#2",
2645c64779e2SAndrii Nakryiko },
2646c64779e2SAndrii Nakryiko 
2647c64779e2SAndrii Nakryiko {
2648c64779e2SAndrii Nakryiko 	.descr = "func proto (Invalid return type)",
2649c64779e2SAndrii Nakryiko 	.raw_types = {
2650c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2651c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2652c64779e2SAndrii Nakryiko 		/* <bad_ret_type> (*)(int, unsigned int) */
2653c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(100, 2),			/* [3] */
2654c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2655c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2656c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2657c64779e2SAndrii Nakryiko 	},
2658c64779e2SAndrii Nakryiko 	.str_sec = "",
2659c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2660c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2661c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2662c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2663c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2664c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2665c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2666c64779e2SAndrii Nakryiko 	.max_entries = 4,
2667c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2668c64779e2SAndrii Nakryiko 	.err_str = "Invalid return type",
2669c64779e2SAndrii Nakryiko },
2670c64779e2SAndrii Nakryiko 
2671c64779e2SAndrii Nakryiko {
2672c64779e2SAndrii Nakryiko 	.descr = "func proto (with func name)",
2673c64779e2SAndrii Nakryiko 	.raw_types = {
2674c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2675c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2676c64779e2SAndrii Nakryiko 		/* void func_proto(int, unsigned int) */
2677c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 2), 0),	/* [3] */
2678c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 1),
2679c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2680c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2681c64779e2SAndrii Nakryiko 	},
2682c64779e2SAndrii Nakryiko 	.str_sec = "\0func_proto",
2683c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0func_proto"),
2684c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2685c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2686c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2687c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2688c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2689c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2690c64779e2SAndrii Nakryiko 	.max_entries = 4,
2691c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2692c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2693c64779e2SAndrii Nakryiko },
2694c64779e2SAndrii Nakryiko 
2695c64779e2SAndrii Nakryiko {
2696c64779e2SAndrii Nakryiko 	.descr = "func proto (const void arg)",
2697c64779e2SAndrii Nakryiko 	.raw_types = {
2698c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2699c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2700c64779e2SAndrii Nakryiko 		/* void (*)(const void) */
2701c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 1),			/* [3] */
2702c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 4),
2703c64779e2SAndrii Nakryiko 		BTF_CONST_ENC(0),				/* [4] */
2704c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2705c64779e2SAndrii Nakryiko 	},
2706c64779e2SAndrii Nakryiko 	.str_sec = "",
2707c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
2708c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2709c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
2710c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2711c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2712c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2713c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2714c64779e2SAndrii Nakryiko 	.max_entries = 4,
2715c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2716c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#1",
2717c64779e2SAndrii Nakryiko },
2718c64779e2SAndrii Nakryiko 
2719c64779e2SAndrii Nakryiko {
2720c64779e2SAndrii Nakryiko 	.descr = "func (void func(int a, unsigned int b))",
2721c64779e2SAndrii Nakryiko 	.raw_types = {
2722c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2723c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2724c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b) */
2725c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2726c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2727c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2728c64779e2SAndrii Nakryiko 		/* void func(int a, unsigned int b) */
2729c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [4] */
2730c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2731c64779e2SAndrii Nakryiko 	},
2732c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b\0func",
2733c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b\0func"),
2734c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2735c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2736c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2737c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2738c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2739c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2740c64779e2SAndrii Nakryiko 	.max_entries = 4,
2741c64779e2SAndrii Nakryiko },
2742c64779e2SAndrii Nakryiko 
2743c64779e2SAndrii Nakryiko {
2744c64779e2SAndrii Nakryiko 	.descr = "func (No func name)",
2745c64779e2SAndrii Nakryiko 	.raw_types = {
2746c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2747c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2748c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b) */
2749c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2750c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2751c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2752c64779e2SAndrii Nakryiko 		/* void <no_name>(int a, unsigned int b) */
2753c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(0, 3),				/* [4] */
2754c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2755c64779e2SAndrii Nakryiko 	},
2756c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b",
2757c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b"),
2758c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2759c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2760c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2761c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2762c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2763c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2764c64779e2SAndrii Nakryiko 	.max_entries = 4,
2765c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2766c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2767c64779e2SAndrii Nakryiko },
2768c64779e2SAndrii Nakryiko 
2769c64779e2SAndrii Nakryiko {
2770c64779e2SAndrii Nakryiko 	.descr = "func (Invalid func name)",
2771c64779e2SAndrii Nakryiko 	.raw_types = {
2772c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2773c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2774c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b) */
2775c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2776c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2777c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2778c64779e2SAndrii Nakryiko 		/* void !!!(int a, unsigned int b) */
2779c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [4] */
2780c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2781c64779e2SAndrii Nakryiko 	},
2782c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b\0!!!",
2783c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b\0!!!"),
2784c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2785c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2786c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2787c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2788c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2789c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2790c64779e2SAndrii Nakryiko 	.max_entries = 4,
2791c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2792c64779e2SAndrii Nakryiko 	.err_str = "Invalid name",
2793c64779e2SAndrii Nakryiko },
2794c64779e2SAndrii Nakryiko 
2795c64779e2SAndrii Nakryiko {
2796c64779e2SAndrii Nakryiko 	.descr = "func (Some arg has no name)",
2797c64779e2SAndrii Nakryiko 	.raw_types = {
2798c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2799c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2800c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int) */
2801c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2802c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2803c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(0, 2),
2804c64779e2SAndrii Nakryiko 		/* void func(int a, unsigned int) */
2805c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [4] */
2806c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2807c64779e2SAndrii Nakryiko 	},
2808c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0func",
2809c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0func"),
2810c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2811c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2812c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2813c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2814c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2815c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2816c64779e2SAndrii Nakryiko 	.max_entries = 4,
2817c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2818c64779e2SAndrii Nakryiko 	.err_str = "Invalid arg#2",
2819c64779e2SAndrii Nakryiko },
2820c64779e2SAndrii Nakryiko 
2821c64779e2SAndrii Nakryiko {
2822c64779e2SAndrii Nakryiko 	.descr = "func (Non zero vlen)",
2823c64779e2SAndrii Nakryiko 	.raw_types = {
2824c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2825c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),		/* [2] */
2826c64779e2SAndrii Nakryiko 		/* void (*)(int a, unsigned int b) */
2827c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
2828c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
2829c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
2830c64779e2SAndrii Nakryiko 		/* void func(int a, unsigned int b) */
2831c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 2), 3), 	/* [4] */
2832c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2833c64779e2SAndrii Nakryiko 	},
2834c64779e2SAndrii Nakryiko 	.str_sec = "\0a\0b\0func",
2835c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0a\0b\0func"),
2836c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2837c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2838c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2839c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2840c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2841c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2842c64779e2SAndrii Nakryiko 	.max_entries = 4,
2843c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2844c64779e2SAndrii Nakryiko 	.err_str = "Invalid func linkage",
2845c64779e2SAndrii Nakryiko },
2846c64779e2SAndrii Nakryiko 
2847c64779e2SAndrii Nakryiko {
2848c64779e2SAndrii Nakryiko 	.descr = "func (Not referring to FUNC_PROTO)",
2849c64779e2SAndrii Nakryiko 	.raw_types = {
2850c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
2851c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 1),			/* [2] */
2852c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2853c64779e2SAndrii Nakryiko 	},
2854c64779e2SAndrii Nakryiko 	.str_sec = "\0func",
2855c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0func"),
2856c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2857c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
2858c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2859c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2860c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2861c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2862c64779e2SAndrii Nakryiko 	.max_entries = 4,
2863c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2864c64779e2SAndrii Nakryiko 	.err_str = "Invalid type_id",
2865c64779e2SAndrii Nakryiko },
2866c64779e2SAndrii Nakryiko 
2867c64779e2SAndrii Nakryiko {
2868c64779e2SAndrii Nakryiko 	.descr = "invalid int kind_flag",
2869c64779e2SAndrii Nakryiko 	.raw_types = {
2870c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2871c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_INT, 1, 0), 4),	/* [2] */
2872c64779e2SAndrii Nakryiko 		BTF_INT_ENC(0, 0, 32),
2873c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2874c64779e2SAndrii Nakryiko 	},
2875c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2876c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2877c64779e2SAndrii Nakryiko 	.map_name = "int_type_check_btf",
2878c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2879c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2880c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2881c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2882c64779e2SAndrii Nakryiko 	.max_entries = 4,
2883c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2884c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2885c64779e2SAndrii Nakryiko },
2886c64779e2SAndrii Nakryiko 
2887c64779e2SAndrii Nakryiko {
2888c64779e2SAndrii Nakryiko 	.descr = "invalid ptr kind_flag",
2889c64779e2SAndrii Nakryiko 	.raw_types = {
2890c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2891c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 1, 0), 1),	/* [2] */
2892c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2893c64779e2SAndrii Nakryiko 	},
2894c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2895c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2896c64779e2SAndrii Nakryiko 	.map_name = "ptr_type_check_btf",
2897c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2898c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2899c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2900c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2901c64779e2SAndrii Nakryiko 	.max_entries = 4,
2902c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2903c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2904c64779e2SAndrii Nakryiko },
2905c64779e2SAndrii Nakryiko 
2906c64779e2SAndrii Nakryiko {
2907c64779e2SAndrii Nakryiko 	.descr = "invalid array kind_flag",
2908c64779e2SAndrii Nakryiko 	.raw_types = {
2909c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2910c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ARRAY, 1, 0), 0),	/* [2] */
2911c64779e2SAndrii Nakryiko 		BTF_ARRAY_ENC(1, 1, 1),
2912c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2913c64779e2SAndrii Nakryiko 	},
2914c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2915c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2916c64779e2SAndrii Nakryiko 	.map_name = "array_type_check_btf",
2917c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2918c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2919c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2920c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2921c64779e2SAndrii Nakryiko 	.max_entries = 4,
2922c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2923c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2924c64779e2SAndrii Nakryiko },
2925c64779e2SAndrii Nakryiko 
2926c64779e2SAndrii Nakryiko {
2927c64779e2SAndrii Nakryiko 	.descr = "valid fwd kind_flag",
2928c64779e2SAndrii Nakryiko 	.raw_types = {
2929c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2930c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2931c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_FWD, 1, 0), 0),	/* [2] */
2932c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2933c64779e2SAndrii Nakryiko 	},
2934c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
2935c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2936c64779e2SAndrii Nakryiko 	.map_name = "fwd_type_check_btf",
2937c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2938c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2939c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2940c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2941c64779e2SAndrii Nakryiko 	.max_entries = 4,
2942c64779e2SAndrii Nakryiko },
2943c64779e2SAndrii Nakryiko 
2944c64779e2SAndrii Nakryiko {
2945c64779e2SAndrii Nakryiko 	.descr = "invalid typedef kind_flag",
2946c64779e2SAndrii Nakryiko 	.raw_types = {
2947c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2948c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD,
2949c64779e2SAndrii Nakryiko 			     BTF_INFO_ENC(BTF_KIND_TYPEDEF, 1, 0), 1),	/* [2] */
2950c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2951c64779e2SAndrii Nakryiko 	},
2952c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
2953c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2954c64779e2SAndrii Nakryiko 	.map_name = "typedef_type_check_btf",
2955c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2956c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2957c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2958c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2959c64779e2SAndrii Nakryiko 	.max_entries = 4,
2960c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2961c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2962c64779e2SAndrii Nakryiko },
2963c64779e2SAndrii Nakryiko 
2964c64779e2SAndrii Nakryiko {
2965c64779e2SAndrii Nakryiko 	.descr = "invalid volatile kind_flag",
2966c64779e2SAndrii Nakryiko 	.raw_types = {
2967c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
2968c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 1, 0), 1),	/* [2] */
2969c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2970c64779e2SAndrii Nakryiko 	},
2971c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2972c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2973c64779e2SAndrii Nakryiko 	.map_name = "volatile_type_check_btf",
2974c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2975c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2976c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2977c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2978c64779e2SAndrii Nakryiko 	.max_entries = 4,
2979c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2980c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
2981c64779e2SAndrii Nakryiko },
2982c64779e2SAndrii Nakryiko 
2983c64779e2SAndrii Nakryiko {
2984c64779e2SAndrii Nakryiko 	.descr = "invalid const kind_flag",
2985c64779e2SAndrii Nakryiko 	.raw_types = {
2986c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
2987c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 1, 0), 1),	/* [2] */
2988c64779e2SAndrii Nakryiko 		BTF_END_RAW,
2989c64779e2SAndrii Nakryiko 	},
2990c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
2991c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
2992c64779e2SAndrii Nakryiko 	.map_name = "const_type_check_btf",
2993c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
2994c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
2995c64779e2SAndrii Nakryiko 	.key_type_id = 1,
2996c64779e2SAndrii Nakryiko 	.value_type_id = 1,
2997c64779e2SAndrii Nakryiko 	.max_entries = 4,
2998c64779e2SAndrii Nakryiko 	.btf_load_err = true,
2999c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
3000c64779e2SAndrii Nakryiko },
3001c64779e2SAndrii Nakryiko 
3002c64779e2SAndrii Nakryiko {
3003c64779e2SAndrii Nakryiko 	.descr = "invalid restrict kind_flag",
3004c64779e2SAndrii Nakryiko 	.raw_types = {
3005c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3006c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_RESTRICT, 1, 0), 1),	/* [2] */
3007c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3008c64779e2SAndrii Nakryiko 	},
3009c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
3010c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3011c64779e2SAndrii Nakryiko 	.map_name = "restrict_type_check_btf",
3012c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3013c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3014c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3015c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3016c64779e2SAndrii Nakryiko 	.max_entries = 4,
3017c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3018c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
3019c64779e2SAndrii Nakryiko },
3020c64779e2SAndrii Nakryiko 
3021c64779e2SAndrii Nakryiko {
3022c64779e2SAndrii Nakryiko 	.descr = "invalid func kind_flag",
3023c64779e2SAndrii Nakryiko 	.raw_types = {
3024c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3025c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 0), 0),	/* [2] */
3026c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FUNC, 1, 0), 2),	/* [3] */
3027c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3028c64779e2SAndrii Nakryiko 	},
3029c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3030c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3031c64779e2SAndrii Nakryiko 	.map_name = "func_type_check_btf",
3032c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3033c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3034c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3035c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3036c64779e2SAndrii Nakryiko 	.max_entries = 4,
3037c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3038c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
3039c64779e2SAndrii Nakryiko },
3040c64779e2SAndrii Nakryiko 
3041c64779e2SAndrii Nakryiko {
3042c64779e2SAndrii Nakryiko 	.descr = "invalid func_proto kind_flag",
3043c64779e2SAndrii Nakryiko 	.raw_types = {
3044c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3045c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 1, 0), 0),	/* [2] */
3046c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3047c64779e2SAndrii Nakryiko 	},
3048c64779e2SAndrii Nakryiko 	BTF_STR_SEC(""),
3049c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3050c64779e2SAndrii Nakryiko 	.map_name = "func_proto_type_check_btf",
3051c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3052c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3053c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3054c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3055c64779e2SAndrii Nakryiko 	.max_entries = 4,
3056c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3057c64779e2SAndrii Nakryiko 	.err_str = "Invalid btf_info kind_flag",
3058c64779e2SAndrii Nakryiko },
3059c64779e2SAndrii Nakryiko 
3060c64779e2SAndrii Nakryiko {
3061c64779e2SAndrii Nakryiko 	.descr = "valid struct, kind_flag, bitfield_size = 0",
3062c64779e2SAndrii Nakryiko 	.raw_types = {
3063c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3064c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 8),	/* [2] */
3065c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(0, 0)),
3066c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(0, 32)),
3067c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3068c64779e2SAndrii Nakryiko 	},
3069c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3070c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3071c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3072c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3073c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3074c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3075c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3076c64779e2SAndrii Nakryiko 	.max_entries = 4,
3077c64779e2SAndrii Nakryiko },
3078c64779e2SAndrii Nakryiko 
3079c64779e2SAndrii Nakryiko {
3080c64779e2SAndrii Nakryiko 	.descr = "valid struct, kind_flag, int member, bitfield_size != 0",
3081c64779e2SAndrii Nakryiko 	.raw_types = {
3082c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3083c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),	/* [2] */
3084c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3085c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 4)),
3086c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3087c64779e2SAndrii Nakryiko 	},
3088c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3089c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3090c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3091c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3092c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3093c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3094c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3095c64779e2SAndrii Nakryiko 	.max_entries = 4,
3096c64779e2SAndrii Nakryiko },
3097c64779e2SAndrii Nakryiko 
3098c64779e2SAndrii Nakryiko {
3099c64779e2SAndrii Nakryiko 	.descr = "valid union, kind_flag, int member, bitfield_size != 0",
3100c64779e2SAndrii Nakryiko 	.raw_types = {
3101c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3102c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4),	/* [2] */
3103c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3104c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(4, 0)),
3105c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3106c64779e2SAndrii Nakryiko 	},
3107c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3108c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3109c64779e2SAndrii Nakryiko 	.map_name = "union_type_check_btf",
3110c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3111c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3112c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3113c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3114c64779e2SAndrii Nakryiko 	.max_entries = 4,
3115c64779e2SAndrii Nakryiko },
3116c64779e2SAndrii Nakryiko 
3117c64779e2SAndrii Nakryiko {
3118c64779e2SAndrii Nakryiko 	.descr = "valid struct, kind_flag, enum member, bitfield_size != 0",
3119c64779e2SAndrii Nakryiko 	.raw_types = {
3120c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3121c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3122c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3123c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),/* [3] */
3124c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3125c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 4)),
3126c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3127c64779e2SAndrii Nakryiko 	},
3128c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C"),
3129c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3130c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3131c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3132c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3133c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3134c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3135c64779e2SAndrii Nakryiko 	.max_entries = 4,
3136c64779e2SAndrii Nakryiko },
3137c64779e2SAndrii Nakryiko 
3138c64779e2SAndrii Nakryiko {
3139c64779e2SAndrii Nakryiko 	.descr = "valid union, kind_flag, enum member, bitfield_size != 0",
3140c64779e2SAndrii Nakryiko 	.raw_types = {
3141c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3142c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3143c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3144c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4),	/* [3] */
3145c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3146c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(4, 0)),
3147c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3148c64779e2SAndrii Nakryiko 	},
3149c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C"),
3150c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3151c64779e2SAndrii Nakryiko 	.map_name = "union_type_check_btf",
3152c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3153c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3154c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3155c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3156c64779e2SAndrii Nakryiko 	.max_entries = 4,
3157c64779e2SAndrii Nakryiko },
3158c64779e2SAndrii Nakryiko 
3159c64779e2SAndrii Nakryiko {
3160c64779e2SAndrii Nakryiko 	.descr = "valid struct, kind_flag, typedef member, bitfield_size != 0",
3161c64779e2SAndrii Nakryiko 	.raw_types = {
3162c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3163c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3164c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3165c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),/* [3] */
3166c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, BTF_MEMBER_OFFSET(4, 0)),
3167c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 5, BTF_MEMBER_OFFSET(4, 4)),
3168c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),				/* [4] */
3169c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),				/* [5] */
3170c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3171c64779e2SAndrii Nakryiko 	},
3172c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C\0D\0E"),
3173c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3174c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3175c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3176c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3177c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3178c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3179c64779e2SAndrii Nakryiko 	.max_entries = 4,
3180c64779e2SAndrii Nakryiko },
3181c64779e2SAndrii Nakryiko 
3182c64779e2SAndrii Nakryiko {
3183c64779e2SAndrii Nakryiko 	.descr = "valid union, kind_flag, typedef member, bitfield_size != 0",
3184c64779e2SAndrii Nakryiko 	.raw_types = {
3185c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3186c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3187c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3188c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 4),	/* [3] */
3189c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 4, BTF_MEMBER_OFFSET(4, 0)),
3190c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 5, BTF_MEMBER_OFFSET(4, 0)),
3191c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),				/* [4] */
3192c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),				/* [5] */
3193c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3194c64779e2SAndrii Nakryiko 	},
3195c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C\0D\0E"),
3196c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3197c64779e2SAndrii Nakryiko 	.map_name = "union_type_check_btf",
3198c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3199c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3200c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3201c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3202c64779e2SAndrii Nakryiko 	.max_entries = 4,
3203c64779e2SAndrii Nakryiko },
3204c64779e2SAndrii Nakryiko 
3205c64779e2SAndrii Nakryiko {
3206c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, bitfield_size greater than struct size",
3207c64779e2SAndrii Nakryiko 	.raw_types = {
3208c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3209c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),	/* [2] */
3210c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 0)),
3211c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 20)),
3212c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3213c64779e2SAndrii Nakryiko 	},
3214c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3215c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3216c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3217c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3218c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3219c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3220c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3221c64779e2SAndrii Nakryiko 	.max_entries = 4,
3222c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3223c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
3224c64779e2SAndrii Nakryiko },
3225c64779e2SAndrii Nakryiko 
3226c64779e2SAndrii Nakryiko {
3227c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, bitfield base_type int not regular",
3228c64779e2SAndrii Nakryiko 	.raw_types = {
3229c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3230c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 20, 4),			/* [2] */
3231c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),	/* [3] */
3232c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(20, 0)),
3233c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(20, 20)),
3234c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3235c64779e2SAndrii Nakryiko 	},
3236c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3237c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3238c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3239c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3240c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3241c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3242c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3243c64779e2SAndrii Nakryiko 	.max_entries = 4,
3244c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3245c64779e2SAndrii Nakryiko 	.err_str = "Invalid member base type",
3246c64779e2SAndrii Nakryiko },
3247c64779e2SAndrii Nakryiko 
3248c64779e2SAndrii Nakryiko {
3249c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, base_type int not regular",
3250c64779e2SAndrii Nakryiko 	.raw_types = {
3251c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3252c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 12, 4),			/* [2] */
3253c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 4),	/* [3] */
3254c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(8, 0)),
3255c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(8, 8)),
3256c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3257c64779e2SAndrii Nakryiko 	},
3258c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3259c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3260c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3261c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3262c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3263c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3264c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3265c64779e2SAndrii Nakryiko 	.max_entries = 4,
3266c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3267c64779e2SAndrii Nakryiko 	.err_str = "Invalid member base type",
3268c64779e2SAndrii Nakryiko },
3269c64779e2SAndrii Nakryiko 
3270c64779e2SAndrii Nakryiko {
3271c64779e2SAndrii Nakryiko 	.descr = "invalid union, kind_flag, bitfield_size greater than struct size",
3272c64779e2SAndrii Nakryiko 	.raw_types = {
3273c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */
3274c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 1, 2), 2),	/* [2] */
3275c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(8, 0)),
3276c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 1, BTF_MEMBER_OFFSET(20, 0)),
3277c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3278c64779e2SAndrii Nakryiko 	},
3279c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3280c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3281c64779e2SAndrii Nakryiko 	.map_name = "union_type_check_btf",
3282c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3283c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3284c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3285c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3286c64779e2SAndrii Nakryiko 	.max_entries = 4,
3287c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3288c64779e2SAndrii Nakryiko 	.err_str = "Member exceeds struct_size",
3289c64779e2SAndrii Nakryiko },
3290c64779e2SAndrii Nakryiko 
3291c64779e2SAndrii Nakryiko {
3292c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, int member, bitfield_size = 0, wrong byte alignment",
3293c64779e2SAndrii Nakryiko 	.raw_types = {
3294c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3295c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [2] */
3296c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 12),	/* [3] */
3297c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3298c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 36)),
3299c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3300c64779e2SAndrii Nakryiko 	},
3301c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B"),
3302c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3303c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3304c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3305c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3306c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3307c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3308c64779e2SAndrii Nakryiko 	.max_entries = 4,
3309c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3310c64779e2SAndrii Nakryiko 	.err_str = "Invalid member offset",
3311c64779e2SAndrii Nakryiko },
3312c64779e2SAndrii Nakryiko 
3313c64779e2SAndrii Nakryiko {
3314c64779e2SAndrii Nakryiko 	.descr = "invalid struct, kind_flag, enum member, bitfield_size = 0, wrong byte alignment",
3315c64779e2SAndrii Nakryiko 	.raw_types = {
3316c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3317c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [2] */
3318c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),	/* [2] */
3319c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
3320c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 2), 12),	/* [3] */
3321c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3322c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 36)),
3323c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3324c64779e2SAndrii Nakryiko 	},
3325c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A\0B\0C"),
3326c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3327c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3328c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3329c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3330c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3331c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3332c64779e2SAndrii Nakryiko 	.max_entries = 4,
3333c64779e2SAndrii Nakryiko 	.btf_load_err = true,
3334c64779e2SAndrii Nakryiko 	.err_str = "Invalid member offset",
3335c64779e2SAndrii Nakryiko },
3336c64779e2SAndrii Nakryiko 
3337c64779e2SAndrii Nakryiko {
3338c64779e2SAndrii Nakryiko 	.descr = "128-bit int",
3339c64779e2SAndrii Nakryiko 	.raw_types = {
3340c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3341c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16),		/* [2] */
3342c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3343c64779e2SAndrii Nakryiko 	},
3344c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3345c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3346c64779e2SAndrii Nakryiko 	.map_name = "int_type_check_btf",
3347c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3348c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3349c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3350c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3351c64779e2SAndrii Nakryiko 	.max_entries = 4,
3352c64779e2SAndrii Nakryiko },
3353c64779e2SAndrii Nakryiko 
3354c64779e2SAndrii Nakryiko {
3355c64779e2SAndrii Nakryiko 	.descr = "struct, 128-bit int member",
3356c64779e2SAndrii Nakryiko 	.raw_types = {
3357c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3358c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16),		/* [2] */
3359c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 16),	/* [3] */
3360c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3361c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3362c64779e2SAndrii Nakryiko 	},
3363c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3364c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3365c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3366c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3367c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3368c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3369c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3370c64779e2SAndrii Nakryiko 	.max_entries = 4,
3371c64779e2SAndrii Nakryiko },
3372c64779e2SAndrii Nakryiko 
3373c64779e2SAndrii Nakryiko {
3374c64779e2SAndrii Nakryiko 	.descr = "struct, 120-bit int member bitfield",
3375c64779e2SAndrii Nakryiko 	.raw_types = {
3376c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3377c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 120, 16),		/* [2] */
3378c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 16),	/* [3] */
3379c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3380c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3381c64779e2SAndrii Nakryiko 	},
3382c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3383c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3384c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3385c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3386c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3387c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3388c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3389c64779e2SAndrii Nakryiko 	.max_entries = 4,
3390c64779e2SAndrii Nakryiko },
3391c64779e2SAndrii Nakryiko 
3392c64779e2SAndrii Nakryiko {
3393c64779e2SAndrii Nakryiko 	.descr = "struct, kind_flag, 128-bit int member",
3394c64779e2SAndrii Nakryiko 	.raw_types = {
3395c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3396c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16),		/* [2] */
3397c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 16),	/* [3] */
3398c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),
3399c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3400c64779e2SAndrii Nakryiko 	},
3401c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3402c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3403c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3404c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3405c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3406c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3407c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3408c64779e2SAndrii Nakryiko 	.max_entries = 4,
3409c64779e2SAndrii Nakryiko },
3410c64779e2SAndrii Nakryiko 
3411c64779e2SAndrii Nakryiko {
3412c64779e2SAndrii Nakryiko 	.descr = "struct, kind_flag, 120-bit int member bitfield",
3413c64779e2SAndrii Nakryiko 	.raw_types = {
3414c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
3415c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 128, 16),		/* [2] */
3416c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 16),	/* [3] */
3417c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(120, 0)),
3418c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3419c64779e2SAndrii Nakryiko 	},
3420c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0A"),
3421c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3422c64779e2SAndrii Nakryiko 	.map_name = "struct_type_check_btf",
3423c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3424c64779e2SAndrii Nakryiko 	.value_size = sizeof(int),
3425c64779e2SAndrii Nakryiko 	.key_type_id = 1,
3426c64779e2SAndrii Nakryiko 	.value_type_id = 1,
3427c64779e2SAndrii Nakryiko 	.max_entries = 4,
3428c64779e2SAndrii Nakryiko },
3429c64779e2SAndrii Nakryiko /*
3430c64779e2SAndrii Nakryiko  * typedef int arr_t[16];
3431c64779e2SAndrii Nakryiko  * struct s {
3432c64779e2SAndrii Nakryiko  *	arr_t *a;
3433c64779e2SAndrii Nakryiko  * };
3434c64779e2SAndrii Nakryiko  */
3435c64779e2SAndrii Nakryiko {
3436c64779e2SAndrii Nakryiko 	.descr = "struct->ptr->typedef->array->int size resolution",
3437c64779e2SAndrii Nakryiko 	.raw_types = {
3438c64779e2SAndrii Nakryiko 		BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [1] */
3439c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3440c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(3),					/* [2] */
3441c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
3442c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(5, 5, 16),			/* [4] */
3443c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [5] */
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 = "ptr_mod_chain_size_resolve_map",
3449c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3450c64779e2SAndrii Nakryiko 	.value_size = sizeof(int) * 16,
3451c64779e2SAndrii Nakryiko 	.key_type_id = 5 /* int */,
3452c64779e2SAndrii Nakryiko 	.value_type_id = 3 /* arr_t */,
3453c64779e2SAndrii Nakryiko 	.max_entries = 4,
3454c64779e2SAndrii Nakryiko },
3455c64779e2SAndrii Nakryiko /*
3456c64779e2SAndrii Nakryiko  * typedef int arr_t[16][8][4];
3457c64779e2SAndrii Nakryiko  * struct s {
3458c64779e2SAndrii Nakryiko  *	arr_t *a;
3459c64779e2SAndrii Nakryiko  * };
3460c64779e2SAndrii Nakryiko  */
3461c64779e2SAndrii Nakryiko {
3462c64779e2SAndrii Nakryiko 	.descr = "struct->ptr->typedef->multi-array->int size resolution",
3463c64779e2SAndrii Nakryiko 	.raw_types = {
3464c64779e2SAndrii Nakryiko 		BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [1] */
3465c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3466c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(3),					/* [2] */
3467c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
3468c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(5, 7, 16),			/* [4] */
3469c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(6, 7, 8),			/* [5] */
3470c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(7, 7, 4),			/* [6] */
3471c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [7] */
3472c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3473c64779e2SAndrii Nakryiko 	},
3474c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0s\0a\0arr_t"),
3475c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3476c64779e2SAndrii Nakryiko 	.map_name = "multi_arr_size_resolve_map",
3477c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3478c64779e2SAndrii Nakryiko 	.value_size = sizeof(int) * 16 * 8 * 4,
3479c64779e2SAndrii Nakryiko 	.key_type_id = 7 /* int */,
3480c64779e2SAndrii Nakryiko 	.value_type_id = 3 /* arr_t */,
3481c64779e2SAndrii Nakryiko 	.max_entries = 4,
3482c64779e2SAndrii Nakryiko },
3483c64779e2SAndrii Nakryiko /*
3484c64779e2SAndrii Nakryiko  * typedef int int_t;
3485c64779e2SAndrii Nakryiko  * typedef int_t arr3_t[4];
3486c64779e2SAndrii Nakryiko  * typedef arr3_t arr2_t[8];
3487c64779e2SAndrii Nakryiko  * typedef arr2_t arr1_t[16];
3488c64779e2SAndrii Nakryiko  * struct s {
3489c64779e2SAndrii Nakryiko  *	arr1_t *a;
3490c64779e2SAndrii Nakryiko  * };
3491c64779e2SAndrii Nakryiko  */
3492c64779e2SAndrii Nakryiko {
3493c64779e2SAndrii Nakryiko 	.descr = "typedef/multi-arr mix size resolution",
3494c64779e2SAndrii Nakryiko 	.raw_types = {
3495c64779e2SAndrii Nakryiko 		BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [1] */
3496c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
3497c64779e2SAndrii Nakryiko 		BTF_PTR_ENC(3),					/* [2] */
3498c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),			/* [3] */
3499c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(5, 10, 16),			/* [4] */
3500c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 6),			/* [5] */
3501c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(7, 10, 8),			/* [6] */
3502c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 8),			/* [7] */
3503c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(9, 10, 4),			/* [8] */
3504c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 10),			/* [9] */
3505c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [10] */
3506c64779e2SAndrii Nakryiko 		BTF_END_RAW,
3507c64779e2SAndrii Nakryiko 	},
3508c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0s\0a\0arr1_t\0arr2_t\0arr3_t\0int_t"),
3509c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
3510c64779e2SAndrii Nakryiko 	.map_name = "typedef_arra_mix_size_resolve_map",
3511c64779e2SAndrii Nakryiko 	.key_size = sizeof(int),
3512c64779e2SAndrii Nakryiko 	.value_size = sizeof(int) * 16 * 8 * 4,
3513c64779e2SAndrii Nakryiko 	.key_type_id = 10 /* int */,
3514c64779e2SAndrii Nakryiko 	.value_type_id = 3 /* arr_t */,
3515c64779e2SAndrii Nakryiko 	.max_entries = 4,
3516c64779e2SAndrii Nakryiko },
351713ca51d5SYonghong Song /*
351813ca51d5SYonghong Song  * elf .rodata section size 4 and btf .rodata section vlen 0.
351913ca51d5SYonghong Song  */
352013ca51d5SYonghong Song {
352113ca51d5SYonghong Song 	.descr = "datasec: vlen == 0",
352213ca51d5SYonghong Song 	.raw_types = {
352313ca51d5SYonghong Song 		/* int */
352413ca51d5SYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
352513ca51d5SYonghong Song 		/* .rodata section */
352613ca51d5SYonghong Song 		BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 0), 4),
352713ca51d5SYonghong Song 								 /* [2] */
352813ca51d5SYonghong Song 		BTF_END_RAW,
352913ca51d5SYonghong Song 	},
353013ca51d5SYonghong Song 	BTF_STR_SEC("\0.rodata"),
353113ca51d5SYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
353213ca51d5SYonghong Song 	.key_size = sizeof(int),
353313ca51d5SYonghong Song 	.value_size = sizeof(int),
353413ca51d5SYonghong Song 	.key_type_id = 1,
353513ca51d5SYonghong Song 	.value_type_id = 1,
353613ca51d5SYonghong Song 	.max_entries = 1,
353713ca51d5SYonghong Song },
3538c64779e2SAndrii Nakryiko 
35397e72aad3SIlya Leoshkevich {
35407e72aad3SIlya Leoshkevich 	.descr = "float test #1, well-formed",
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_FLOAT_ENC(NAME_TBD, 2),		/* [2] */
35457e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 4),		/* [3] */
35467e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 8),		/* [4] */
35477e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 12),		/* [5] */
35487e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 16),		/* [6] */
35497e72aad3SIlya Leoshkevich 		BTF_STRUCT_ENC(NAME_TBD, 5, 48),		/* [7] */
35507e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
35517e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 3, 32),
35527e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 4, 64),
35537e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 5, 128),
35547e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 6, 256),
35557e72aad3SIlya Leoshkevich 		BTF_END_RAW,
35567e72aad3SIlya Leoshkevich 	},
35577e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0_Float16\0float\0double\0_Float80\0long_double"
35587e72aad3SIlya Leoshkevich 		    "\0floats\0a\0b\0c\0d\0e"),
35597e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
35607e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
35617e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
35627e72aad3SIlya Leoshkevich 	.value_size = 48,
35637e72aad3SIlya Leoshkevich 	.key_type_id = 1,
35647e72aad3SIlya Leoshkevich 	.value_type_id = 7,
35657e72aad3SIlya Leoshkevich 	.max_entries = 1,
35667e72aad3SIlya Leoshkevich },
35677e72aad3SIlya Leoshkevich {
35687e72aad3SIlya Leoshkevich 	.descr = "float test #2, invalid vlen",
35697e72aad3SIlya Leoshkevich 	.raw_types = {
35707e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
35717e72aad3SIlya Leoshkevich 								/* [1] */
35727e72aad3SIlya Leoshkevich 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 1), 4),
35737e72aad3SIlya Leoshkevich 								/* [2] */
35747e72aad3SIlya Leoshkevich 		BTF_END_RAW,
35757e72aad3SIlya Leoshkevich 	},
35767e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float"),
35777e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
35787e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
35797e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
35807e72aad3SIlya Leoshkevich 	.value_size = 4,
35817e72aad3SIlya Leoshkevich 	.key_type_id = 1,
35827e72aad3SIlya Leoshkevich 	.value_type_id = 2,
35837e72aad3SIlya Leoshkevich 	.max_entries = 1,
35847e72aad3SIlya Leoshkevich 	.btf_load_err = true,
35857e72aad3SIlya Leoshkevich 	.err_str = "vlen != 0",
35867e72aad3SIlya Leoshkevich },
35877e72aad3SIlya Leoshkevich {
35887e72aad3SIlya Leoshkevich 	.descr = "float test #3, invalid kind_flag",
35897e72aad3SIlya Leoshkevich 	.raw_types = {
35907e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
35917e72aad3SIlya Leoshkevich 								/* [1] */
35927e72aad3SIlya Leoshkevich 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FLOAT, 1, 0), 4),
35937e72aad3SIlya Leoshkevich 								/* [2] */
35947e72aad3SIlya Leoshkevich 		BTF_END_RAW,
35957e72aad3SIlya Leoshkevich 	},
35967e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float"),
35977e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
35987e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
35997e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
36007e72aad3SIlya Leoshkevich 	.value_size = 4,
36017e72aad3SIlya Leoshkevich 	.key_type_id = 1,
36027e72aad3SIlya Leoshkevich 	.value_type_id = 2,
36037e72aad3SIlya Leoshkevich 	.max_entries = 1,
36047e72aad3SIlya Leoshkevich 	.btf_load_err = true,
36057e72aad3SIlya Leoshkevich 	.err_str = "Invalid btf_info kind_flag",
36067e72aad3SIlya Leoshkevich },
36077e72aad3SIlya Leoshkevich {
36087e72aad3SIlya Leoshkevich 	.descr = "float test #4, member does not fit",
36097e72aad3SIlya Leoshkevich 	.raw_types = {
36107e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
36117e72aad3SIlya Leoshkevich 								/* [1] */
36127e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 4),		/* [2] */
36137e72aad3SIlya Leoshkevich 		BTF_STRUCT_ENC(NAME_TBD, 1, 2),			/* [3] */
36147e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 2, 0),
36157e72aad3SIlya Leoshkevich 		BTF_END_RAW,
36167e72aad3SIlya Leoshkevich 	},
36177e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float\0floats\0x"),
36187e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
36197e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
36207e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
36217e72aad3SIlya Leoshkevich 	.value_size = 4,
36227e72aad3SIlya Leoshkevich 	.key_type_id = 1,
36237e72aad3SIlya Leoshkevich 	.value_type_id = 3,
36247e72aad3SIlya Leoshkevich 	.max_entries = 1,
36257e72aad3SIlya Leoshkevich 	.btf_load_err = true,
36267e72aad3SIlya Leoshkevich 	.err_str = "Member exceeds struct_size",
36277e72aad3SIlya Leoshkevich },
36287e72aad3SIlya Leoshkevich {
36297e72aad3SIlya Leoshkevich 	.descr = "float test #5, member is not properly aligned",
36307e72aad3SIlya Leoshkevich 	.raw_types = {
36317e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
36327e72aad3SIlya Leoshkevich 								/* [1] */
36337e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 4),		/* [2] */
36347e72aad3SIlya Leoshkevich 		BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [3] */
36357e72aad3SIlya Leoshkevich 		BTF_MEMBER_ENC(NAME_TBD, 2, 8),
36367e72aad3SIlya Leoshkevich 		BTF_END_RAW,
36377e72aad3SIlya Leoshkevich 	},
36387e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float\0floats\0x"),
36397e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
36407e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
36417e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
36427e72aad3SIlya Leoshkevich 	.value_size = 4,
36437e72aad3SIlya Leoshkevich 	.key_type_id = 1,
36447e72aad3SIlya Leoshkevich 	.value_type_id = 3,
36457e72aad3SIlya Leoshkevich 	.max_entries = 1,
36467e72aad3SIlya Leoshkevich 	.btf_load_err = true,
36477e72aad3SIlya Leoshkevich 	.err_str = "Member is not properly aligned",
36487e72aad3SIlya Leoshkevich },
36497e72aad3SIlya Leoshkevich {
36507e72aad3SIlya Leoshkevich 	.descr = "float test #6, invalid size",
36517e72aad3SIlya Leoshkevich 	.raw_types = {
36527e72aad3SIlya Leoshkevich 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
36537e72aad3SIlya Leoshkevich 								/* [1] */
36547e72aad3SIlya Leoshkevich 		BTF_TYPE_FLOAT_ENC(NAME_TBD, 6),		/* [2] */
36557e72aad3SIlya Leoshkevich 		BTF_END_RAW,
36567e72aad3SIlya Leoshkevich 	},
36577e72aad3SIlya Leoshkevich 	BTF_STR_SEC("\0int\0float"),
36587e72aad3SIlya Leoshkevich 	.map_type = BPF_MAP_TYPE_ARRAY,
36597e72aad3SIlya Leoshkevich 	.map_name = "float_type_check_btf",
36607e72aad3SIlya Leoshkevich 	.key_size = sizeof(int),
36617e72aad3SIlya Leoshkevich 	.value_size = 6,
36627e72aad3SIlya Leoshkevich 	.key_type_id = 1,
36637e72aad3SIlya Leoshkevich 	.value_type_id = 2,
36647e72aad3SIlya Leoshkevich 	.max_entries = 1,
36657e72aad3SIlya Leoshkevich 	.btf_load_err = true,
36667e72aad3SIlya Leoshkevich 	.err_str = "Invalid type_size",
36677e72aad3SIlya Leoshkevich },
36687e72aad3SIlya Leoshkevich 
366935baba7aSYonghong Song {
3670223f903eSYonghong Song 	.descr = "decl_tag test #1, struct/member, well-formed",
367135baba7aSYonghong Song 	.raw_types = {
367235baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
367335baba7aSYonghong Song 		BTF_STRUCT_ENC(0, 2, 8),			/* [2] */
367435baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
367535baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),
3676223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),
3677223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0),
3678223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 1),
367935baba7aSYonghong Song 		BTF_END_RAW,
368035baba7aSYonghong Song 	},
368135baba7aSYonghong Song 	BTF_STR_SEC("\0m1\0m2\0tag1\0tag2\0tag3"),
368235baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
368335baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
368435baba7aSYonghong Song 	.key_size = sizeof(int),
368535baba7aSYonghong Song 	.value_size = 8,
368635baba7aSYonghong Song 	.key_type_id = 1,
368735baba7aSYonghong Song 	.value_type_id = 2,
368835baba7aSYonghong Song 	.max_entries = 1,
368935baba7aSYonghong Song },
369035baba7aSYonghong Song {
3691223f903eSYonghong Song 	.descr = "decl_tag test #2, union/member, well-formed",
369235baba7aSYonghong Song 	.raw_types = {
369335baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
369435baba7aSYonghong Song 		BTF_UNION_ENC(NAME_TBD, 2, 4),			/* [2] */
369535baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
369635baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
3697223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),
3698223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0),
3699223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 1),
370035baba7aSYonghong Song 		BTF_END_RAW,
370135baba7aSYonghong Song 	},
370235baba7aSYonghong Song 	BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"),
370335baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
370435baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
370535baba7aSYonghong Song 	.key_size = sizeof(int),
370635baba7aSYonghong Song 	.value_size = 4,
370735baba7aSYonghong Song 	.key_type_id = 1,
370835baba7aSYonghong Song 	.value_type_id = 2,
370935baba7aSYonghong Song 	.max_entries = 1,
371035baba7aSYonghong Song },
371135baba7aSYonghong Song {
3712223f903eSYonghong Song 	.descr = "decl_tag test #3, variable, well-formed",
371335baba7aSYonghong Song 	.raw_types = {
371435baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
371535baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
371635baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 1),			/* [3] */
3717223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),
3718223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, -1),
371935baba7aSYonghong Song 		BTF_END_RAW,
372035baba7aSYonghong Song 	},
372135baba7aSYonghong Song 	BTF_STR_SEC("\0local\0global\0tag1\0tag2"),
372235baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
372335baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
372435baba7aSYonghong Song 	.key_size = sizeof(int),
372535baba7aSYonghong Song 	.value_size = 4,
372635baba7aSYonghong Song 	.key_type_id = 1,
372735baba7aSYonghong Song 	.value_type_id = 1,
372835baba7aSYonghong Song 	.max_entries = 1,
372935baba7aSYonghong Song },
373035baba7aSYonghong Song {
3731223f903eSYonghong Song 	.descr = "decl_tag test #4, func/parameter, well-formed",
373235baba7aSYonghong Song 	.raw_types = {
373335baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
373435baba7aSYonghong Song 		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
373535baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
373635baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
373735baba7aSYonghong Song 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
3738223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, -1),
3739223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, 0),
3740223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, 1),
374135baba7aSYonghong Song 		BTF_END_RAW,
374235baba7aSYonghong Song 	},
374335baba7aSYonghong Song 	BTF_STR_SEC("\0arg1\0arg2\0f\0tag1\0tag2\0tag3"),
374435baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
374535baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
374635baba7aSYonghong Song 	.key_size = sizeof(int),
374735baba7aSYonghong Song 	.value_size = 4,
374835baba7aSYonghong Song 	.key_type_id = 1,
374935baba7aSYonghong Song 	.value_type_id = 1,
375035baba7aSYonghong Song 	.max_entries = 1,
375135baba7aSYonghong Song },
375235baba7aSYonghong Song {
3753223f903eSYonghong Song 	.descr = "decl_tag test #5, invalid value",
375435baba7aSYonghong Song 	.raw_types = {
375535baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
375635baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
3757223f903eSYonghong Song 		BTF_DECL_TAG_ENC(0, 2, -1),
375835baba7aSYonghong Song 		BTF_END_RAW,
375935baba7aSYonghong Song 	},
376035baba7aSYonghong Song 	BTF_STR_SEC("\0local\0tag"),
376135baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
376235baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
376335baba7aSYonghong Song 	.key_size = sizeof(int),
376435baba7aSYonghong Song 	.value_size = 4,
376535baba7aSYonghong Song 	.key_type_id = 1,
376635baba7aSYonghong Song 	.value_type_id = 1,
376735baba7aSYonghong Song 	.max_entries = 1,
376835baba7aSYonghong Song 	.btf_load_err = true,
376935baba7aSYonghong Song 	.err_str = "Invalid value",
377035baba7aSYonghong Song },
377135baba7aSYonghong Song {
3772223f903eSYonghong Song 	.descr = "decl_tag test #6, invalid target type",
377335baba7aSYonghong Song 	.raw_types = {
377435baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
3775223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 1, -1),
377635baba7aSYonghong Song 		BTF_END_RAW,
377735baba7aSYonghong Song 	},
377835baba7aSYonghong Song 	BTF_STR_SEC("\0tag1"),
377935baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
378035baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
378135baba7aSYonghong Song 	.key_size = sizeof(int),
378235baba7aSYonghong Song 	.value_size = 4,
378335baba7aSYonghong Song 	.key_type_id = 1,
378435baba7aSYonghong Song 	.value_type_id = 1,
378535baba7aSYonghong Song 	.max_entries = 1,
378635baba7aSYonghong Song 	.btf_load_err = true,
378735baba7aSYonghong Song 	.err_str = "Invalid type",
378835baba7aSYonghong Song },
378935baba7aSYonghong Song {
3790223f903eSYonghong Song 	.descr = "decl_tag test #7, invalid vlen",
379135baba7aSYonghong Song 	.raw_types = {
379235baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
379335baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
3794223f903eSYonghong Song 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 1), 2), (0),
379535baba7aSYonghong Song 		BTF_END_RAW,
379635baba7aSYonghong Song 	},
379735baba7aSYonghong Song 	BTF_STR_SEC("\0local\0tag1"),
379835baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
379935baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
380035baba7aSYonghong Song 	.key_size = sizeof(int),
380135baba7aSYonghong Song 	.value_size = 4,
380235baba7aSYonghong Song 	.key_type_id = 1,
380335baba7aSYonghong Song 	.value_type_id = 1,
380435baba7aSYonghong Song 	.max_entries = 1,
380535baba7aSYonghong Song 	.btf_load_err = true,
380635baba7aSYonghong Song 	.err_str = "vlen != 0",
380735baba7aSYonghong Song },
380835baba7aSYonghong Song {
3809223f903eSYonghong Song 	.descr = "decl_tag test #8, invalid kflag",
381035baba7aSYonghong Song 	.raw_types = {
381135baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
381235baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
3813223f903eSYonghong Song 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 1, 0), 2), (-1),
381435baba7aSYonghong Song 		BTF_END_RAW,
381535baba7aSYonghong Song 	},
381635baba7aSYonghong Song 	BTF_STR_SEC("\0local\0tag1"),
381735baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
381835baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
381935baba7aSYonghong Song 	.key_size = sizeof(int),
382035baba7aSYonghong Song 	.value_size = 4,
382135baba7aSYonghong Song 	.key_type_id = 1,
382235baba7aSYonghong Song 	.value_type_id = 1,
382335baba7aSYonghong Song 	.max_entries = 1,
382435baba7aSYonghong Song 	.btf_load_err = true,
382535baba7aSYonghong Song 	.err_str = "Invalid btf_info kind_flag",
382635baba7aSYonghong Song },
382735baba7aSYonghong Song {
3828223f903eSYonghong Song 	.descr = "decl_tag test #9, var, invalid component_idx",
382935baba7aSYonghong Song 	.raw_types = {
383035baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
383135baba7aSYonghong Song 		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */
3832223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0),
383335baba7aSYonghong Song 		BTF_END_RAW,
383435baba7aSYonghong Song 	},
383535baba7aSYonghong Song 	BTF_STR_SEC("\0local\0tag"),
383635baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
383735baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
383835baba7aSYonghong Song 	.key_size = sizeof(int),
383935baba7aSYonghong Song 	.value_size = 4,
384035baba7aSYonghong Song 	.key_type_id = 1,
384135baba7aSYonghong Song 	.value_type_id = 1,
384235baba7aSYonghong Song 	.max_entries = 1,
384335baba7aSYonghong Song 	.btf_load_err = true,
384435baba7aSYonghong Song 	.err_str = "Invalid component_idx",
384535baba7aSYonghong Song },
384635baba7aSYonghong Song {
3847223f903eSYonghong Song 	.descr = "decl_tag test #10, struct member, invalid component_idx",
384835baba7aSYonghong Song 	.raw_types = {
384935baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
385035baba7aSYonghong Song 		BTF_STRUCT_ENC(0, 2, 8),			/* [2] */
385135baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
385235baba7aSYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),
3853223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 2),
385435baba7aSYonghong Song 		BTF_END_RAW,
385535baba7aSYonghong Song 	},
385635baba7aSYonghong Song 	BTF_STR_SEC("\0m1\0m2\0tag"),
385735baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
385835baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
385935baba7aSYonghong Song 	.key_size = sizeof(int),
386035baba7aSYonghong Song 	.value_size = 8,
386135baba7aSYonghong Song 	.key_type_id = 1,
386235baba7aSYonghong Song 	.value_type_id = 2,
386335baba7aSYonghong Song 	.max_entries = 1,
386435baba7aSYonghong Song 	.btf_load_err = true,
386535baba7aSYonghong Song 	.err_str = "Invalid component_idx",
386635baba7aSYonghong Song },
386735baba7aSYonghong Song {
3868223f903eSYonghong Song 	.descr = "decl_tag test #11, func parameter, invalid component_idx",
386935baba7aSYonghong Song 	.raw_types = {
387035baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
387135baba7aSYonghong Song 		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
387235baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
387335baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
387435baba7aSYonghong Song 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
3875223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, 2),
387635baba7aSYonghong Song 		BTF_END_RAW,
387735baba7aSYonghong Song 	},
387835baba7aSYonghong Song 	BTF_STR_SEC("\0arg1\0arg2\0f\0tag"),
387935baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
388035baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
388135baba7aSYonghong Song 	.key_size = sizeof(int),
388235baba7aSYonghong Song 	.value_size = 4,
388335baba7aSYonghong Song 	.key_type_id = 1,
388435baba7aSYonghong Song 	.value_type_id = 1,
388535baba7aSYonghong Song 	.max_entries = 1,
388635baba7aSYonghong Song 	.btf_load_err = true,
388735baba7aSYonghong Song 	.err_str = "Invalid component_idx",
388835baba7aSYonghong Song },
388935baba7aSYonghong Song {
3890223f903eSYonghong Song 	.descr = "decl_tag test #12, < -1 component_idx",
389135baba7aSYonghong Song 	.raw_types = {
389235baba7aSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
389335baba7aSYonghong Song 		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
389435baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
389535baba7aSYonghong Song 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
389635baba7aSYonghong Song 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
3897223f903eSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, -2),
389835baba7aSYonghong Song 		BTF_END_RAW,
389935baba7aSYonghong Song 	},
390035baba7aSYonghong Song 	BTF_STR_SEC("\0arg1\0arg2\0f\0tag"),
390135baba7aSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
390235baba7aSYonghong Song 	.map_name = "tag_type_check_btf",
390335baba7aSYonghong Song 	.key_size = sizeof(int),
390435baba7aSYonghong Song 	.value_size = 4,
390535baba7aSYonghong Song 	.key_type_id = 1,
390635baba7aSYonghong Song 	.value_type_id = 1,
390735baba7aSYonghong Song 	.max_entries = 1,
390835baba7aSYonghong Song 	.btf_load_err = true,
390935baba7aSYonghong Song 	.err_str = "Invalid component_idx",
391035baba7aSYonghong Song },
39119d19a12bSYonghong Song {
39129d19a12bSYonghong Song 	.descr = "decl_tag test #13, typedef, well-formed",
39139d19a12bSYonghong Song 	.raw_types = {
39149d19a12bSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
39159d19a12bSYonghong Song 		BTF_TYPEDEF_ENC(NAME_TBD, 1),			/* [2] */
39169d19a12bSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),
39179d19a12bSYonghong Song 		BTF_END_RAW,
39189d19a12bSYonghong Song 	},
39199d19a12bSYonghong Song 	BTF_STR_SEC("\0t\0tag"),
39209d19a12bSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
39219d19a12bSYonghong Song 	.map_name = "tag_type_check_btf",
39229d19a12bSYonghong Song 	.key_size = sizeof(int),
39239d19a12bSYonghong Song 	.value_size = 4,
39249d19a12bSYonghong Song 	.key_type_id = 1,
39259d19a12bSYonghong Song 	.value_type_id = 1,
39269d19a12bSYonghong Song 	.max_entries = 1,
39279d19a12bSYonghong Song },
39289d19a12bSYonghong Song {
39299d19a12bSYonghong Song 	.descr = "decl_tag test #14, typedef, invalid component_idx",
39309d19a12bSYonghong Song 	.raw_types = {
39319d19a12bSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
39329d19a12bSYonghong Song 		BTF_TYPEDEF_ENC(NAME_TBD, 1),			/* [2] */
39339d19a12bSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0),
39349d19a12bSYonghong Song 		BTF_END_RAW,
39359d19a12bSYonghong Song 	},
39369d19a12bSYonghong Song 	BTF_STR_SEC("\0local\0tag"),
39379d19a12bSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
39389d19a12bSYonghong Song 	.map_name = "tag_type_check_btf",
39399d19a12bSYonghong Song 	.key_size = sizeof(int),
39409d19a12bSYonghong Song 	.value_size = 4,
39419d19a12bSYonghong Song 	.key_type_id = 1,
39429d19a12bSYonghong Song 	.value_type_id = 1,
39439d19a12bSYonghong Song 	.max_entries = 1,
39449d19a12bSYonghong Song 	.btf_load_err = true,
39459d19a12bSYonghong Song 	.err_str = "Invalid component_idx",
39469d19a12bSYonghong Song },
39476aa5dabcSYonghong Song {
3948cf1a4cbcSYonghong Song 	.descr = "decl_tag test #15, func, invalid func proto",
3949cf1a4cbcSYonghong Song 	.raw_types = {
3950cf1a4cbcSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
3951cf1a4cbcSYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 3, 0),		/* [2] */
3952cf1a4cbcSYonghong Song 		BTF_FUNC_ENC(NAME_TBD, 8),			/* [3] */
3953cf1a4cbcSYonghong Song 		BTF_END_RAW,
3954cf1a4cbcSYonghong Song 	},
3955cf1a4cbcSYonghong Song 	BTF_STR_SEC("\0tag\0func"),
3956cf1a4cbcSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
3957cf1a4cbcSYonghong Song 	.map_name = "tag_type_check_btf",
3958cf1a4cbcSYonghong Song 	.key_size = sizeof(int),
3959cf1a4cbcSYonghong Song 	.value_size = 4,
3960cf1a4cbcSYonghong Song 	.key_type_id = 1,
3961cf1a4cbcSYonghong Song 	.value_type_id = 1,
3962cf1a4cbcSYonghong Song 	.max_entries = 1,
3963cf1a4cbcSYonghong Song 	.btf_load_err = true,
3964cf1a4cbcSYonghong Song 	.err_str = "Invalid type_id",
3965cf1a4cbcSYonghong Song },
3966cf1a4cbcSYonghong Song {
396735cc9d62SStanislav Fomichev 	.descr = "decl_tag test #16, func proto, return type",
396835cc9d62SStanislav Fomichev 	.raw_types = {
396935cc9d62SStanislav Fomichev 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),				/* [1] */
397035cc9d62SStanislav Fomichev 		BTF_VAR_ENC(NAME_TBD, 1, 0),						/* [2] */
397135cc9d62SStanislav Fomichev 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 0), 2), (-1),	/* [3] */
397235cc9d62SStanislav Fomichev 		BTF_FUNC_PROTO_ENC(3, 0),						/* [4] */
397335cc9d62SStanislav Fomichev 		BTF_END_RAW,
397435cc9d62SStanislav Fomichev 	},
397535cc9d62SStanislav Fomichev 	BTF_STR_SEC("\0local\0tag1"),
397635cc9d62SStanislav Fomichev 	.btf_load_err = true,
397735cc9d62SStanislav Fomichev 	.err_str = "Invalid return type",
397835cc9d62SStanislav Fomichev },
397935cc9d62SStanislav Fomichev {
39808e898aaaSStanislav Fomichev 	.descr = "decl_tag test #17, func proto, argument",
39818e898aaaSStanislav Fomichev 	.raw_types = {
39828e898aaaSStanislav Fomichev 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 0), 4), (-1),	/* [1] */
39838e898aaaSStanislav Fomichev 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 0), /* [2] */
39848e898aaaSStanislav Fomichev 		BTF_FUNC_PROTO_ENC(0, 1),			/* [3] */
39858e898aaaSStanislav Fomichev 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
39868e898aaaSStanislav Fomichev 		BTF_VAR_ENC(NAME_TBD, 2, 0),			/* [4] */
39878e898aaaSStanislav Fomichev 		BTF_END_RAW,
39888e898aaaSStanislav Fomichev 	},
39898e898aaaSStanislav Fomichev 	BTF_STR_SEC("\0local\0tag1\0var"),
39908e898aaaSStanislav Fomichev 	.btf_load_err = true,
39918e898aaaSStanislav Fomichev 	.err_str = "Invalid arg#1",
39928e898aaaSStanislav Fomichev },
39938e898aaaSStanislav Fomichev {
3994e38096d9SYonghong Song 	.descr = "decl_tag test #18, decl_tag as the map key type",
3995e38096d9SYonghong Song 	.raw_types = {
3996e38096d9SYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
3997e38096d9SYonghong Song 		BTF_STRUCT_ENC(0, 2, 8),			/* [2] */
3998e38096d9SYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
3999e38096d9SYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),
4000e38096d9SYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),		/* [3] */
4001e38096d9SYonghong Song 		BTF_END_RAW,
4002e38096d9SYonghong Song 	},
4003e38096d9SYonghong Song 	BTF_STR_SEC("\0m1\0m2\0tag"),
4004e38096d9SYonghong Song 	.map_type = BPF_MAP_TYPE_HASH,
4005e38096d9SYonghong Song 	.map_name = "tag_type_check_btf",
4006e38096d9SYonghong Song 	.key_size = 8,
4007e38096d9SYonghong Song 	.value_size = 4,
4008e38096d9SYonghong Song 	.key_type_id = 3,
4009e38096d9SYonghong Song 	.value_type_id = 1,
4010e38096d9SYonghong Song 	.max_entries = 1,
4011e38096d9SYonghong Song 	.map_create_err = true,
4012e38096d9SYonghong Song },
4013e38096d9SYonghong Song {
4014e38096d9SYonghong Song 	.descr = "decl_tag test #19, decl_tag as the map value type",
4015e38096d9SYonghong Song 	.raw_types = {
4016e38096d9SYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
4017e38096d9SYonghong Song 		BTF_STRUCT_ENC(0, 2, 8),			/* [2] */
4018e38096d9SYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 0),
4019e38096d9SYonghong Song 		BTF_MEMBER_ENC(NAME_TBD, 1, 32),
4020e38096d9SYonghong Song 		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1),		/* [3] */
4021e38096d9SYonghong Song 		BTF_END_RAW,
4022e38096d9SYonghong Song 	},
4023e38096d9SYonghong Song 	BTF_STR_SEC("\0m1\0m2\0tag"),
4024e38096d9SYonghong Song 	.map_type = BPF_MAP_TYPE_HASH,
4025e38096d9SYonghong Song 	.map_name = "tag_type_check_btf",
4026e38096d9SYonghong Song 	.key_size = 4,
4027e38096d9SYonghong Song 	.value_size = 8,
4028e38096d9SYonghong Song 	.key_type_id = 1,
4029e38096d9SYonghong Song 	.value_type_id = 3,
4030e38096d9SYonghong Song 	.max_entries = 1,
4031e38096d9SYonghong Song 	.map_create_err = true,
4032e38096d9SYonghong Song },
4033e38096d9SYonghong Song {
40346aa5dabcSYonghong Song 	.descr = "type_tag test #1",
40356aa5dabcSYonghong Song 	.raw_types = {
40366aa5dabcSYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
40376aa5dabcSYonghong Song 		BTF_TYPE_TAG_ENC(NAME_TBD, 1),			/* [2] */
40386aa5dabcSYonghong Song 		BTF_PTR_ENC(2),					/* [3] */
40396aa5dabcSYonghong Song 		BTF_END_RAW,
40406aa5dabcSYonghong Song 	},
40416aa5dabcSYonghong Song 	BTF_STR_SEC("\0tag"),
40426aa5dabcSYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
40436aa5dabcSYonghong Song 	.map_name = "tag_type_check_btf",
40446aa5dabcSYonghong Song 	.key_size = sizeof(int),
40456aa5dabcSYonghong Song 	.value_size = 4,
40466aa5dabcSYonghong Song 	.key_type_id = 1,
40476aa5dabcSYonghong Song 	.value_type_id = 1,
40486aa5dabcSYonghong Song 	.max_entries = 1,
40496aa5dabcSYonghong Song },
405024fe983aSKumar Kartikeya Dwivedi {
405124fe983aSKumar Kartikeya Dwivedi 	.descr = "type_tag test #2, type tag order",
405224fe983aSKumar Kartikeya Dwivedi 	.raw_types = {
405324fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
405424fe983aSKumar Kartikeya Dwivedi 		BTF_CONST_ENC(3),				/* [2] */
405524fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_TAG_ENC(NAME_TBD, 1),			/* [3] */
405624fe983aSKumar Kartikeya Dwivedi 		BTF_END_RAW,
405724fe983aSKumar Kartikeya Dwivedi 	},
405824fe983aSKumar Kartikeya Dwivedi 	BTF_STR_SEC("\0tag"),
405924fe983aSKumar Kartikeya Dwivedi 	.map_type = BPF_MAP_TYPE_ARRAY,
406024fe983aSKumar Kartikeya Dwivedi 	.map_name = "tag_type_check_btf",
406124fe983aSKumar Kartikeya Dwivedi 	.key_size = sizeof(int),
406224fe983aSKumar Kartikeya Dwivedi 	.value_size = 4,
406324fe983aSKumar Kartikeya Dwivedi 	.key_type_id = 1,
406424fe983aSKumar Kartikeya Dwivedi 	.value_type_id = 1,
406524fe983aSKumar Kartikeya Dwivedi 	.max_entries = 1,
406624fe983aSKumar Kartikeya Dwivedi 	.btf_load_err = true,
406724fe983aSKumar Kartikeya Dwivedi 	.err_str = "Type tags don't precede modifiers",
406824fe983aSKumar Kartikeya Dwivedi },
406924fe983aSKumar Kartikeya Dwivedi {
407024fe983aSKumar Kartikeya Dwivedi 	.descr = "type_tag test #3, type tag order",
407124fe983aSKumar Kartikeya Dwivedi 	.raw_types = {
407224fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
407324fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_TAG_ENC(NAME_TBD, 3),			/* [2] */
407424fe983aSKumar Kartikeya Dwivedi 		BTF_CONST_ENC(4),				/* [3] */
407524fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_TAG_ENC(NAME_TBD, 1),			/* [4] */
407624fe983aSKumar Kartikeya Dwivedi 		BTF_END_RAW,
407724fe983aSKumar Kartikeya Dwivedi 	},
407824fe983aSKumar Kartikeya Dwivedi 	BTF_STR_SEC("\0tag\0tag"),
407924fe983aSKumar Kartikeya Dwivedi 	.map_type = BPF_MAP_TYPE_ARRAY,
408024fe983aSKumar Kartikeya Dwivedi 	.map_name = "tag_type_check_btf",
408124fe983aSKumar Kartikeya Dwivedi 	.key_size = sizeof(int),
408224fe983aSKumar Kartikeya Dwivedi 	.value_size = 4,
408324fe983aSKumar Kartikeya Dwivedi 	.key_type_id = 1,
408424fe983aSKumar Kartikeya Dwivedi 	.value_type_id = 1,
408524fe983aSKumar Kartikeya Dwivedi 	.max_entries = 1,
408624fe983aSKumar Kartikeya Dwivedi 	.btf_load_err = true,
408724fe983aSKumar Kartikeya Dwivedi 	.err_str = "Type tags don't precede modifiers",
408824fe983aSKumar Kartikeya Dwivedi },
408924fe983aSKumar Kartikeya Dwivedi {
409024fe983aSKumar Kartikeya Dwivedi 	.descr = "type_tag test #4, type tag order",
409124fe983aSKumar Kartikeya Dwivedi 	.raw_types = {
409224fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
409324fe983aSKumar Kartikeya Dwivedi 		BTF_TYPEDEF_ENC(NAME_TBD, 3),			/* [2] */
409424fe983aSKumar Kartikeya Dwivedi 		BTF_CONST_ENC(4),				/* [3] */
409524fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_TAG_ENC(NAME_TBD, 1),			/* [4] */
409624fe983aSKumar Kartikeya Dwivedi 		BTF_END_RAW,
409724fe983aSKumar Kartikeya Dwivedi 	},
409824fe983aSKumar Kartikeya Dwivedi 	BTF_STR_SEC("\0tag\0tag"),
409924fe983aSKumar Kartikeya Dwivedi 	.map_type = BPF_MAP_TYPE_ARRAY,
410024fe983aSKumar Kartikeya Dwivedi 	.map_name = "tag_type_check_btf",
410124fe983aSKumar Kartikeya Dwivedi 	.key_size = sizeof(int),
410224fe983aSKumar Kartikeya Dwivedi 	.value_size = 4,
410324fe983aSKumar Kartikeya Dwivedi 	.key_type_id = 1,
410424fe983aSKumar Kartikeya Dwivedi 	.value_type_id = 1,
410524fe983aSKumar Kartikeya Dwivedi 	.max_entries = 1,
410624fe983aSKumar Kartikeya Dwivedi 	.btf_load_err = true,
410724fe983aSKumar Kartikeya Dwivedi 	.err_str = "Type tags don't precede modifiers",
410824fe983aSKumar Kartikeya Dwivedi },
410924fe983aSKumar Kartikeya Dwivedi {
411024fe983aSKumar Kartikeya Dwivedi 	.descr = "type_tag test #5, type tag order",
411124fe983aSKumar Kartikeya Dwivedi 	.raw_types = {
411224fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
411324fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_TAG_ENC(NAME_TBD, 3),			/* [2] */
411424fe983aSKumar Kartikeya Dwivedi 		BTF_CONST_ENC(1),				/* [3] */
411524fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_TAG_ENC(NAME_TBD, 2),			/* [4] */
411624fe983aSKumar Kartikeya Dwivedi 		BTF_END_RAW,
411724fe983aSKumar Kartikeya Dwivedi 	},
411824fe983aSKumar Kartikeya Dwivedi 	BTF_STR_SEC("\0tag\0tag"),
411924fe983aSKumar Kartikeya Dwivedi 	.map_type = BPF_MAP_TYPE_ARRAY,
412024fe983aSKumar Kartikeya Dwivedi 	.map_name = "tag_type_check_btf",
412124fe983aSKumar Kartikeya Dwivedi 	.key_size = sizeof(int),
412224fe983aSKumar Kartikeya Dwivedi 	.value_size = 4,
412324fe983aSKumar Kartikeya Dwivedi 	.key_type_id = 1,
412424fe983aSKumar Kartikeya Dwivedi 	.value_type_id = 1,
412524fe983aSKumar Kartikeya Dwivedi 	.max_entries = 1,
412624fe983aSKumar Kartikeya Dwivedi },
412724fe983aSKumar Kartikeya Dwivedi {
412824fe983aSKumar Kartikeya Dwivedi 	.descr = "type_tag test #6, type tag order",
412924fe983aSKumar Kartikeya Dwivedi 	.raw_types = {
413024fe983aSKumar Kartikeya Dwivedi 		BTF_PTR_ENC(2),					/* [1] */
413124fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_TAG_ENC(NAME_TBD, 3),			/* [2] */
413224fe983aSKumar Kartikeya Dwivedi 		BTF_CONST_ENC(4),				/* [3] */
413324fe983aSKumar Kartikeya Dwivedi 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),  /* [4] */
413424fe983aSKumar Kartikeya Dwivedi 		BTF_PTR_ENC(6),					/* [5] */
413524fe983aSKumar Kartikeya Dwivedi 		BTF_CONST_ENC(2),				/* [6] */
413624fe983aSKumar Kartikeya Dwivedi 		BTF_END_RAW,
413724fe983aSKumar Kartikeya Dwivedi 	},
413824fe983aSKumar Kartikeya Dwivedi 	BTF_STR_SEC("\0tag"),
413924fe983aSKumar Kartikeya Dwivedi 	.map_type = BPF_MAP_TYPE_ARRAY,
414024fe983aSKumar Kartikeya Dwivedi 	.map_name = "tag_type_check_btf",
414124fe983aSKumar Kartikeya Dwivedi 	.key_size = sizeof(int),
414224fe983aSKumar Kartikeya Dwivedi 	.value_size = 4,
414324fe983aSKumar Kartikeya Dwivedi 	.key_type_id = 1,
414424fe983aSKumar Kartikeya Dwivedi 	.value_type_id = 1,
414524fe983aSKumar Kartikeya Dwivedi 	.max_entries = 1,
414624fe983aSKumar Kartikeya Dwivedi 	.btf_load_err = true,
414724fe983aSKumar Kartikeya Dwivedi 	.err_str = "Type tags don't precede modifiers",
414824fe983aSKumar Kartikeya Dwivedi },
41493b532518SYonghong Song {
41503b532518SYonghong Song 	.descr = "enum64 test #1, unsigned, size 8",
41513b532518SYonghong Song 	.raw_types = {
41523b532518SYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
41533b532518SYonghong Song 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8),	/* [2] */
41543b532518SYonghong Song 		BTF_ENUM64_ENC(NAME_TBD, 0, 0),
41553b532518SYonghong Song 		BTF_ENUM64_ENC(NAME_TBD, 1, 1),
41563b532518SYonghong Song 		BTF_END_RAW,
41573b532518SYonghong Song 	},
41583b532518SYonghong Song 	BTF_STR_SEC("\0a\0b\0c"),
41593b532518SYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
41603b532518SYonghong Song 	.map_name = "tag_type_check_btf",
41613b532518SYonghong Song 	.key_size = sizeof(int),
41623b532518SYonghong Song 	.value_size = 8,
41633b532518SYonghong Song 	.key_type_id = 1,
41643b532518SYonghong Song 	.value_type_id = 2,
41653b532518SYonghong Song 	.max_entries = 1,
41663b532518SYonghong Song },
41673b532518SYonghong Song {
41683b532518SYonghong Song 	.descr = "enum64 test #2, signed, size 4",
41693b532518SYonghong Song 	.raw_types = {
41703b532518SYonghong Song 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */
41713b532518SYonghong Song 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 1, 2), 4),	/* [2] */
41723b532518SYonghong Song 		BTF_ENUM64_ENC(NAME_TBD, -1, 0),
41733b532518SYonghong Song 		BTF_ENUM64_ENC(NAME_TBD, 1, 0),
41743b532518SYonghong Song 		BTF_END_RAW,
41753b532518SYonghong Song 	},
41763b532518SYonghong Song 	BTF_STR_SEC("\0a\0b\0c"),
41773b532518SYonghong Song 	.map_type = BPF_MAP_TYPE_ARRAY,
41783b532518SYonghong Song 	.map_name = "tag_type_check_btf",
41793b532518SYonghong Song 	.key_size = sizeof(int),
41803b532518SYonghong Song 	.value_size = 4,
41813b532518SYonghong Song 	.key_type_id = 1,
41823b532518SYonghong Song 	.value_type_id = 2,
41833b532518SYonghong Song 	.max_entries = 1,
41843b532518SYonghong Song },
418535baba7aSYonghong Song 
4186c64779e2SAndrii Nakryiko }; /* struct btf_raw_test raw_tests[] */
4187c64779e2SAndrii Nakryiko 
get_next_str(const char * start,const char * end)4188c64779e2SAndrii Nakryiko static const char *get_next_str(const char *start, const char *end)
4189c64779e2SAndrii Nakryiko {
4190c64779e2SAndrii Nakryiko 	return start < end - 1 ? start + 1 : NULL;
4191c64779e2SAndrii Nakryiko }
4192c64779e2SAndrii Nakryiko 
get_raw_sec_size(const __u32 * raw_types)4193c64779e2SAndrii Nakryiko static int get_raw_sec_size(const __u32 *raw_types)
4194c64779e2SAndrii Nakryiko {
4195c64779e2SAndrii Nakryiko 	int i;
4196c64779e2SAndrii Nakryiko 
4197c64779e2SAndrii Nakryiko 	for (i = MAX_NR_RAW_U32 - 1;
4198c64779e2SAndrii Nakryiko 	     i >= 0 && raw_types[i] != BTF_END_RAW;
4199c64779e2SAndrii Nakryiko 	     i--)
4200c64779e2SAndrii Nakryiko 		;
4201c64779e2SAndrii Nakryiko 
4202c64779e2SAndrii Nakryiko 	return i < 0 ? i : i * sizeof(raw_types[0]);
4203c64779e2SAndrii Nakryiko }
4204c64779e2SAndrii Nakryiko 
btf_raw_create(const struct btf_header * hdr,const __u32 * raw_types,const char * str,unsigned int str_sec_size,unsigned int * btf_size,const char ** ret_next_str)4205c64779e2SAndrii Nakryiko static void *btf_raw_create(const struct btf_header *hdr,
4206c64779e2SAndrii Nakryiko 			    const __u32 *raw_types,
4207c64779e2SAndrii Nakryiko 			    const char *str,
4208c64779e2SAndrii Nakryiko 			    unsigned int str_sec_size,
4209c64779e2SAndrii Nakryiko 			    unsigned int *btf_size,
4210c64779e2SAndrii Nakryiko 			    const char **ret_next_str)
4211c64779e2SAndrii Nakryiko {
4212c64779e2SAndrii Nakryiko 	const char *next_str = str, *end_str = str + str_sec_size;
4213c64779e2SAndrii Nakryiko 	const char **strs_idx = NULL, **tmp_strs_idx;
4214c64779e2SAndrii Nakryiko 	int strs_cap = 0, strs_cnt = 0, next_str_idx = 0;
4215c64779e2SAndrii Nakryiko 	unsigned int size_needed, offset;
4216c64779e2SAndrii Nakryiko 	struct btf_header *ret_hdr;
4217c64779e2SAndrii Nakryiko 	int i, type_sec_size, err = 0;
4218c64779e2SAndrii Nakryiko 	uint32_t *ret_types;
4219c64779e2SAndrii Nakryiko 	void *raw_btf = NULL;
4220c64779e2SAndrii Nakryiko 
4221c64779e2SAndrii Nakryiko 	type_sec_size = get_raw_sec_size(raw_types);
4222c64779e2SAndrii Nakryiko 	if (CHECK(type_sec_size < 0, "Cannot get nr_raw_types"))
4223c64779e2SAndrii Nakryiko 		return NULL;
4224c64779e2SAndrii Nakryiko 
4225c64779e2SAndrii Nakryiko 	size_needed = sizeof(*hdr) + type_sec_size + str_sec_size;
4226c64779e2SAndrii Nakryiko 	raw_btf = malloc(size_needed);
4227c64779e2SAndrii Nakryiko 	if (CHECK(!raw_btf, "Cannot allocate memory for raw_btf"))
4228c64779e2SAndrii Nakryiko 		return NULL;
4229c64779e2SAndrii Nakryiko 
4230c64779e2SAndrii Nakryiko 	/* Copy header */
4231c64779e2SAndrii Nakryiko 	memcpy(raw_btf, hdr, sizeof(*hdr));
4232c64779e2SAndrii Nakryiko 	offset = sizeof(*hdr);
4233c64779e2SAndrii Nakryiko 
4234c64779e2SAndrii Nakryiko 	/* Index strings */
4235c64779e2SAndrii Nakryiko 	while ((next_str = get_next_str(next_str, end_str))) {
4236c64779e2SAndrii Nakryiko 		if (strs_cnt == strs_cap) {
4237c64779e2SAndrii Nakryiko 			strs_cap += max(16, strs_cap / 2);
4238c64779e2SAndrii Nakryiko 			tmp_strs_idx = realloc(strs_idx,
4239c64779e2SAndrii Nakryiko 					       sizeof(*strs_idx) * strs_cap);
4240c64779e2SAndrii Nakryiko 			if (CHECK(!tmp_strs_idx,
4241c64779e2SAndrii Nakryiko 				  "Cannot allocate memory for strs_idx")) {
4242c64779e2SAndrii Nakryiko 				err = -1;
4243c64779e2SAndrii Nakryiko 				goto done;
4244c64779e2SAndrii Nakryiko 			}
4245c64779e2SAndrii Nakryiko 			strs_idx = tmp_strs_idx;
4246c64779e2SAndrii Nakryiko 		}
4247c64779e2SAndrii Nakryiko 		strs_idx[strs_cnt++] = next_str;
4248c64779e2SAndrii Nakryiko 		next_str += strlen(next_str);
4249c64779e2SAndrii Nakryiko 	}
4250c64779e2SAndrii Nakryiko 
4251c64779e2SAndrii Nakryiko 	/* Copy type section */
4252c64779e2SAndrii Nakryiko 	ret_types = raw_btf + offset;
4253c64779e2SAndrii Nakryiko 	for (i = 0; i < type_sec_size / sizeof(raw_types[0]); i++) {
4254c64779e2SAndrii Nakryiko 		if (raw_types[i] == NAME_TBD) {
4255c64779e2SAndrii Nakryiko 			if (CHECK(next_str_idx == strs_cnt,
4256c64779e2SAndrii Nakryiko 				  "Error in getting next_str #%d",
4257c64779e2SAndrii Nakryiko 				  next_str_idx)) {
4258c64779e2SAndrii Nakryiko 				err = -1;
4259c64779e2SAndrii Nakryiko 				goto done;
4260c64779e2SAndrii Nakryiko 			}
4261c64779e2SAndrii Nakryiko 			ret_types[i] = strs_idx[next_str_idx++] - str;
4262c64779e2SAndrii Nakryiko 		} else if (IS_NAME_NTH(raw_types[i])) {
4263c64779e2SAndrii Nakryiko 			int idx = GET_NAME_NTH_IDX(raw_types[i]);
4264c64779e2SAndrii Nakryiko 
4265c64779e2SAndrii Nakryiko 			if (CHECK(idx <= 0 || idx > strs_cnt,
4266c64779e2SAndrii Nakryiko 				  "Error getting string #%d, strs_cnt:%d",
4267c64779e2SAndrii Nakryiko 				  idx, strs_cnt)) {
4268c64779e2SAndrii Nakryiko 				err = -1;
4269c64779e2SAndrii Nakryiko 				goto done;
4270c64779e2SAndrii Nakryiko 			}
4271c64779e2SAndrii Nakryiko 			ret_types[i] = strs_idx[idx-1] - str;
4272c64779e2SAndrii Nakryiko 		} else {
4273c64779e2SAndrii Nakryiko 			ret_types[i] = raw_types[i];
4274c64779e2SAndrii Nakryiko 		}
4275c64779e2SAndrii Nakryiko 	}
4276c64779e2SAndrii Nakryiko 	offset += type_sec_size;
4277c64779e2SAndrii Nakryiko 
4278c64779e2SAndrii Nakryiko 	/* Copy string section */
4279c64779e2SAndrii Nakryiko 	memcpy(raw_btf + offset, str, str_sec_size);
4280c64779e2SAndrii Nakryiko 
4281c64779e2SAndrii Nakryiko 	ret_hdr = (struct btf_header *)raw_btf;
4282c64779e2SAndrii Nakryiko 	ret_hdr->type_len = type_sec_size;
4283c64779e2SAndrii Nakryiko 	ret_hdr->str_off = type_sec_size;
4284c64779e2SAndrii Nakryiko 	ret_hdr->str_len = str_sec_size;
4285c64779e2SAndrii Nakryiko 
4286c64779e2SAndrii Nakryiko 	*btf_size = size_needed;
4287c64779e2SAndrii Nakryiko 	if (ret_next_str)
4288c64779e2SAndrii Nakryiko 		*ret_next_str =
4289c64779e2SAndrii Nakryiko 			next_str_idx < strs_cnt ? strs_idx[next_str_idx] : NULL;
4290c64779e2SAndrii Nakryiko 
4291c64779e2SAndrii Nakryiko done:
4292c64779e2SAndrii Nakryiko 	free(strs_idx);
42935309b516SAndrii Nakryiko 	if (err) {
42945309b516SAndrii Nakryiko 		free(raw_btf);
4295c64779e2SAndrii Nakryiko 		return NULL;
4296c64779e2SAndrii Nakryiko 	}
4297c64779e2SAndrii Nakryiko 	return raw_btf;
4298c64779e2SAndrii Nakryiko }
4299c64779e2SAndrii Nakryiko 
load_raw_btf(const void * raw_data,size_t raw_size)4300dc94121bSAndrii Nakryiko static int load_raw_btf(const void *raw_data, size_t raw_size)
4301dc94121bSAndrii Nakryiko {
4302dc94121bSAndrii Nakryiko 	LIBBPF_OPTS(bpf_btf_load_opts, opts);
4303dc94121bSAndrii Nakryiko 	int btf_fd;
4304dc94121bSAndrii Nakryiko 
4305dc94121bSAndrii Nakryiko 	if (always_log) {
4306dc94121bSAndrii Nakryiko 		opts.log_buf = btf_log_buf,
4307dc94121bSAndrii Nakryiko 		opts.log_size = BTF_LOG_BUF_SIZE,
4308dc94121bSAndrii Nakryiko 		opts.log_level = 1;
4309dc94121bSAndrii Nakryiko 	}
4310dc94121bSAndrii Nakryiko 
4311dc94121bSAndrii Nakryiko 	btf_fd = bpf_btf_load(raw_data, raw_size, &opts);
4312dc94121bSAndrii Nakryiko 	if (btf_fd < 0 && !always_log) {
4313dc94121bSAndrii Nakryiko 		opts.log_buf = btf_log_buf,
4314dc94121bSAndrii Nakryiko 		opts.log_size = BTF_LOG_BUF_SIZE,
4315dc94121bSAndrii Nakryiko 		opts.log_level = 1;
4316dc94121bSAndrii Nakryiko 		btf_fd = bpf_btf_load(raw_data, raw_size, &opts);
4317dc94121bSAndrii Nakryiko 	}
4318dc94121bSAndrii Nakryiko 
4319dc94121bSAndrii Nakryiko 	return btf_fd;
4320dc94121bSAndrii Nakryiko }
4321dc94121bSAndrii Nakryiko 
do_test_raw(unsigned int test_num)4322c64779e2SAndrii Nakryiko static void do_test_raw(unsigned int test_num)
4323c64779e2SAndrii Nakryiko {
4324c64779e2SAndrii Nakryiko 	struct btf_raw_test *test = &raw_tests[test_num - 1];
43252fe256a4SAndrii Nakryiko 	LIBBPF_OPTS(bpf_map_create_opts, opts);
4326c64779e2SAndrii Nakryiko 	int map_fd = -1, btf_fd = -1;
4327c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
4328c64779e2SAndrii Nakryiko 	struct btf_header *hdr;
4329c64779e2SAndrii Nakryiko 	void *raw_btf;
4330c64779e2SAndrii Nakryiko 	int err;
4331c64779e2SAndrii Nakryiko 
4332c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
4333c64779e2SAndrii Nakryiko 		return;
4334c64779e2SAndrii Nakryiko 
4335c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl,
4336c64779e2SAndrii Nakryiko 				 test->raw_types,
4337c64779e2SAndrii Nakryiko 				 test->str_sec,
4338c64779e2SAndrii Nakryiko 				 test->str_sec_size,
4339c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
4340c64779e2SAndrii Nakryiko 	if (!raw_btf)
4341c64779e2SAndrii Nakryiko 		return;
4342c64779e2SAndrii Nakryiko 
4343c64779e2SAndrii Nakryiko 	hdr = raw_btf;
4344c64779e2SAndrii Nakryiko 
4345c64779e2SAndrii Nakryiko 	hdr->hdr_len = (int)hdr->hdr_len + test->hdr_len_delta;
4346c64779e2SAndrii Nakryiko 	hdr->type_off = (int)hdr->type_off + test->type_off_delta;
4347c64779e2SAndrii Nakryiko 	hdr->str_off = (int)hdr->str_off + test->str_off_delta;
4348c64779e2SAndrii Nakryiko 	hdr->str_len = (int)hdr->str_len + test->str_len_delta;
4349c64779e2SAndrii Nakryiko 
4350c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
4351dc94121bSAndrii Nakryiko 	btf_fd = load_raw_btf(raw_btf, raw_btf_size);
4352c64779e2SAndrii Nakryiko 	free(raw_btf);
4353c64779e2SAndrii Nakryiko 
4354bad2e478SAndrii Nakryiko 	err = ((btf_fd < 0) != test->btf_load_err);
4355c64779e2SAndrii Nakryiko 	if (CHECK(err, "btf_fd:%d test->btf_load_err:%u",
4356c64779e2SAndrii Nakryiko 		  btf_fd, test->btf_load_err) ||
4357c64779e2SAndrii Nakryiko 	    CHECK(test->err_str && !strstr(btf_log_buf, test->err_str),
4358dc94121bSAndrii Nakryiko 		  "expected err_str:%s\n", test->err_str)) {
4359c64779e2SAndrii Nakryiko 		err = -1;
4360c64779e2SAndrii Nakryiko 		goto done;
4361c64779e2SAndrii Nakryiko 	}
4362c64779e2SAndrii Nakryiko 
4363bad2e478SAndrii Nakryiko 	if (err || btf_fd < 0)
4364c64779e2SAndrii Nakryiko 		goto done;
4365c64779e2SAndrii Nakryiko 
43662fe256a4SAndrii Nakryiko 	opts.btf_fd = btf_fd;
43672fe256a4SAndrii Nakryiko 	opts.btf_key_type_id = test->key_type_id;
43682fe256a4SAndrii Nakryiko 	opts.btf_value_type_id = test->value_type_id;
43692fe256a4SAndrii Nakryiko 	map_fd = bpf_map_create(test->map_type, test->map_name,
43702fe256a4SAndrii Nakryiko 				test->key_size, test->value_size, test->max_entries, &opts);
4371c64779e2SAndrii Nakryiko 
4372bad2e478SAndrii Nakryiko 	err = ((map_fd < 0) != test->map_create_err);
4373c64779e2SAndrii Nakryiko 	CHECK(err, "map_fd:%d test->map_create_err:%u",
4374c64779e2SAndrii Nakryiko 	      map_fd, test->map_create_err);
4375c64779e2SAndrii Nakryiko 
4376c64779e2SAndrii Nakryiko done:
4377c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
4378c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
4379bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
4380c64779e2SAndrii Nakryiko 		close(btf_fd);
4381bad2e478SAndrii Nakryiko 	if (map_fd >= 0)
4382c64779e2SAndrii Nakryiko 		close(map_fd);
4383c64779e2SAndrii Nakryiko }
4384c64779e2SAndrii Nakryiko 
4385c64779e2SAndrii Nakryiko struct btf_get_info_test {
4386c64779e2SAndrii Nakryiko 	const char *descr;
4387c64779e2SAndrii Nakryiko 	const char *str_sec;
4388c64779e2SAndrii Nakryiko 	__u32 raw_types[MAX_NR_RAW_U32];
4389c64779e2SAndrii Nakryiko 	__u32 str_sec_size;
4390c64779e2SAndrii Nakryiko 	int btf_size_delta;
4391c64779e2SAndrii Nakryiko 	int (*special_test)(unsigned int test_num);
4392c64779e2SAndrii Nakryiko };
4393c64779e2SAndrii Nakryiko 
4394c64779e2SAndrii Nakryiko static int test_big_btf_info(unsigned int test_num);
4395c64779e2SAndrii Nakryiko static int test_btf_id(unsigned int test_num);
4396c64779e2SAndrii Nakryiko 
4397c64779e2SAndrii Nakryiko const struct btf_get_info_test get_info_tests[] = {
4398c64779e2SAndrii Nakryiko {
4399c64779e2SAndrii Nakryiko 	.descr = "== raw_btf_size+1",
4400c64779e2SAndrii Nakryiko 	.raw_types = {
4401c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
4402c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
4403c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4404c64779e2SAndrii Nakryiko 	},
4405c64779e2SAndrii Nakryiko 	.str_sec = "",
4406c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
4407c64779e2SAndrii Nakryiko 	.btf_size_delta = 1,
4408c64779e2SAndrii Nakryiko },
4409c64779e2SAndrii Nakryiko {
4410c64779e2SAndrii Nakryiko 	.descr = "== raw_btf_size-3",
4411c64779e2SAndrii Nakryiko 	.raw_types = {
4412c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
4413c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
4414c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4415c64779e2SAndrii Nakryiko 	},
4416c64779e2SAndrii Nakryiko 	.str_sec = "",
4417c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
4418c64779e2SAndrii Nakryiko 	.btf_size_delta = -3,
4419c64779e2SAndrii Nakryiko },
4420c64779e2SAndrii Nakryiko {
4421c64779e2SAndrii Nakryiko 	.descr = "Large bpf_btf_info",
4422c64779e2SAndrii Nakryiko 	.raw_types = {
4423c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
4424c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
4425c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4426c64779e2SAndrii Nakryiko 	},
4427c64779e2SAndrii Nakryiko 	.str_sec = "",
4428c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
4429c64779e2SAndrii Nakryiko 	.special_test = test_big_btf_info,
4430c64779e2SAndrii Nakryiko },
4431c64779e2SAndrii Nakryiko {
4432c64779e2SAndrii Nakryiko 	.descr = "BTF ID",
4433c64779e2SAndrii Nakryiko 	.raw_types = {
4434c64779e2SAndrii Nakryiko 		/* int */				/* [1] */
4435c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),
4436c64779e2SAndrii Nakryiko 		/* unsigned int */			/* [2] */
4437c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),
4438c64779e2SAndrii Nakryiko 		BTF_END_RAW,
4439c64779e2SAndrii Nakryiko 	},
4440c64779e2SAndrii Nakryiko 	.str_sec = "",
4441c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof(""),
4442c64779e2SAndrii Nakryiko 	.special_test = test_btf_id,
4443c64779e2SAndrii Nakryiko },
4444c64779e2SAndrii Nakryiko };
4445c64779e2SAndrii Nakryiko 
test_big_btf_info(unsigned int test_num)4446c64779e2SAndrii Nakryiko static int test_big_btf_info(unsigned int test_num)
4447c64779e2SAndrii Nakryiko {
4448c64779e2SAndrii Nakryiko 	const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
4449c64779e2SAndrii Nakryiko 	uint8_t *raw_btf = NULL, *user_btf = NULL;
4450c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
4451c64779e2SAndrii Nakryiko 	struct {
4452c64779e2SAndrii Nakryiko 		struct bpf_btf_info info;
4453c64779e2SAndrii Nakryiko 		uint64_t garbage;
4454c64779e2SAndrii Nakryiko 	} info_garbage;
4455c64779e2SAndrii Nakryiko 	struct bpf_btf_info *info;
4456c64779e2SAndrii Nakryiko 	int btf_fd = -1, err;
4457c64779e2SAndrii Nakryiko 	uint32_t info_len;
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 	user_btf = malloc(raw_btf_size);
4471c64779e2SAndrii Nakryiko 	if (CHECK(!user_btf, "!user_btf")) {
4472c64779e2SAndrii Nakryiko 		err = -1;
4473c64779e2SAndrii Nakryiko 		goto done;
4474c64779e2SAndrii Nakryiko 	}
4475c64779e2SAndrii Nakryiko 
4476dc94121bSAndrii Nakryiko 	btf_fd = load_raw_btf(raw_btf, raw_btf_size);
4477bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd < 0, "errno:%d", errno)) {
4478c64779e2SAndrii Nakryiko 		err = -1;
4479c64779e2SAndrii Nakryiko 		goto done;
4480c64779e2SAndrii Nakryiko 	}
4481c64779e2SAndrii Nakryiko 
4482c64779e2SAndrii Nakryiko 	/*
4483c64779e2SAndrii Nakryiko 	 * GET_INFO should error out if the userspace info
4484c64779e2SAndrii Nakryiko 	 * has non zero tailing bytes.
4485c64779e2SAndrii Nakryiko 	 */
4486c64779e2SAndrii Nakryiko 	info = &info_garbage.info;
4487c64779e2SAndrii Nakryiko 	memset(info, 0, sizeof(*info));
4488c64779e2SAndrii Nakryiko 	info_garbage.garbage = 0xdeadbeef;
4489c64779e2SAndrii Nakryiko 	info_len = sizeof(info_garbage);
4490c64779e2SAndrii Nakryiko 	info->btf = ptr_to_u64(user_btf);
4491c64779e2SAndrii Nakryiko 	info->btf_size = raw_btf_size;
4492c64779e2SAndrii Nakryiko 
4493c5a237a4SIlya Leoshkevich 	err = bpf_btf_get_info_by_fd(btf_fd, info, &info_len);
4494c64779e2SAndrii Nakryiko 	if (CHECK(!err, "!err")) {
4495c64779e2SAndrii Nakryiko 		err = -1;
4496c64779e2SAndrii Nakryiko 		goto done;
4497c64779e2SAndrii Nakryiko 	}
4498c64779e2SAndrii Nakryiko 
4499c64779e2SAndrii Nakryiko 	/*
4500c64779e2SAndrii Nakryiko 	 * GET_INFO should succeed even info_len is larger than
4501c64779e2SAndrii Nakryiko 	 * the kernel supported as long as tailing bytes are zero.
4502c64779e2SAndrii Nakryiko 	 * The kernel supported info len should also be returned
4503c64779e2SAndrii Nakryiko 	 * to userspace.
4504c64779e2SAndrii Nakryiko 	 */
4505c64779e2SAndrii Nakryiko 	info_garbage.garbage = 0;
4506c5a237a4SIlya Leoshkevich 	err = bpf_btf_get_info_by_fd(btf_fd, info, &info_len);
4507c64779e2SAndrii Nakryiko 	if (CHECK(err || info_len != sizeof(*info),
4508c64779e2SAndrii Nakryiko 		  "err:%d errno:%d info_len:%u sizeof(*info):%zu",
4509c64779e2SAndrii Nakryiko 		  err, errno, info_len, sizeof(*info))) {
4510c64779e2SAndrii Nakryiko 		err = -1;
4511c64779e2SAndrii Nakryiko 		goto done;
4512c64779e2SAndrii Nakryiko 	}
4513c64779e2SAndrii Nakryiko 
4514c64779e2SAndrii Nakryiko 	fprintf(stderr, "OK");
4515c64779e2SAndrii Nakryiko 
4516c64779e2SAndrii Nakryiko done:
4517c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
4518c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
4519c64779e2SAndrii Nakryiko 
4520c64779e2SAndrii Nakryiko 	free(raw_btf);
4521c64779e2SAndrii Nakryiko 	free(user_btf);
4522c64779e2SAndrii Nakryiko 
4523bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
4524c64779e2SAndrii Nakryiko 		close(btf_fd);
4525c64779e2SAndrii Nakryiko 
4526c64779e2SAndrii Nakryiko 	return err;
4527c64779e2SAndrii Nakryiko }
4528c64779e2SAndrii Nakryiko 
test_btf_id(unsigned int test_num)4529c64779e2SAndrii Nakryiko static int test_btf_id(unsigned int test_num)
4530c64779e2SAndrii Nakryiko {
4531c64779e2SAndrii Nakryiko 	const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
45322fe256a4SAndrii Nakryiko 	LIBBPF_OPTS(bpf_map_create_opts, opts);
4533c64779e2SAndrii Nakryiko 	uint8_t *raw_btf = NULL, *user_btf[2] = {};
4534c64779e2SAndrii Nakryiko 	int btf_fd[2] = {-1, -1}, map_fd = -1;
4535c64779e2SAndrii Nakryiko 	struct bpf_map_info map_info = {};
4536c64779e2SAndrii Nakryiko 	struct bpf_btf_info info[2] = {};
4537c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
4538c64779e2SAndrii Nakryiko 	uint32_t info_len;
4539c64779e2SAndrii Nakryiko 	int err, i, ret;
4540c64779e2SAndrii Nakryiko 
4541c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl,
4542c64779e2SAndrii Nakryiko 				 test->raw_types,
4543c64779e2SAndrii Nakryiko 				 test->str_sec,
4544c64779e2SAndrii Nakryiko 				 test->str_sec_size,
4545c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
4546c64779e2SAndrii Nakryiko 
4547c64779e2SAndrii Nakryiko 	if (!raw_btf)
4548c64779e2SAndrii Nakryiko 		return -1;
4549c64779e2SAndrii Nakryiko 
4550c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
4551c64779e2SAndrii Nakryiko 
4552c64779e2SAndrii Nakryiko 	for (i = 0; i < 2; i++) {
4553c64779e2SAndrii Nakryiko 		user_btf[i] = malloc(raw_btf_size);
4554c64779e2SAndrii Nakryiko 		if (CHECK(!user_btf[i], "!user_btf[%d]", i)) {
4555c64779e2SAndrii Nakryiko 			err = -1;
4556c64779e2SAndrii Nakryiko 			goto done;
4557c64779e2SAndrii Nakryiko 		}
4558c64779e2SAndrii Nakryiko 		info[i].btf = ptr_to_u64(user_btf[i]);
4559c64779e2SAndrii Nakryiko 		info[i].btf_size = raw_btf_size;
4560c64779e2SAndrii Nakryiko 	}
4561c64779e2SAndrii Nakryiko 
4562dc94121bSAndrii Nakryiko 	btf_fd[0] = load_raw_btf(raw_btf, raw_btf_size);
4563bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd[0] < 0, "errno:%d", errno)) {
4564c64779e2SAndrii Nakryiko 		err = -1;
4565c64779e2SAndrii Nakryiko 		goto done;
4566c64779e2SAndrii Nakryiko 	}
4567c64779e2SAndrii Nakryiko 
4568c64779e2SAndrii Nakryiko 	/* Test BPF_OBJ_GET_INFO_BY_ID on btf_id */
4569c64779e2SAndrii Nakryiko 	info_len = sizeof(info[0]);
4570c5a237a4SIlya Leoshkevich 	err = bpf_btf_get_info_by_fd(btf_fd[0], &info[0], &info_len);
4571c64779e2SAndrii Nakryiko 	if (CHECK(err, "errno:%d", errno)) {
4572c64779e2SAndrii Nakryiko 		err = -1;
4573c64779e2SAndrii Nakryiko 		goto done;
4574c64779e2SAndrii Nakryiko 	}
4575c64779e2SAndrii Nakryiko 
4576c64779e2SAndrii Nakryiko 	btf_fd[1] = bpf_btf_get_fd_by_id(info[0].id);
4577bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd[1] < 0, "errno:%d", errno)) {
4578c64779e2SAndrii Nakryiko 		err = -1;
4579c64779e2SAndrii Nakryiko 		goto done;
4580c64779e2SAndrii Nakryiko 	}
4581c64779e2SAndrii Nakryiko 
4582c64779e2SAndrii Nakryiko 	ret = 0;
4583c5a237a4SIlya Leoshkevich 	err = bpf_btf_get_info_by_fd(btf_fd[1], &info[1], &info_len);
4584c64779e2SAndrii Nakryiko 	if (CHECK(err || info[0].id != info[1].id ||
4585c64779e2SAndrii Nakryiko 		  info[0].btf_size != info[1].btf_size ||
4586c64779e2SAndrii Nakryiko 		  (ret = memcmp(user_btf[0], user_btf[1], info[0].btf_size)),
4587c64779e2SAndrii Nakryiko 		  "err:%d errno:%d id0:%u id1:%u btf_size0:%u btf_size1:%u memcmp:%d",
4588c64779e2SAndrii Nakryiko 		  err, errno, info[0].id, info[1].id,
4589c64779e2SAndrii Nakryiko 		  info[0].btf_size, info[1].btf_size, ret)) {
4590c64779e2SAndrii Nakryiko 		err = -1;
4591c64779e2SAndrii Nakryiko 		goto done;
4592c64779e2SAndrii Nakryiko 	}
4593c64779e2SAndrii Nakryiko 
4594c64779e2SAndrii Nakryiko 	/* Test btf members in struct bpf_map_info */
45952fe256a4SAndrii Nakryiko 	opts.btf_fd = btf_fd[0];
45962fe256a4SAndrii Nakryiko 	opts.btf_key_type_id = 1;
45972fe256a4SAndrii Nakryiko 	opts.btf_value_type_id = 2;
45982fe256a4SAndrii Nakryiko 	map_fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, "test_btf_id",
45992fe256a4SAndrii Nakryiko 				sizeof(int), sizeof(int), 4, &opts);
4600bad2e478SAndrii Nakryiko 	if (CHECK(map_fd < 0, "errno:%d", errno)) {
4601c64779e2SAndrii Nakryiko 		err = -1;
4602c64779e2SAndrii Nakryiko 		goto done;
4603c64779e2SAndrii Nakryiko 	}
4604c64779e2SAndrii Nakryiko 
4605c64779e2SAndrii Nakryiko 	info_len = sizeof(map_info);
4606c5a237a4SIlya Leoshkevich 	err = bpf_map_get_info_by_fd(map_fd, &map_info, &info_len);
4607c64779e2SAndrii Nakryiko 	if (CHECK(err || map_info.btf_id != info[0].id ||
4608c64779e2SAndrii Nakryiko 		  map_info.btf_key_type_id != 1 || map_info.btf_value_type_id != 2,
4609c64779e2SAndrii Nakryiko 		  "err:%d errno:%d info.id:%u btf_id:%u btf_key_type_id:%u btf_value_type_id:%u",
4610c64779e2SAndrii Nakryiko 		  err, errno, info[0].id, map_info.btf_id, map_info.btf_key_type_id,
4611c64779e2SAndrii Nakryiko 		  map_info.btf_value_type_id)) {
4612c64779e2SAndrii Nakryiko 		err = -1;
4613c64779e2SAndrii Nakryiko 		goto done;
4614c64779e2SAndrii Nakryiko 	}
4615c64779e2SAndrii Nakryiko 
4616c64779e2SAndrii Nakryiko 	for (i = 0; i < 2; i++) {
4617c64779e2SAndrii Nakryiko 		close(btf_fd[i]);
4618c64779e2SAndrii Nakryiko 		btf_fd[i] = -1;
4619c64779e2SAndrii Nakryiko 	}
4620c64779e2SAndrii Nakryiko 
4621c64779e2SAndrii Nakryiko 	/* Test BTF ID is removed from the kernel */
4622c64779e2SAndrii Nakryiko 	btf_fd[0] = bpf_btf_get_fd_by_id(map_info.btf_id);
4623bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd[0] < 0, "errno:%d", errno)) {
4624c64779e2SAndrii Nakryiko 		err = -1;
4625c64779e2SAndrii Nakryiko 		goto done;
4626c64779e2SAndrii Nakryiko 	}
4627c64779e2SAndrii Nakryiko 	close(btf_fd[0]);
4628c64779e2SAndrii Nakryiko 	btf_fd[0] = -1;
4629c64779e2SAndrii Nakryiko 
4630c64779e2SAndrii Nakryiko 	/* The map holds the last ref to BTF and its btf_id */
4631c64779e2SAndrii Nakryiko 	close(map_fd);
4632c64779e2SAndrii Nakryiko 	map_fd = -1;
4633c64779e2SAndrii Nakryiko 
4634c64779e2SAndrii Nakryiko 	fprintf(stderr, "OK");
4635c64779e2SAndrii Nakryiko 
4636c64779e2SAndrii Nakryiko done:
4637c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
4638c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
4639c64779e2SAndrii Nakryiko 
4640c64779e2SAndrii Nakryiko 	free(raw_btf);
4641bad2e478SAndrii Nakryiko 	if (map_fd >= 0)
4642c64779e2SAndrii Nakryiko 		close(map_fd);
4643c64779e2SAndrii Nakryiko 	for (i = 0; i < 2; i++) {
4644c64779e2SAndrii Nakryiko 		free(user_btf[i]);
4645bad2e478SAndrii Nakryiko 		if (btf_fd[i] >= 0)
4646c64779e2SAndrii Nakryiko 			close(btf_fd[i]);
4647c64779e2SAndrii Nakryiko 	}
4648c64779e2SAndrii Nakryiko 
4649c64779e2SAndrii Nakryiko 	return err;
4650c64779e2SAndrii Nakryiko }
4651c64779e2SAndrii Nakryiko 
do_test_get_info(unsigned int test_num)4652c64779e2SAndrii Nakryiko static void do_test_get_info(unsigned int test_num)
4653c64779e2SAndrii Nakryiko {
4654c64779e2SAndrii Nakryiko 	const struct btf_get_info_test *test = &get_info_tests[test_num - 1];
4655c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size, user_btf_size, expected_nbytes;
4656c64779e2SAndrii Nakryiko 	uint8_t *raw_btf = NULL, *user_btf = NULL;
4657c64779e2SAndrii Nakryiko 	struct bpf_btf_info info = {};
4658c64779e2SAndrii Nakryiko 	int btf_fd = -1, err, ret;
4659c64779e2SAndrii Nakryiko 	uint32_t info_len;
4660c64779e2SAndrii Nakryiko 
4661c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
4662c64779e2SAndrii Nakryiko 		return;
4663c64779e2SAndrii Nakryiko 
4664c64779e2SAndrii Nakryiko 	if (test->special_test) {
4665c64779e2SAndrii Nakryiko 		err = test->special_test(test_num);
4666c64779e2SAndrii Nakryiko 		if (CHECK(err, "failed: %d\n", err))
4667c64779e2SAndrii Nakryiko 			return;
4668c64779e2SAndrii Nakryiko 	}
4669c64779e2SAndrii Nakryiko 
4670c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl,
4671c64779e2SAndrii Nakryiko 				 test->raw_types,
4672c64779e2SAndrii Nakryiko 				 test->str_sec,
4673c64779e2SAndrii Nakryiko 				 test->str_sec_size,
4674c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
4675c64779e2SAndrii Nakryiko 
4676c64779e2SAndrii Nakryiko 	if (!raw_btf)
4677c64779e2SAndrii Nakryiko 		return;
4678c64779e2SAndrii Nakryiko 
4679c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
4680c64779e2SAndrii Nakryiko 
4681c64779e2SAndrii Nakryiko 	user_btf = malloc(raw_btf_size);
4682c64779e2SAndrii Nakryiko 	if (CHECK(!user_btf, "!user_btf")) {
4683c64779e2SAndrii Nakryiko 		err = -1;
4684c64779e2SAndrii Nakryiko 		goto done;
4685c64779e2SAndrii Nakryiko 	}
4686c64779e2SAndrii Nakryiko 
4687dc94121bSAndrii Nakryiko 	btf_fd = load_raw_btf(raw_btf, raw_btf_size);
4688bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd <= 0, "errno:%d", errno)) {
4689c64779e2SAndrii Nakryiko 		err = -1;
4690c64779e2SAndrii Nakryiko 		goto done;
4691c64779e2SAndrii Nakryiko 	}
4692c64779e2SAndrii Nakryiko 
4693c64779e2SAndrii Nakryiko 	user_btf_size = (int)raw_btf_size + test->btf_size_delta;
4694c64779e2SAndrii Nakryiko 	expected_nbytes = min(raw_btf_size, user_btf_size);
4695c64779e2SAndrii Nakryiko 	if (raw_btf_size > expected_nbytes)
4696c64779e2SAndrii Nakryiko 		memset(user_btf + expected_nbytes, 0xff,
4697c64779e2SAndrii Nakryiko 		       raw_btf_size - expected_nbytes);
4698c64779e2SAndrii Nakryiko 
4699c64779e2SAndrii Nakryiko 	info_len = sizeof(info);
4700c64779e2SAndrii Nakryiko 	info.btf = ptr_to_u64(user_btf);
4701c64779e2SAndrii Nakryiko 	info.btf_size = user_btf_size;
4702c64779e2SAndrii Nakryiko 
4703c64779e2SAndrii Nakryiko 	ret = 0;
4704c5a237a4SIlya Leoshkevich 	err = bpf_btf_get_info_by_fd(btf_fd, &info, &info_len);
4705c64779e2SAndrii Nakryiko 	if (CHECK(err || !info.id || info_len != sizeof(info) ||
4706c64779e2SAndrii Nakryiko 		  info.btf_size != raw_btf_size ||
4707c64779e2SAndrii Nakryiko 		  (ret = memcmp(raw_btf, user_btf, expected_nbytes)),
4708c64779e2SAndrii 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",
4709c64779e2SAndrii Nakryiko 		  err, errno, info.id, info_len, sizeof(info),
4710c64779e2SAndrii Nakryiko 		  raw_btf_size, info.btf_size, expected_nbytes, ret)) {
4711c64779e2SAndrii Nakryiko 		err = -1;
4712c64779e2SAndrii Nakryiko 		goto done;
4713c64779e2SAndrii Nakryiko 	}
4714c64779e2SAndrii Nakryiko 
4715c64779e2SAndrii Nakryiko 	while (expected_nbytes < raw_btf_size) {
4716c64779e2SAndrii Nakryiko 		fprintf(stderr, "%u...", expected_nbytes);
4717c64779e2SAndrii Nakryiko 		if (CHECK(user_btf[expected_nbytes++] != 0xff,
4718c64779e2SAndrii Nakryiko 			  "user_btf[%u]:%x != 0xff", expected_nbytes - 1,
4719c64779e2SAndrii Nakryiko 			  user_btf[expected_nbytes - 1])) {
4720c64779e2SAndrii Nakryiko 			err = -1;
4721c64779e2SAndrii Nakryiko 			goto done;
4722c64779e2SAndrii Nakryiko 		}
4723c64779e2SAndrii Nakryiko 	}
4724c64779e2SAndrii Nakryiko 
4725c64779e2SAndrii Nakryiko 	fprintf(stderr, "OK");
4726c64779e2SAndrii Nakryiko 
4727c64779e2SAndrii Nakryiko done:
4728c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
4729c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
4730c64779e2SAndrii Nakryiko 
4731c64779e2SAndrii Nakryiko 	free(raw_btf);
4732c64779e2SAndrii Nakryiko 	free(user_btf);
4733c64779e2SAndrii Nakryiko 
4734bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
4735c64779e2SAndrii Nakryiko 		close(btf_fd);
4736c64779e2SAndrii Nakryiko }
4737c64779e2SAndrii Nakryiko 
4738c64779e2SAndrii Nakryiko struct btf_file_test {
4739c64779e2SAndrii Nakryiko 	const char *file;
4740c64779e2SAndrii Nakryiko 	bool btf_kv_notfound;
4741c64779e2SAndrii Nakryiko };
4742c64779e2SAndrii Nakryiko 
4743c64779e2SAndrii Nakryiko static struct btf_file_test file_tests[] = {
4744afef88e6SDaniel Müller 	{ .file = "test_btf_newkv.bpf.o", },
4745afef88e6SDaniel Müller 	{ .file = "test_btf_nokv.bpf.o", .btf_kv_notfound = true, },
4746c64779e2SAndrii Nakryiko };
4747c64779e2SAndrii Nakryiko 
do_test_file(unsigned int test_num)4748c64779e2SAndrii Nakryiko static void do_test_file(unsigned int test_num)
4749c64779e2SAndrii Nakryiko {
4750c64779e2SAndrii Nakryiko 	const struct btf_file_test *test = &file_tests[test_num - 1];
4751c64779e2SAndrii Nakryiko 	const char *expected_fnames[] = {"_dummy_tracepoint",
4752c64779e2SAndrii Nakryiko 					 "test_long_fname_1",
4753c64779e2SAndrii Nakryiko 					 "test_long_fname_2"};
4754c64779e2SAndrii Nakryiko 	struct btf_ext *btf_ext = NULL;
4755c64779e2SAndrii Nakryiko 	struct bpf_prog_info info = {};
4756c64779e2SAndrii Nakryiko 	struct bpf_object *obj = NULL;
4757c64779e2SAndrii Nakryiko 	struct bpf_func_info *finfo;
4758c64779e2SAndrii Nakryiko 	struct bpf_program *prog;
4759c64779e2SAndrii Nakryiko 	__u32 info_len, rec_size;
4760c64779e2SAndrii Nakryiko 	bool has_btf_ext = false;
4761c64779e2SAndrii Nakryiko 	struct btf *btf = NULL;
4762c64779e2SAndrii Nakryiko 	void *func_info = NULL;
4763c64779e2SAndrii Nakryiko 	struct bpf_map *map;
4764c64779e2SAndrii Nakryiko 	int i, err, prog_fd;
4765c64779e2SAndrii Nakryiko 
4766c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->file))
4767c64779e2SAndrii Nakryiko 		return;
4768c64779e2SAndrii Nakryiko 
4769c64779e2SAndrii Nakryiko 	btf = btf__parse_elf(test->file, &btf_ext);
4770bad2e478SAndrii Nakryiko 	err = libbpf_get_error(btf);
4771bad2e478SAndrii Nakryiko 	if (err) {
4772bad2e478SAndrii Nakryiko 		if (err == -ENOENT) {
4773c64779e2SAndrii Nakryiko 			printf("%s:SKIP: No ELF %s found", __func__, BTF_ELF_SEC);
4774c64779e2SAndrii Nakryiko 			test__skip();
4775c64779e2SAndrii Nakryiko 			return;
4776c64779e2SAndrii Nakryiko 		}
4777c64779e2SAndrii Nakryiko 		return;
4778c64779e2SAndrii Nakryiko 	}
4779c64779e2SAndrii Nakryiko 	btf__free(btf);
4780c64779e2SAndrii Nakryiko 
4781c64779e2SAndrii Nakryiko 	has_btf_ext = btf_ext != NULL;
4782c64779e2SAndrii Nakryiko 	btf_ext__free(btf_ext);
4783c64779e2SAndrii Nakryiko 
478493b8952dSAndrii Nakryiko 	/* temporary disable LIBBPF_STRICT_MAP_DEFINITIONS to test legacy maps */
47852b9e2eadSMauricio Vásquez 	libbpf_set_strict_mode(LIBBPF_STRICT_ALL & ~LIBBPF_STRICT_MAP_DEFINITIONS);
4786c64779e2SAndrii Nakryiko 	obj = bpf_object__open(test->file);
4787bad2e478SAndrii Nakryiko 	err = libbpf_get_error(obj);
4788bad2e478SAndrii Nakryiko 	if (CHECK(err, "obj: %d", err))
4789c64779e2SAndrii Nakryiko 		return;
4790c64779e2SAndrii Nakryiko 
47916f2b219bSHengqi Chen 	prog = bpf_object__next_program(obj, NULL);
4792c64779e2SAndrii Nakryiko 	if (CHECK(!prog, "Cannot find bpf_prog")) {
4793c64779e2SAndrii Nakryiko 		err = -1;
4794c64779e2SAndrii Nakryiko 		goto done;
4795c64779e2SAndrii Nakryiko 	}
4796c64779e2SAndrii Nakryiko 
4797c64779e2SAndrii Nakryiko 	bpf_program__set_type(prog, BPF_PROG_TYPE_TRACEPOINT);
4798c64779e2SAndrii Nakryiko 	err = bpf_object__load(obj);
4799c64779e2SAndrii Nakryiko 	if (CHECK(err < 0, "bpf_object__load: %d", err))
4800c64779e2SAndrii Nakryiko 		goto done;
4801c64779e2SAndrii Nakryiko 	prog_fd = bpf_program__fd(prog);
4802c64779e2SAndrii Nakryiko 
4803c64779e2SAndrii Nakryiko 	map = bpf_object__find_map_by_name(obj, "btf_map");
4804c64779e2SAndrii Nakryiko 	if (CHECK(!map, "btf_map not found")) {
4805c64779e2SAndrii Nakryiko 		err = -1;
4806c64779e2SAndrii Nakryiko 		goto done;
4807c64779e2SAndrii Nakryiko 	}
4808c64779e2SAndrii Nakryiko 
4809c64779e2SAndrii Nakryiko 	err = (bpf_map__btf_key_type_id(map) == 0 || bpf_map__btf_value_type_id(map) == 0)
4810c64779e2SAndrii Nakryiko 		!= test->btf_kv_notfound;
4811c64779e2SAndrii Nakryiko 	if (CHECK(err, "btf_key_type_id:%u btf_value_type_id:%u test->btf_kv_notfound:%u",
4812c64779e2SAndrii Nakryiko 		  bpf_map__btf_key_type_id(map), bpf_map__btf_value_type_id(map),
4813c64779e2SAndrii Nakryiko 		  test->btf_kv_notfound))
4814c64779e2SAndrii Nakryiko 		goto done;
4815c64779e2SAndrii Nakryiko 
4816c64779e2SAndrii Nakryiko 	if (!has_btf_ext)
4817c64779e2SAndrii Nakryiko 		goto skip;
4818c64779e2SAndrii Nakryiko 
4819c64779e2SAndrii Nakryiko 	/* get necessary program info */
4820c64779e2SAndrii Nakryiko 	info_len = sizeof(struct bpf_prog_info);
4821c5a237a4SIlya Leoshkevich 	err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len);
4822c64779e2SAndrii Nakryiko 
4823bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "invalid get info (1st) errno:%d", errno)) {
4824c64779e2SAndrii Nakryiko 		fprintf(stderr, "%s\n", btf_log_buf);
4825c64779e2SAndrii Nakryiko 		err = -1;
4826c64779e2SAndrii Nakryiko 		goto done;
4827c64779e2SAndrii Nakryiko 	}
4828c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_func_info != 3,
4829c64779e2SAndrii Nakryiko 		  "incorrect info.nr_func_info (1st) %d",
4830c64779e2SAndrii Nakryiko 		  info.nr_func_info)) {
4831c64779e2SAndrii Nakryiko 		err = -1;
4832c64779e2SAndrii Nakryiko 		goto done;
4833c64779e2SAndrii Nakryiko 	}
4834c64779e2SAndrii Nakryiko 	rec_size = info.func_info_rec_size;
4835c64779e2SAndrii Nakryiko 	if (CHECK(rec_size != sizeof(struct bpf_func_info),
4836c64779e2SAndrii Nakryiko 		  "incorrect info.func_info_rec_size (1st) %d\n", rec_size)) {
4837c64779e2SAndrii Nakryiko 		err = -1;
4838c64779e2SAndrii Nakryiko 		goto done;
4839c64779e2SAndrii Nakryiko 	}
4840c64779e2SAndrii Nakryiko 
4841c64779e2SAndrii Nakryiko 	func_info = malloc(info.nr_func_info * rec_size);
4842c64779e2SAndrii Nakryiko 	if (CHECK(!func_info, "out of memory")) {
4843c64779e2SAndrii Nakryiko 		err = -1;
4844c64779e2SAndrii Nakryiko 		goto done;
4845c64779e2SAndrii Nakryiko 	}
4846c64779e2SAndrii Nakryiko 
4847c64779e2SAndrii Nakryiko 	/* reset info to only retrieve func_info related data */
4848c64779e2SAndrii Nakryiko 	memset(&info, 0, sizeof(info));
4849c64779e2SAndrii Nakryiko 	info.nr_func_info = 3;
4850c64779e2SAndrii Nakryiko 	info.func_info_rec_size = rec_size;
4851c64779e2SAndrii Nakryiko 	info.func_info = ptr_to_u64(func_info);
4852c64779e2SAndrii Nakryiko 
4853c5a237a4SIlya Leoshkevich 	err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len);
4854c64779e2SAndrii Nakryiko 
4855bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "invalid get info (2nd) errno:%d", errno)) {
4856c64779e2SAndrii Nakryiko 		fprintf(stderr, "%s\n", btf_log_buf);
4857c64779e2SAndrii Nakryiko 		err = -1;
4858c64779e2SAndrii Nakryiko 		goto done;
4859c64779e2SAndrii Nakryiko 	}
4860c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_func_info != 3,
4861c64779e2SAndrii Nakryiko 		  "incorrect info.nr_func_info (2nd) %d",
4862c64779e2SAndrii Nakryiko 		  info.nr_func_info)) {
4863c64779e2SAndrii Nakryiko 		err = -1;
4864c64779e2SAndrii Nakryiko 		goto done;
4865c64779e2SAndrii Nakryiko 	}
4866c64779e2SAndrii Nakryiko 	if (CHECK(info.func_info_rec_size != rec_size,
4867c64779e2SAndrii Nakryiko 		  "incorrect info.func_info_rec_size (2nd) %d",
4868c64779e2SAndrii Nakryiko 		  info.func_info_rec_size)) {
4869c64779e2SAndrii Nakryiko 		err = -1;
4870c64779e2SAndrii Nakryiko 		goto done;
4871c64779e2SAndrii Nakryiko 	}
4872c64779e2SAndrii Nakryiko 
487386f4b7f2SQuentin Monnet 	btf = btf__load_from_kernel_by_id(info.btf_id);
487486f4b7f2SQuentin Monnet 	err = libbpf_get_error(btf);
4875c64779e2SAndrii Nakryiko 	if (CHECK(err, "cannot get btf from kernel, err: %d", err))
4876c64779e2SAndrii Nakryiko 		goto done;
4877c64779e2SAndrii Nakryiko 
4878c64779e2SAndrii Nakryiko 	/* check three functions */
4879c64779e2SAndrii Nakryiko 	finfo = func_info;
4880c64779e2SAndrii Nakryiko 	for (i = 0; i < 3; i++) {
4881c64779e2SAndrii Nakryiko 		const struct btf_type *t;
4882c64779e2SAndrii Nakryiko 		const char *fname;
4883c64779e2SAndrii Nakryiko 
4884c64779e2SAndrii Nakryiko 		t = btf__type_by_id(btf, finfo->type_id);
4885c64779e2SAndrii Nakryiko 		if (CHECK(!t, "btf__type_by_id failure: id %u",
4886c64779e2SAndrii Nakryiko 			  finfo->type_id)) {
4887c64779e2SAndrii Nakryiko 			err = -1;
4888c64779e2SAndrii Nakryiko 			goto done;
4889c64779e2SAndrii Nakryiko 		}
4890c64779e2SAndrii Nakryiko 
4891c64779e2SAndrii Nakryiko 		fname = btf__name_by_offset(btf, t->name_off);
4892c64779e2SAndrii Nakryiko 		err = strcmp(fname, expected_fnames[i]);
4893c64779e2SAndrii Nakryiko 		/* for the second and third functions in .text section,
4894c64779e2SAndrii Nakryiko 		 * the compiler may order them either way.
4895c64779e2SAndrii Nakryiko 		 */
4896c64779e2SAndrii Nakryiko 		if (i && err)
4897c64779e2SAndrii Nakryiko 			err = strcmp(fname, expected_fnames[3 - i]);
4898c64779e2SAndrii Nakryiko 		if (CHECK(err, "incorrect fname %s", fname ? : "")) {
4899c64779e2SAndrii Nakryiko 			err = -1;
4900c64779e2SAndrii Nakryiko 			goto done;
4901c64779e2SAndrii Nakryiko 		}
4902c64779e2SAndrii Nakryiko 
4903c64779e2SAndrii Nakryiko 		finfo = (void *)finfo + rec_size;
4904c64779e2SAndrii Nakryiko 	}
4905c64779e2SAndrii Nakryiko 
4906c64779e2SAndrii Nakryiko skip:
4907c64779e2SAndrii Nakryiko 	fprintf(stderr, "OK");
4908c64779e2SAndrii Nakryiko 
4909c64779e2SAndrii Nakryiko done:
491093b8952dSAndrii Nakryiko 	libbpf_set_strict_mode(LIBBPF_STRICT_ALL);
491193b8952dSAndrii Nakryiko 
4912369e955bSQuentin Monnet 	btf__free(btf);
4913c64779e2SAndrii Nakryiko 	free(func_info);
4914c64779e2SAndrii Nakryiko 	bpf_object__close(obj);
4915c64779e2SAndrii Nakryiko }
4916c64779e2SAndrii Nakryiko 
4917c64779e2SAndrii Nakryiko const char *pprint_enum_str[] = {
4918c64779e2SAndrii Nakryiko 	"ENUM_ZERO",
4919c64779e2SAndrii Nakryiko 	"ENUM_ONE",
4920c64779e2SAndrii Nakryiko 	"ENUM_TWO",
4921c64779e2SAndrii Nakryiko 	"ENUM_THREE",
4922c64779e2SAndrii Nakryiko };
4923c64779e2SAndrii Nakryiko 
4924c64779e2SAndrii Nakryiko struct pprint_mapv {
4925c64779e2SAndrii Nakryiko 	uint32_t ui32;
4926c64779e2SAndrii Nakryiko 	uint16_t ui16;
4927c64779e2SAndrii Nakryiko 	/* 2 bytes hole */
4928c64779e2SAndrii Nakryiko 	int32_t si32;
4929c64779e2SAndrii Nakryiko 	uint32_t unused_bits2a:2,
4930c64779e2SAndrii Nakryiko 		bits28:28,
4931c64779e2SAndrii Nakryiko 		unused_bits2b:2;
4932c64779e2SAndrii Nakryiko 	union {
4933c64779e2SAndrii Nakryiko 		uint64_t ui64;
4934c64779e2SAndrii Nakryiko 		uint8_t ui8a[8];
4935c64779e2SAndrii Nakryiko 	};
4936c64779e2SAndrii Nakryiko 	enum {
4937c64779e2SAndrii Nakryiko 		ENUM_ZERO,
4938c64779e2SAndrii Nakryiko 		ENUM_ONE,
4939c64779e2SAndrii Nakryiko 		ENUM_TWO,
4940c64779e2SAndrii Nakryiko 		ENUM_THREE,
4941c64779e2SAndrii Nakryiko 	} aenum;
4942c64779e2SAndrii Nakryiko 	uint32_t ui32b;
4943c64779e2SAndrii Nakryiko 	uint32_t bits2c:2;
4944c64779e2SAndrii Nakryiko 	uint8_t si8_4[2][2];
4945c64779e2SAndrii Nakryiko };
4946c64779e2SAndrii Nakryiko 
4947c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
4948c64779e2SAndrii Nakryiko struct pprint_mapv_int128 {
4949c64779e2SAndrii Nakryiko 	__int128 si128a;
4950c64779e2SAndrii Nakryiko 	__int128 si128b;
4951c64779e2SAndrii Nakryiko 	unsigned __int128 bits3:3;
4952c64779e2SAndrii Nakryiko 	unsigned __int128 bits80:80;
4953c64779e2SAndrii Nakryiko 	unsigned __int128 ui128;
4954c64779e2SAndrii Nakryiko };
4955c64779e2SAndrii Nakryiko #endif
4956c64779e2SAndrii Nakryiko 
4957c64779e2SAndrii Nakryiko static struct btf_raw_test pprint_test_template[] = {
4958c64779e2SAndrii Nakryiko {
4959c64779e2SAndrii Nakryiko 	.raw_types = {
4960c64779e2SAndrii Nakryiko 		/* unsighed char */			/* [1] */
4961c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
4962c64779e2SAndrii Nakryiko 		/* unsigned short */			/* [2] */
4963c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
4964c64779e2SAndrii Nakryiko 		/* unsigned int */			/* [3] */
4965c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
4966c64779e2SAndrii Nakryiko 		/* int */				/* [4] */
4967c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
4968c64779e2SAndrii Nakryiko 		/* unsigned long long */		/* [5] */
4969c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
4970c64779e2SAndrii Nakryiko 		/* 2 bits */				/* [6] */
4971c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 2, 2),
4972c64779e2SAndrii Nakryiko 		/* 28 bits */				/* [7] */
4973c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 28, 4),
4974c64779e2SAndrii Nakryiko 		/* uint8_t[8] */			/* [8] */
4975c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(9, 1, 8),
4976c64779e2SAndrii Nakryiko 		/* typedef unsigned char uint8_t */	/* [9] */
4977c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),
4978c64779e2SAndrii Nakryiko 		/* typedef unsigned short uint16_t */	/* [10] */
4979c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),
4980c64779e2SAndrii Nakryiko 		/* typedef unsigned int uint32_t */	/* [11] */
4981c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),
4982c64779e2SAndrii Nakryiko 		/* typedef int int32_t */		/* [12] */
4983c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),
4984c64779e2SAndrii Nakryiko 		/* typedef unsigned long long uint64_t *//* [13] */
4985c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 5),
4986c64779e2SAndrii Nakryiko 		/* union (anon) */			/* [14] */
4987c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
4988c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
4989c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 8, 0),	/* uint8_t ui8a[8]; */
4990c64779e2SAndrii Nakryiko 		/* enum (anon) */			/* [15] */
4991c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
4992c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
4993c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
4994c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 2),
4995c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 3),
4996c64779e2SAndrii Nakryiko 		/* struct pprint_mapv */		/* [16] */
4997c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 11), 40),
4998c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, 0),	/* uint32_t ui32 */
4999c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 10, 32),	/* uint16_t ui16 */
5000c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 12, 64),	/* int32_t si32 */
5001c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 96),	/* unused_bits2a */
5002c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 7, 98),	/* bits28 */
5003c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 126),	/* unused_bits2b */
5004c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(0, 14, 128),		/* union (anon) */
5005c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 15, 192),	/* aenum */
5006c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, 224),	/* uint32_t ui32b */
5007c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, 256),	/* bits2c */
5008c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 17, 264),	/* si8_4 */
5009c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(18, 1, 2),		/* [17] */
5010c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 2),		/* [18] */
5011c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5012c64779e2SAndrii Nakryiko 	},
5013c64779e2SAndrii 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"),
5014c64779e2SAndrii Nakryiko 	.key_size = sizeof(unsigned int),
5015c64779e2SAndrii Nakryiko 	.value_size = sizeof(struct pprint_mapv),
5016c64779e2SAndrii Nakryiko 	.key_type_id = 3,	/* unsigned int */
5017c64779e2SAndrii Nakryiko 	.value_type_id = 16,	/* struct pprint_mapv */
5018c64779e2SAndrii Nakryiko 	.max_entries = 128,
5019c64779e2SAndrii Nakryiko },
5020c64779e2SAndrii Nakryiko 
5021c64779e2SAndrii Nakryiko {
5022c64779e2SAndrii Nakryiko 	/* this type will have the same type as the
5023c64779e2SAndrii Nakryiko 	 * first .raw_types definition, but struct type will
5024c64779e2SAndrii Nakryiko 	 * be encoded with kind_flag set.
5025c64779e2SAndrii Nakryiko 	 */
5026c64779e2SAndrii Nakryiko 	.raw_types = {
5027c64779e2SAndrii Nakryiko 		/* unsighed char */			/* [1] */
5028c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
5029c64779e2SAndrii Nakryiko 		/* unsigned short */			/* [2] */
5030c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
5031c64779e2SAndrii Nakryiko 		/* unsigned int */			/* [3] */
5032c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
5033c64779e2SAndrii Nakryiko 		/* int */				/* [4] */
5034c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
5035c64779e2SAndrii Nakryiko 		/* unsigned long long */		/* [5] */
5036c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
5037c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),	/* [6] */
5038c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),	/* [7] */
5039c64779e2SAndrii Nakryiko 		/* uint8_t[8] */			/* [8] */
5040c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(9, 1, 8),
5041c64779e2SAndrii Nakryiko 		/* typedef unsigned char uint8_t */	/* [9] */
5042c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),
5043c64779e2SAndrii Nakryiko 		/* typedef unsigned short uint16_t */	/* [10] */
5044c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),
5045c64779e2SAndrii Nakryiko 		/* typedef unsigned int uint32_t */	/* [11] */
5046c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),
5047c64779e2SAndrii Nakryiko 		/* typedef int int32_t */		/* [12] */
5048c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),
5049c64779e2SAndrii Nakryiko 		/* typedef unsigned long long uint64_t *//* [13] */
5050c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 5),
5051c64779e2SAndrii Nakryiko 		/* union (anon) */			/* [14] */
5052c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
5053c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
5054c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 8, 0),	/* uint8_t ui8a[8]; */
5055c64779e2SAndrii Nakryiko 		/* enum (anon) */			/* [15] */
5056c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
5057c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
5058c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
5059c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 2),
5060c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 3),
5061c64779e2SAndrii Nakryiko 		/* struct pprint_mapv */		/* [16] */
5062c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40),
5063c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)),	/* uint32_t ui32 */
5064c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)),	/* uint16_t ui16 */
5065c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)),	/* int32_t si32 */
5066c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 96)),	/* unused_bits2a */
5067c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)),	/* bits28 */
5068c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 126)),	/* unused_bits2b */
5069c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)),	/* union (anon) */
5070c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)),	/* aenum */
5071c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)),	/* uint32_t ui32b */
5072c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 6, BTF_MEMBER_OFFSET(2, 256)),	/* bits2c */
5073c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 17, 264),	/* si8_4 */
5074c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(18, 1, 2),		/* [17] */
5075c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 2),		/* [18] */
5076c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5077c64779e2SAndrii Nakryiko 	},
5078c64779e2SAndrii 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"),
5079c64779e2SAndrii Nakryiko 	.key_size = sizeof(unsigned int),
5080c64779e2SAndrii Nakryiko 	.value_size = sizeof(struct pprint_mapv),
5081c64779e2SAndrii Nakryiko 	.key_type_id = 3,	/* unsigned int */
5082c64779e2SAndrii Nakryiko 	.value_type_id = 16,	/* struct pprint_mapv */
5083c64779e2SAndrii Nakryiko 	.max_entries = 128,
5084c64779e2SAndrii Nakryiko },
5085c64779e2SAndrii Nakryiko 
5086c64779e2SAndrii Nakryiko {
5087c64779e2SAndrii Nakryiko 	/* this type will have the same layout as the
5088c64779e2SAndrii Nakryiko 	 * first .raw_types definition. The struct type will
5089c64779e2SAndrii Nakryiko 	 * be encoded with kind_flag set, bitfield members
5090c64779e2SAndrii Nakryiko 	 * are added typedef/const/volatile, and bitfield members
5091c64779e2SAndrii Nakryiko 	 * will have both int and enum types.
5092c64779e2SAndrii Nakryiko 	 */
5093c64779e2SAndrii Nakryiko 	.raw_types = {
5094c64779e2SAndrii Nakryiko 		/* unsighed char */			/* [1] */
5095c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 8, 1),
5096c64779e2SAndrii Nakryiko 		/* unsigned short */			/* [2] */
5097c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 16, 2),
5098c64779e2SAndrii Nakryiko 		/* unsigned int */			/* [3] */
5099c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
5100c64779e2SAndrii Nakryiko 		/* int */				/* [4] */
5101c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),
5102c64779e2SAndrii Nakryiko 		/* unsigned long long */		/* [5] */
5103c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),
5104c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),	/* [6] */
5105c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(0, 0, 0, 32, 4),	/* [7] */
5106c64779e2SAndrii Nakryiko 		/* uint8_t[8] */			/* [8] */
5107c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(9, 1, 8),
5108c64779e2SAndrii Nakryiko 		/* typedef unsigned char uint8_t */	/* [9] */
5109c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 1),
5110c64779e2SAndrii Nakryiko 		/* typedef unsigned short uint16_t */	/* [10] */
5111c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),
5112c64779e2SAndrii Nakryiko 		/* typedef unsigned int uint32_t */	/* [11] */
5113c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 3),
5114c64779e2SAndrii Nakryiko 		/* typedef int int32_t */		/* [12] */
5115c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 4),
5116c64779e2SAndrii Nakryiko 		/* typedef unsigned long long uint64_t *//* [13] */
5117c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 5),
5118c64779e2SAndrii Nakryiko 		/* union (anon) */			/* [14] */
5119c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_UNION, 0, 2), 8),
5120c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 13, 0),/* uint64_t ui64; */
5121c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 8, 0),	/* uint8_t ui8a[8]; */
5122c64779e2SAndrii Nakryiko 		/* enum (anon) */			/* [15] */
5123c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 4), 4),
5124c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 0),
5125c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 1),
5126c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 2),
5127c64779e2SAndrii Nakryiko 		BTF_ENUM_ENC(NAME_TBD, 3),
5128c64779e2SAndrii Nakryiko 		/* struct pprint_mapv */		/* [16] */
5129c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 11), 40),
5130c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 0)),	/* uint32_t ui32 */
5131c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 10, BTF_MEMBER_OFFSET(0, 32)),	/* uint16_t ui16 */
5132c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 12, BTF_MEMBER_OFFSET(0, 64)),	/* int32_t si32 */
5133c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 96)),	/* unused_bits2a */
5134c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 7, BTF_MEMBER_OFFSET(28, 98)),	/* bits28 */
5135c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 19, BTF_MEMBER_OFFSET(2, 126)),/* unused_bits2b */
5136c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(0, 14, BTF_MEMBER_OFFSET(0, 128)),	/* union (anon) */
5137c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 15, BTF_MEMBER_OFFSET(0, 192)),	/* aenum */
5138c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 11, BTF_MEMBER_OFFSET(0, 224)),	/* uint32_t ui32b */
5139c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 17, BTF_MEMBER_OFFSET(2, 256)),	/* bits2c */
5140c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 20, BTF_MEMBER_OFFSET(0, 264)),	/* si8_4 */
5141c64779e2SAndrii Nakryiko 		/* typedef unsigned int ___int */	/* [17] */
5142c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 18),
5143c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_VOLATILE, 0, 0), 6),	/* [18] */
5144c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_CONST, 0, 0), 15),	/* [19] */
5145c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(21, 1, 2),					/* [20] */
5146c64779e2SAndrii Nakryiko 		BTF_TYPE_ARRAY_ENC(1, 1, 2),					/* [21] */
5147c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5148c64779e2SAndrii Nakryiko 	},
5149c64779e2SAndrii 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"),
5150c64779e2SAndrii Nakryiko 	.key_size = sizeof(unsigned int),
5151c64779e2SAndrii Nakryiko 	.value_size = sizeof(struct pprint_mapv),
5152c64779e2SAndrii Nakryiko 	.key_type_id = 3,	/* unsigned int */
5153c64779e2SAndrii Nakryiko 	.value_type_id = 16,	/* struct pprint_mapv */
5154c64779e2SAndrii Nakryiko 	.max_entries = 128,
5155c64779e2SAndrii Nakryiko },
5156c64779e2SAndrii Nakryiko 
5157c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
5158c64779e2SAndrii Nakryiko {
5159c64779e2SAndrii Nakryiko 	/* test int128 */
5160c64779e2SAndrii Nakryiko 	.raw_types = {
5161c64779e2SAndrii Nakryiko 		/* unsigned int */				/* [1] */
5162c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),
5163c64779e2SAndrii Nakryiko 		/* __int128 */					/* [2] */
5164c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 128, 16),
5165c64779e2SAndrii Nakryiko 		/* unsigned __int128 */				/* [3] */
5166c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 128, 16),
5167c64779e2SAndrii Nakryiko 		/* struct pprint_mapv_int128 */			/* [4] */
5168c64779e2SAndrii Nakryiko 		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 5), 64),
5169c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 0)),		/* si128a */
5170c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 2, BTF_MEMBER_OFFSET(0, 128)),		/* si128b */
5171c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(3, 256)),		/* bits3 */
5172c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(80, 259)),	/* bits80 */
5173c64779e2SAndrii Nakryiko 		BTF_MEMBER_ENC(NAME_TBD, 3, BTF_MEMBER_OFFSET(0, 384)),		/* ui128 */
5174c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5175c64779e2SAndrii Nakryiko 	},
5176c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0unsigned int\0__int128\0unsigned __int128\0pprint_mapv_int128\0si128a\0si128b\0bits3\0bits80\0ui128"),
5177c64779e2SAndrii Nakryiko 	.key_size = sizeof(unsigned int),
5178c64779e2SAndrii Nakryiko 	.value_size = sizeof(struct pprint_mapv_int128),
5179c64779e2SAndrii Nakryiko 	.key_type_id = 1,
5180c64779e2SAndrii Nakryiko 	.value_type_id = 4,
5181c64779e2SAndrii Nakryiko 	.max_entries = 128,
5182c64779e2SAndrii Nakryiko 	.mapv_kind = PPRINT_MAPV_KIND_INT128,
5183c64779e2SAndrii Nakryiko },
5184c64779e2SAndrii Nakryiko #endif
5185c64779e2SAndrii Nakryiko 
5186c64779e2SAndrii Nakryiko };
5187c64779e2SAndrii Nakryiko 
5188c64779e2SAndrii Nakryiko static struct btf_pprint_test_meta {
5189c64779e2SAndrii Nakryiko 	const char *descr;
5190c64779e2SAndrii Nakryiko 	enum bpf_map_type map_type;
5191c64779e2SAndrii Nakryiko 	const char *map_name;
5192c64779e2SAndrii Nakryiko 	bool ordered_map;
5193c64779e2SAndrii Nakryiko 	bool lossless_map;
5194c64779e2SAndrii Nakryiko 	bool percpu_map;
5195c64779e2SAndrii Nakryiko } pprint_tests_meta[] = {
5196c64779e2SAndrii Nakryiko {
5197c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print array",
5198c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_ARRAY,
5199c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_array",
5200c64779e2SAndrii Nakryiko 	.ordered_map = true,
5201c64779e2SAndrii Nakryiko 	.lossless_map = true,
5202c64779e2SAndrii Nakryiko 	.percpu_map = false,
5203c64779e2SAndrii Nakryiko },
5204c64779e2SAndrii Nakryiko 
5205c64779e2SAndrii Nakryiko {
5206c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print hash",
5207c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_HASH,
5208c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_hash",
5209c64779e2SAndrii Nakryiko 	.ordered_map = false,
5210c64779e2SAndrii Nakryiko 	.lossless_map = true,
5211c64779e2SAndrii Nakryiko 	.percpu_map = false,
5212c64779e2SAndrii Nakryiko },
5213c64779e2SAndrii Nakryiko 
5214c64779e2SAndrii Nakryiko {
5215c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print lru hash",
5216c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_LRU_HASH,
5217c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_lru_hash",
5218c64779e2SAndrii Nakryiko 	.ordered_map = false,
5219c64779e2SAndrii Nakryiko 	.lossless_map = false,
5220c64779e2SAndrii Nakryiko 	.percpu_map = false,
5221c64779e2SAndrii Nakryiko },
5222c64779e2SAndrii Nakryiko 
5223c64779e2SAndrii Nakryiko {
5224c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print percpu array",
5225c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_PERCPU_ARRAY,
5226c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_percpu_array",
5227c64779e2SAndrii Nakryiko 	.ordered_map = true,
5228c64779e2SAndrii Nakryiko 	.lossless_map = true,
5229c64779e2SAndrii Nakryiko 	.percpu_map = true,
5230c64779e2SAndrii Nakryiko },
5231c64779e2SAndrii Nakryiko 
5232c64779e2SAndrii Nakryiko {
5233c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print percpu hash",
5234c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_PERCPU_HASH,
5235c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_percpu_hash",
5236c64779e2SAndrii Nakryiko 	.ordered_map = false,
5237c64779e2SAndrii Nakryiko 	.lossless_map = true,
5238c64779e2SAndrii Nakryiko 	.percpu_map = true,
5239c64779e2SAndrii Nakryiko },
5240c64779e2SAndrii Nakryiko 
5241c64779e2SAndrii Nakryiko {
5242c64779e2SAndrii Nakryiko 	.descr = "BTF pretty print lru percpu hash",
5243c64779e2SAndrii Nakryiko 	.map_type = BPF_MAP_TYPE_LRU_PERCPU_HASH,
5244c64779e2SAndrii Nakryiko 	.map_name = "pprint_test_lru_percpu_hash",
5245c64779e2SAndrii Nakryiko 	.ordered_map = false,
5246c64779e2SAndrii Nakryiko 	.lossless_map = false,
5247c64779e2SAndrii Nakryiko 	.percpu_map = true,
5248c64779e2SAndrii Nakryiko },
5249c64779e2SAndrii Nakryiko 
5250c64779e2SAndrii Nakryiko };
5251c64779e2SAndrii Nakryiko 
get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind)5252c64779e2SAndrii Nakryiko static size_t get_pprint_mapv_size(enum pprint_mapv_kind_t mapv_kind)
5253c64779e2SAndrii Nakryiko {
5254c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_BASIC)
5255c64779e2SAndrii Nakryiko 		return sizeof(struct pprint_mapv);
5256c64779e2SAndrii Nakryiko 
5257c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
5258c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_INT128)
5259c64779e2SAndrii Nakryiko 		return sizeof(struct pprint_mapv_int128);
5260c64779e2SAndrii Nakryiko #endif
5261c64779e2SAndrii Nakryiko 
5262c64779e2SAndrii Nakryiko 	assert(0);
5263*a4c79e79SAndrii Nakryiko 	return 0;
5264c64779e2SAndrii Nakryiko }
5265c64779e2SAndrii Nakryiko 
set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind,void * mapv,uint32_t i,int num_cpus,int rounded_value_size)5266c64779e2SAndrii Nakryiko static void set_pprint_mapv(enum pprint_mapv_kind_t mapv_kind,
5267c64779e2SAndrii Nakryiko 			    void *mapv, uint32_t i,
5268c64779e2SAndrii Nakryiko 			    int num_cpus, int rounded_value_size)
5269c64779e2SAndrii Nakryiko {
5270c64779e2SAndrii Nakryiko 	int cpu;
5271c64779e2SAndrii Nakryiko 
5272c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_BASIC) {
5273c64779e2SAndrii Nakryiko 		struct pprint_mapv *v = mapv;
5274c64779e2SAndrii Nakryiko 
5275c64779e2SAndrii Nakryiko 		for (cpu = 0; cpu < num_cpus; cpu++) {
5276c64779e2SAndrii Nakryiko 			v->ui32 = i + cpu;
5277c64779e2SAndrii Nakryiko 			v->si32 = -i;
5278c64779e2SAndrii Nakryiko 			v->unused_bits2a = 3;
5279c64779e2SAndrii Nakryiko 			v->bits28 = i;
5280c64779e2SAndrii Nakryiko 			v->unused_bits2b = 3;
5281c64779e2SAndrii Nakryiko 			v->ui64 = i;
5282c64779e2SAndrii Nakryiko 			v->aenum = i & 0x03;
5283c64779e2SAndrii Nakryiko 			v->ui32b = 4;
5284c64779e2SAndrii Nakryiko 			v->bits2c = 1;
5285c64779e2SAndrii Nakryiko 			v->si8_4[0][0] = (cpu + i) & 0xff;
5286c64779e2SAndrii Nakryiko 			v->si8_4[0][1] = (cpu + i + 1) & 0xff;
5287c64779e2SAndrii Nakryiko 			v->si8_4[1][0] = (cpu + i + 2) & 0xff;
5288c64779e2SAndrii Nakryiko 			v->si8_4[1][1] = (cpu + i + 3) & 0xff;
5289c64779e2SAndrii Nakryiko 			v = (void *)v + rounded_value_size;
5290c64779e2SAndrii Nakryiko 		}
5291c64779e2SAndrii Nakryiko 	}
5292c64779e2SAndrii Nakryiko 
5293c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
5294c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_INT128) {
5295c64779e2SAndrii Nakryiko 		struct pprint_mapv_int128 *v = mapv;
5296c64779e2SAndrii Nakryiko 
5297c64779e2SAndrii Nakryiko 		for (cpu = 0; cpu < num_cpus; cpu++) {
5298c64779e2SAndrii Nakryiko 			v->si128a = i;
5299c64779e2SAndrii Nakryiko 			v->si128b = -i;
5300c64779e2SAndrii Nakryiko 			v->bits3 = i & 0x07;
5301c64779e2SAndrii Nakryiko 			v->bits80 = (((unsigned __int128)1) << 64) + i;
5302c64779e2SAndrii Nakryiko 			v->ui128 = (((unsigned __int128)2) << 64) + i;
5303c64779e2SAndrii Nakryiko 			v = (void *)v + rounded_value_size;
5304c64779e2SAndrii Nakryiko 		}
5305c64779e2SAndrii Nakryiko 	}
5306c64779e2SAndrii Nakryiko #endif
5307c64779e2SAndrii Nakryiko }
5308c64779e2SAndrii Nakryiko 
get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind,char * expected_line,ssize_t line_size,bool percpu_map,unsigned int next_key,int cpu,void * mapv)5309c64779e2SAndrii Nakryiko ssize_t get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind,
5310c64779e2SAndrii Nakryiko 				 char *expected_line, ssize_t line_size,
5311c64779e2SAndrii Nakryiko 				 bool percpu_map, unsigned int next_key,
5312c64779e2SAndrii Nakryiko 				 int cpu, void *mapv)
5313c64779e2SAndrii Nakryiko {
5314c64779e2SAndrii Nakryiko 	ssize_t nexpected_line = -1;
5315c64779e2SAndrii Nakryiko 
5316c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_BASIC) {
5317c64779e2SAndrii Nakryiko 		struct pprint_mapv *v = mapv;
5318c64779e2SAndrii Nakryiko 
5319c64779e2SAndrii Nakryiko 		nexpected_line = snprintf(expected_line, line_size,
5320c64779e2SAndrii Nakryiko 					  "%s%u: {%u,0,%d,0x%x,0x%x,0x%x,"
5321c64779e2SAndrii Nakryiko 					  "{%llu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s,"
5322c64779e2SAndrii Nakryiko 					  "%u,0x%x,[[%d,%d],[%d,%d]]}\n",
5323c64779e2SAndrii Nakryiko 					  percpu_map ? "\tcpu" : "",
5324c64779e2SAndrii Nakryiko 					  percpu_map ? cpu : next_key,
5325c64779e2SAndrii Nakryiko 					  v->ui32, v->si32,
5326c64779e2SAndrii Nakryiko 					  v->unused_bits2a,
5327c64779e2SAndrii Nakryiko 					  v->bits28,
5328c64779e2SAndrii Nakryiko 					  v->unused_bits2b,
5329c64779e2SAndrii Nakryiko 					  (__u64)v->ui64,
5330c64779e2SAndrii Nakryiko 					  v->ui8a[0], v->ui8a[1],
5331c64779e2SAndrii Nakryiko 					  v->ui8a[2], v->ui8a[3],
5332c64779e2SAndrii Nakryiko 					  v->ui8a[4], v->ui8a[5],
5333c64779e2SAndrii Nakryiko 					  v->ui8a[6], v->ui8a[7],
5334c64779e2SAndrii Nakryiko 					  pprint_enum_str[v->aenum],
5335c64779e2SAndrii Nakryiko 					  v->ui32b,
5336c64779e2SAndrii Nakryiko 					  v->bits2c,
5337c64779e2SAndrii Nakryiko 					  v->si8_4[0][0], v->si8_4[0][1],
5338c64779e2SAndrii Nakryiko 					  v->si8_4[1][0], v->si8_4[1][1]);
5339c64779e2SAndrii Nakryiko 	}
5340c64779e2SAndrii Nakryiko 
5341c64779e2SAndrii Nakryiko #ifdef __SIZEOF_INT128__
5342c64779e2SAndrii Nakryiko 	if (mapv_kind == PPRINT_MAPV_KIND_INT128) {
5343c64779e2SAndrii Nakryiko 		struct pprint_mapv_int128 *v = mapv;
5344c64779e2SAndrii Nakryiko 
5345c64779e2SAndrii Nakryiko 		nexpected_line = snprintf(expected_line, line_size,
5346c64779e2SAndrii Nakryiko 					  "%s%u: {0x%lx,0x%lx,0x%lx,"
5347c64779e2SAndrii Nakryiko 					  "0x%lx%016lx,0x%lx%016lx}\n",
5348c64779e2SAndrii Nakryiko 					  percpu_map ? "\tcpu" : "",
5349c64779e2SAndrii Nakryiko 					  percpu_map ? cpu : next_key,
5350c64779e2SAndrii Nakryiko 					  (uint64_t)v->si128a,
5351c64779e2SAndrii Nakryiko 					  (uint64_t)v->si128b,
5352c64779e2SAndrii Nakryiko 					  (uint64_t)v->bits3,
5353c64779e2SAndrii Nakryiko 					  (uint64_t)(v->bits80 >> 64),
5354c64779e2SAndrii Nakryiko 					  (uint64_t)v->bits80,
5355c64779e2SAndrii Nakryiko 					  (uint64_t)(v->ui128 >> 64),
5356c64779e2SAndrii Nakryiko 					  (uint64_t)v->ui128);
5357c64779e2SAndrii Nakryiko 	}
5358c64779e2SAndrii Nakryiko #endif
5359c64779e2SAndrii Nakryiko 
5360c64779e2SAndrii Nakryiko 	return nexpected_line;
5361c64779e2SAndrii Nakryiko }
5362c64779e2SAndrii Nakryiko 
check_line(const char * expected_line,int nexpected_line,int expected_line_len,const char * line)5363c64779e2SAndrii Nakryiko static int check_line(const char *expected_line, int nexpected_line,
5364c64779e2SAndrii Nakryiko 		      int expected_line_len, const char *line)
5365c64779e2SAndrii Nakryiko {
5366c64779e2SAndrii Nakryiko 	if (CHECK(nexpected_line == expected_line_len,
5367c64779e2SAndrii Nakryiko 		  "expected_line is too long"))
5368c64779e2SAndrii Nakryiko 		return -1;
5369c64779e2SAndrii Nakryiko 
5370c64779e2SAndrii Nakryiko 	if (strcmp(expected_line, line)) {
5371c64779e2SAndrii Nakryiko 		fprintf(stderr, "unexpected pprint output\n");
5372c64779e2SAndrii Nakryiko 		fprintf(stderr, "expected: %s", expected_line);
5373c64779e2SAndrii Nakryiko 		fprintf(stderr, "    read: %s", line);
5374c64779e2SAndrii Nakryiko 		return -1;
5375c64779e2SAndrii Nakryiko 	}
5376c64779e2SAndrii Nakryiko 
5377c64779e2SAndrii Nakryiko 	return 0;
5378c64779e2SAndrii Nakryiko }
5379c64779e2SAndrii Nakryiko 
5380c64779e2SAndrii Nakryiko 
do_test_pprint(int test_num)5381c64779e2SAndrii Nakryiko static void do_test_pprint(int test_num)
5382c64779e2SAndrii Nakryiko {
5383c64779e2SAndrii Nakryiko 	const struct btf_raw_test *test = &pprint_test_template[test_num];
5384c64779e2SAndrii Nakryiko 	enum pprint_mapv_kind_t mapv_kind = test->mapv_kind;
53852fe256a4SAndrii Nakryiko 	LIBBPF_OPTS(bpf_map_create_opts, opts);
5386c64779e2SAndrii Nakryiko 	bool ordered_map, lossless_map, percpu_map;
5387c64779e2SAndrii Nakryiko 	int err, ret, num_cpus, rounded_value_size;
5388c64779e2SAndrii Nakryiko 	unsigned int key, nr_read_elems;
5389c64779e2SAndrii Nakryiko 	int map_fd = -1, btf_fd = -1;
5390c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
5391c64779e2SAndrii Nakryiko 	char expected_line[255];
5392c64779e2SAndrii Nakryiko 	FILE *pin_file = NULL;
5393c64779e2SAndrii Nakryiko 	char pin_path[255];
5394c64779e2SAndrii Nakryiko 	size_t line_len = 0;
5395c64779e2SAndrii Nakryiko 	char *line = NULL;
5396c64779e2SAndrii Nakryiko 	void *mapv = NULL;
5397c64779e2SAndrii Nakryiko 	uint8_t *raw_btf;
5398c64779e2SAndrii Nakryiko 	ssize_t nread;
5399c64779e2SAndrii Nakryiko 
5400c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
5401c64779e2SAndrii Nakryiko 		return;
5402c64779e2SAndrii Nakryiko 
5403c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types,
5404c64779e2SAndrii Nakryiko 				 test->str_sec, test->str_sec_size,
5405c64779e2SAndrii Nakryiko 				 &raw_btf_size, NULL);
5406c64779e2SAndrii Nakryiko 
5407c64779e2SAndrii Nakryiko 	if (!raw_btf)
5408c64779e2SAndrii Nakryiko 		return;
5409c64779e2SAndrii Nakryiko 
5410c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
5411dc94121bSAndrii Nakryiko 	btf_fd = load_raw_btf(raw_btf, raw_btf_size);
5412c64779e2SAndrii Nakryiko 	free(raw_btf);
5413c64779e2SAndrii Nakryiko 
5414dc94121bSAndrii Nakryiko 	if (CHECK(btf_fd < 0, "errno:%d\n", errno)) {
5415c64779e2SAndrii Nakryiko 		err = -1;
5416c64779e2SAndrii Nakryiko 		goto done;
5417c64779e2SAndrii Nakryiko 	}
5418c64779e2SAndrii Nakryiko 
54192fe256a4SAndrii Nakryiko 	opts.btf_fd = btf_fd;
54202fe256a4SAndrii Nakryiko 	opts.btf_key_type_id = test->key_type_id;
54212fe256a4SAndrii Nakryiko 	opts.btf_value_type_id = test->value_type_id;
54222fe256a4SAndrii Nakryiko 	map_fd = bpf_map_create(test->map_type, test->map_name,
54232fe256a4SAndrii Nakryiko 				test->key_size, test->value_size, test->max_entries, &opts);
5424bad2e478SAndrii Nakryiko 	if (CHECK(map_fd < 0, "errno:%d", errno)) {
5425c64779e2SAndrii Nakryiko 		err = -1;
5426c64779e2SAndrii Nakryiko 		goto done;
5427c64779e2SAndrii Nakryiko 	}
5428c64779e2SAndrii Nakryiko 
5429c64779e2SAndrii Nakryiko 	ret = snprintf(pin_path, sizeof(pin_path), "%s/%s",
5430c64779e2SAndrii Nakryiko 		       "/sys/fs/bpf", test->map_name);
5431c64779e2SAndrii Nakryiko 
5432c5d22f4cSDan Carpenter 	if (CHECK(ret >= sizeof(pin_path), "pin_path %s/%s is too long",
5433c64779e2SAndrii Nakryiko 		  "/sys/fs/bpf", test->map_name)) {
5434c64779e2SAndrii Nakryiko 		err = -1;
5435c64779e2SAndrii Nakryiko 		goto done;
5436c64779e2SAndrii Nakryiko 	}
5437c64779e2SAndrii Nakryiko 
5438c64779e2SAndrii Nakryiko 	err = bpf_obj_pin(map_fd, pin_path);
5439c64779e2SAndrii Nakryiko 	if (CHECK(err, "bpf_obj_pin(%s): errno:%d.", pin_path, errno))
5440c64779e2SAndrii Nakryiko 		goto done;
5441c64779e2SAndrii Nakryiko 
5442c64779e2SAndrii Nakryiko 	percpu_map = test->percpu_map;
5443c64779e2SAndrii Nakryiko 	num_cpus = percpu_map ? bpf_num_possible_cpus() : 1;
5444c64779e2SAndrii Nakryiko 	rounded_value_size = round_up(get_pprint_mapv_size(mapv_kind), 8);
5445c64779e2SAndrii Nakryiko 	mapv = calloc(num_cpus, rounded_value_size);
5446c64779e2SAndrii Nakryiko 	if (CHECK(!mapv, "mapv allocation failure")) {
5447c64779e2SAndrii Nakryiko 		err = -1;
5448c64779e2SAndrii Nakryiko 		goto done;
5449c64779e2SAndrii Nakryiko 	}
5450c64779e2SAndrii Nakryiko 
5451c64779e2SAndrii Nakryiko 	for (key = 0; key < test->max_entries; key++) {
5452c64779e2SAndrii Nakryiko 		set_pprint_mapv(mapv_kind, mapv, key, num_cpus, rounded_value_size);
5453c64779e2SAndrii Nakryiko 		bpf_map_update_elem(map_fd, &key, mapv, 0);
5454c64779e2SAndrii Nakryiko 	}
5455c64779e2SAndrii Nakryiko 
5456c64779e2SAndrii Nakryiko 	pin_file = fopen(pin_path, "r");
5457c64779e2SAndrii Nakryiko 	if (CHECK(!pin_file, "fopen(%s): errno:%d", pin_path, errno)) {
5458c64779e2SAndrii Nakryiko 		err = -1;
5459c64779e2SAndrii Nakryiko 		goto done;
5460c64779e2SAndrii Nakryiko 	}
5461c64779e2SAndrii Nakryiko 
5462c64779e2SAndrii Nakryiko 	/* Skip lines start with '#' */
5463c64779e2SAndrii Nakryiko 	while ((nread = getline(&line, &line_len, pin_file)) > 0 &&
5464c64779e2SAndrii Nakryiko 	       *line == '#')
5465c64779e2SAndrii Nakryiko 		;
5466c64779e2SAndrii Nakryiko 
5467c64779e2SAndrii Nakryiko 	if (CHECK(nread <= 0, "Unexpected EOF")) {
5468c64779e2SAndrii Nakryiko 		err = -1;
5469c64779e2SAndrii Nakryiko 		goto done;
5470c64779e2SAndrii Nakryiko 	}
5471c64779e2SAndrii Nakryiko 
5472c64779e2SAndrii Nakryiko 	nr_read_elems = 0;
5473c64779e2SAndrii Nakryiko 	ordered_map = test->ordered_map;
5474c64779e2SAndrii Nakryiko 	lossless_map = test->lossless_map;
5475c64779e2SAndrii Nakryiko 	do {
5476c64779e2SAndrii Nakryiko 		ssize_t nexpected_line;
5477c64779e2SAndrii Nakryiko 		unsigned int next_key;
5478c64779e2SAndrii Nakryiko 		void *cmapv;
5479c64779e2SAndrii Nakryiko 		int cpu;
5480c64779e2SAndrii Nakryiko 
5481c64779e2SAndrii Nakryiko 		next_key = ordered_map ? nr_read_elems : atoi(line);
5482c64779e2SAndrii Nakryiko 		set_pprint_mapv(mapv_kind, mapv, next_key, num_cpus, rounded_value_size);
5483c64779e2SAndrii Nakryiko 		cmapv = mapv;
5484c64779e2SAndrii Nakryiko 
5485c64779e2SAndrii Nakryiko 		for (cpu = 0; cpu < num_cpus; cpu++) {
5486c64779e2SAndrii Nakryiko 			if (percpu_map) {
5487c64779e2SAndrii Nakryiko 				/* for percpu map, the format looks like:
5488c64779e2SAndrii Nakryiko 				 * <key>: {
5489c64779e2SAndrii Nakryiko 				 *	cpu0: <value_on_cpu0>
5490c64779e2SAndrii Nakryiko 				 *	cpu1: <value_on_cpu1>
5491c64779e2SAndrii Nakryiko 				 *	...
5492c64779e2SAndrii Nakryiko 				 *	cpun: <value_on_cpun>
5493c64779e2SAndrii Nakryiko 				 * }
5494c64779e2SAndrii Nakryiko 				 *
5495c64779e2SAndrii Nakryiko 				 * let us verify the line containing the key here.
5496c64779e2SAndrii Nakryiko 				 */
5497c64779e2SAndrii Nakryiko 				if (cpu == 0) {
5498c64779e2SAndrii Nakryiko 					nexpected_line = snprintf(expected_line,
5499c64779e2SAndrii Nakryiko 								  sizeof(expected_line),
5500c64779e2SAndrii Nakryiko 								  "%u: {\n",
5501c64779e2SAndrii Nakryiko 								  next_key);
5502c64779e2SAndrii Nakryiko 
5503c64779e2SAndrii Nakryiko 					err = check_line(expected_line, nexpected_line,
5504c64779e2SAndrii Nakryiko 							 sizeof(expected_line), line);
5505bad2e478SAndrii Nakryiko 					if (err < 0)
5506c64779e2SAndrii Nakryiko 						goto done;
5507c64779e2SAndrii Nakryiko 				}
5508c64779e2SAndrii Nakryiko 
5509c64779e2SAndrii Nakryiko 				/* read value@cpu */
5510c64779e2SAndrii Nakryiko 				nread = getline(&line, &line_len, pin_file);
5511c64779e2SAndrii Nakryiko 				if (nread < 0)
5512c64779e2SAndrii Nakryiko 					break;
5513c64779e2SAndrii Nakryiko 			}
5514c64779e2SAndrii Nakryiko 
5515c64779e2SAndrii Nakryiko 			nexpected_line = get_pprint_expected_line(mapv_kind, expected_line,
5516c64779e2SAndrii Nakryiko 								  sizeof(expected_line),
5517c64779e2SAndrii Nakryiko 								  percpu_map, next_key,
5518c64779e2SAndrii Nakryiko 								  cpu, cmapv);
5519c64779e2SAndrii Nakryiko 			err = check_line(expected_line, nexpected_line,
5520c64779e2SAndrii Nakryiko 					 sizeof(expected_line), line);
5521bad2e478SAndrii Nakryiko 			if (err < 0)
5522c64779e2SAndrii Nakryiko 				goto done;
5523c64779e2SAndrii Nakryiko 
5524c64779e2SAndrii Nakryiko 			cmapv = cmapv + rounded_value_size;
5525c64779e2SAndrii Nakryiko 		}
5526c64779e2SAndrii Nakryiko 
5527c64779e2SAndrii Nakryiko 		if (percpu_map) {
5528c64779e2SAndrii Nakryiko 			/* skip the last bracket for the percpu map */
5529c64779e2SAndrii Nakryiko 			nread = getline(&line, &line_len, pin_file);
5530c64779e2SAndrii Nakryiko 			if (nread < 0)
5531c64779e2SAndrii Nakryiko 				break;
5532c64779e2SAndrii Nakryiko 		}
5533c64779e2SAndrii Nakryiko 
5534c64779e2SAndrii Nakryiko 		nread = getline(&line, &line_len, pin_file);
5535c64779e2SAndrii Nakryiko 	} while (++nr_read_elems < test->max_entries && nread > 0);
5536c64779e2SAndrii Nakryiko 
5537c64779e2SAndrii Nakryiko 	if (lossless_map &&
5538c64779e2SAndrii Nakryiko 	    CHECK(nr_read_elems < test->max_entries,
5539c64779e2SAndrii Nakryiko 		  "Unexpected EOF. nr_read_elems:%u test->max_entries:%u",
5540c64779e2SAndrii Nakryiko 		  nr_read_elems, test->max_entries)) {
5541c64779e2SAndrii Nakryiko 		err = -1;
5542c64779e2SAndrii Nakryiko 		goto done;
5543c64779e2SAndrii Nakryiko 	}
5544c64779e2SAndrii Nakryiko 
5545c64779e2SAndrii Nakryiko 	if (CHECK(nread > 0, "Unexpected extra pprint output: %s", line)) {
5546c64779e2SAndrii Nakryiko 		err = -1;
5547c64779e2SAndrii Nakryiko 		goto done;
5548c64779e2SAndrii Nakryiko 	}
5549c64779e2SAndrii Nakryiko 
5550c64779e2SAndrii Nakryiko 	err = 0;
5551c64779e2SAndrii Nakryiko 
5552c64779e2SAndrii Nakryiko done:
5553c64779e2SAndrii Nakryiko 	if (mapv)
5554c64779e2SAndrii Nakryiko 		free(mapv);
5555c64779e2SAndrii Nakryiko 	if (!err)
5556c64779e2SAndrii Nakryiko 		fprintf(stderr, "OK");
5557c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
5558c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
5559bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
5560c64779e2SAndrii Nakryiko 		close(btf_fd);
5561bad2e478SAndrii Nakryiko 	if (map_fd >= 0)
5562c64779e2SAndrii Nakryiko 		close(map_fd);
5563c64779e2SAndrii Nakryiko 	if (pin_file)
5564c64779e2SAndrii Nakryiko 		fclose(pin_file);
5565c64779e2SAndrii Nakryiko 	unlink(pin_path);
5566c64779e2SAndrii Nakryiko 	free(line);
5567c64779e2SAndrii Nakryiko }
5568c64779e2SAndrii Nakryiko 
test_pprint(void)5569c64779e2SAndrii Nakryiko static void test_pprint(void)
5570c64779e2SAndrii Nakryiko {
5571c64779e2SAndrii Nakryiko 	unsigned int i;
5572c64779e2SAndrii Nakryiko 
5573c64779e2SAndrii Nakryiko 	/* test various maps with the first test template */
5574c64779e2SAndrii Nakryiko 	for (i = 0; i < ARRAY_SIZE(pprint_tests_meta); i++) {
5575c64779e2SAndrii Nakryiko 		pprint_test_template[0].descr = pprint_tests_meta[i].descr;
5576c64779e2SAndrii Nakryiko 		pprint_test_template[0].map_type = pprint_tests_meta[i].map_type;
5577c64779e2SAndrii Nakryiko 		pprint_test_template[0].map_name = pprint_tests_meta[i].map_name;
5578c64779e2SAndrii Nakryiko 		pprint_test_template[0].ordered_map = pprint_tests_meta[i].ordered_map;
5579c64779e2SAndrii Nakryiko 		pprint_test_template[0].lossless_map = pprint_tests_meta[i].lossless_map;
5580c64779e2SAndrii Nakryiko 		pprint_test_template[0].percpu_map = pprint_tests_meta[i].percpu_map;
5581c64779e2SAndrii Nakryiko 
5582c64779e2SAndrii Nakryiko 		do_test_pprint(0);
5583c64779e2SAndrii Nakryiko 	}
5584c64779e2SAndrii Nakryiko 
5585c64779e2SAndrii Nakryiko 	/* test rest test templates with the first map */
5586c64779e2SAndrii Nakryiko 	for (i = 1; i < ARRAY_SIZE(pprint_test_template); i++) {
5587c64779e2SAndrii Nakryiko 		pprint_test_template[i].descr = pprint_tests_meta[0].descr;
5588c64779e2SAndrii Nakryiko 		pprint_test_template[i].map_type = pprint_tests_meta[0].map_type;
5589c64779e2SAndrii Nakryiko 		pprint_test_template[i].map_name = pprint_tests_meta[0].map_name;
5590c64779e2SAndrii Nakryiko 		pprint_test_template[i].ordered_map = pprint_tests_meta[0].ordered_map;
5591c64779e2SAndrii Nakryiko 		pprint_test_template[i].lossless_map = pprint_tests_meta[0].lossless_map;
5592c64779e2SAndrii Nakryiko 		pprint_test_template[i].percpu_map = pprint_tests_meta[0].percpu_map;
5593c64779e2SAndrii Nakryiko 		do_test_pprint(i);
5594c64779e2SAndrii Nakryiko 	}
5595c64779e2SAndrii Nakryiko }
5596c64779e2SAndrii Nakryiko 
5597c64779e2SAndrii Nakryiko #define BPF_LINE_INFO_ENC(insn_off, file_off, line_off, line_num, line_col) \
5598c64779e2SAndrii Nakryiko 	(insn_off), (file_off), (line_off), ((line_num) << 10 | ((line_col) & 0x3ff))
5599c64779e2SAndrii Nakryiko 
5600c64779e2SAndrii Nakryiko static struct prog_info_raw_test {
5601c64779e2SAndrii Nakryiko 	const char *descr;
5602c64779e2SAndrii Nakryiko 	const char *str_sec;
5603c64779e2SAndrii Nakryiko 	const char *err_str;
5604c64779e2SAndrii Nakryiko 	__u32 raw_types[MAX_NR_RAW_U32];
5605c64779e2SAndrii Nakryiko 	__u32 str_sec_size;
5606c64779e2SAndrii Nakryiko 	struct bpf_insn insns[MAX_INSNS];
5607c64779e2SAndrii Nakryiko 	__u32 prog_type;
5608c64779e2SAndrii Nakryiko 	__u32 func_info[MAX_SUBPROGS][2];
5609c64779e2SAndrii Nakryiko 	__u32 func_info_rec_size;
5610c64779e2SAndrii Nakryiko 	__u32 func_info_cnt;
5611c64779e2SAndrii Nakryiko 	__u32 line_info[MAX_NR_RAW_U32];
5612c64779e2SAndrii Nakryiko 	__u32 line_info_rec_size;
5613c64779e2SAndrii Nakryiko 	__u32 nr_jited_ksyms;
5614c64779e2SAndrii Nakryiko 	bool expected_prog_load_failure;
5615c64779e2SAndrii Nakryiko 	__u32 dead_code_cnt;
5616c64779e2SAndrii Nakryiko 	__u32 dead_code_mask;
5617c64779e2SAndrii Nakryiko 	__u32 dead_func_cnt;
5618c64779e2SAndrii Nakryiko 	__u32 dead_func_mask;
5619c64779e2SAndrii Nakryiko } info_raw_tests[] = {
5620c64779e2SAndrii Nakryiko {
5621c64779e2SAndrii Nakryiko 	.descr = "func_type (main func + one sub)",
5622c64779e2SAndrii Nakryiko 	.raw_types = {
5623c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5624c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),	/* [2] */
5625c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
5626c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5627c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5628c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [4] */
5629c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5630c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5631c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [5] */
5632c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 4),			/* [6] */
5633c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5634c64779e2SAndrii Nakryiko 	},
5635c64779e2SAndrii Nakryiko 	.str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5636c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5637c64779e2SAndrii Nakryiko 	.insns = {
5638c64779e2SAndrii Nakryiko 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5639c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5640c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5641c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 2),
5642c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5643c64779e2SAndrii Nakryiko 	},
5644c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5645c64779e2SAndrii Nakryiko 	.func_info = { {0, 5}, {3, 6} },
5646c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5647c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5648c64779e2SAndrii Nakryiko 	.line_info = { BTF_END_RAW },
5649c64779e2SAndrii Nakryiko },
5650c64779e2SAndrii Nakryiko 
5651c64779e2SAndrii Nakryiko {
5652c64779e2SAndrii Nakryiko 	.descr = "func_type (Incorrect func_info_rec_size)",
5653c64779e2SAndrii Nakryiko 	.raw_types = {
5654c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5655c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),	/* [2] */
5656c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
5657c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5658c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5659c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [4] */
5660c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5661c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5662c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [5] */
5663c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 4),			/* [6] */
5664c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5665c64779e2SAndrii Nakryiko 	},
5666c64779e2SAndrii Nakryiko 	.str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5667c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5668c64779e2SAndrii Nakryiko 	.insns = {
5669c64779e2SAndrii Nakryiko 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5670c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5671c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5672c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 2),
5673c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5674c64779e2SAndrii Nakryiko 	},
5675c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5676c64779e2SAndrii Nakryiko 	.func_info = { {0, 5}, {3, 6} },
5677c64779e2SAndrii Nakryiko 	.func_info_rec_size = 4,
5678c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5679c64779e2SAndrii Nakryiko 	.line_info = { BTF_END_RAW },
5680c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5681c64779e2SAndrii Nakryiko },
5682c64779e2SAndrii Nakryiko 
5683c64779e2SAndrii Nakryiko {
5684c64779e2SAndrii Nakryiko 	.descr = "func_type (Incorrect func_info_cnt)",
5685c64779e2SAndrii Nakryiko 	.raw_types = {
5686c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5687c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),	/* [2] */
5688c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
5689c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5690c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5691c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [4] */
5692c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5693c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5694c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [5] */
5695c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 4),			/* [6] */
5696c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5697c64779e2SAndrii Nakryiko 	},
5698c64779e2SAndrii Nakryiko 	.str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5699c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5700c64779e2SAndrii Nakryiko 	.insns = {
5701c64779e2SAndrii Nakryiko 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5702c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5703c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5704c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 2),
5705c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5706c64779e2SAndrii Nakryiko 	},
5707c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5708c64779e2SAndrii Nakryiko 	.func_info = { {0, 5}, {3, 6} },
5709c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5710c64779e2SAndrii Nakryiko 	.func_info_cnt = 1,
5711c64779e2SAndrii Nakryiko 	.line_info = { BTF_END_RAW },
5712c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5713c64779e2SAndrii Nakryiko },
5714c64779e2SAndrii Nakryiko 
5715c64779e2SAndrii Nakryiko {
5716c64779e2SAndrii Nakryiko 	.descr = "func_type (Incorrect bpf_func_info.insn_off)",
5717c64779e2SAndrii Nakryiko 	.raw_types = {
5718c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5719c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 32, 4),	/* [2] */
5720c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [3] */
5721c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5722c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5723c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 2),			/* [4] */
5724c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 2),
5725c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5726c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 3),			/* [5] */
5727c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 4),			/* [6] */
5728c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5729c64779e2SAndrii Nakryiko 	},
5730c64779e2SAndrii Nakryiko 	.str_sec = "\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB",
5731c64779e2SAndrii Nakryiko 	.str_sec_size = sizeof("\0int\0unsigned int\0a\0b\0c\0d\0funcA\0funcB"),
5732c64779e2SAndrii Nakryiko 	.insns = {
5733c64779e2SAndrii Nakryiko 		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5734c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5735c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5736c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 2),
5737c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5738c64779e2SAndrii Nakryiko 	},
5739c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5740c64779e2SAndrii Nakryiko 	.func_info = { {0, 5}, {2, 6} },
5741c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5742c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5743c64779e2SAndrii Nakryiko 	.line_info = { BTF_END_RAW },
5744c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5745c64779e2SAndrii Nakryiko },
5746c64779e2SAndrii Nakryiko 
5747c64779e2SAndrii Nakryiko {
5748c64779e2SAndrii Nakryiko 	.descr = "line_info (No subprog)",
5749c64779e2SAndrii Nakryiko 	.raw_types = {
5750c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5751c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5752c64779e2SAndrii Nakryiko 	},
5753c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5754c64779e2SAndrii Nakryiko 	.insns = {
5755c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5756c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5757c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5758c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5759c64779e2SAndrii Nakryiko 	},
5760c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5761c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5762c64779e2SAndrii Nakryiko 	.line_info = {
5763c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5764c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
5765c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5766c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
5767c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5768c64779e2SAndrii Nakryiko 	},
5769c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5770c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5771c64779e2SAndrii Nakryiko },
5772c64779e2SAndrii Nakryiko 
5773c64779e2SAndrii Nakryiko {
5774c64779e2SAndrii Nakryiko 	.descr = "line_info (No subprog. insn_off >= prog->len)",
5775c64779e2SAndrii Nakryiko 	.raw_types = {
5776c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5777c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5778c64779e2SAndrii Nakryiko 	},
5779c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5780c64779e2SAndrii Nakryiko 	.insns = {
5781c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5782c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5783c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5784c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5785c64779e2SAndrii Nakryiko 	},
5786c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5787c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5788c64779e2SAndrii Nakryiko 	.line_info = {
5789c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5790c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
5791c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5792c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
5793c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, 0, 5, 6),
5794c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5795c64779e2SAndrii Nakryiko 	},
5796c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5797c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5798c64779e2SAndrii Nakryiko 	.err_str = "line_info[4].insn_off",
5799c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5800c64779e2SAndrii Nakryiko },
5801c64779e2SAndrii Nakryiko 
5802c64779e2SAndrii Nakryiko {
5803c64779e2SAndrii Nakryiko 	.descr = "line_info (Zero bpf insn code)",
5804c64779e2SAndrii Nakryiko 	.raw_types = {
5805c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5806c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, 0, 0, 64, 8),	/* [2] */
5807c64779e2SAndrii Nakryiko 		BTF_TYPEDEF_ENC(NAME_TBD, 2),			/* [3] */
5808c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5809c64779e2SAndrii Nakryiko 	},
5810c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0unsigned long\0u64\0u64 a=1;\0return a;"),
5811c64779e2SAndrii Nakryiko 	.insns = {
5812c64779e2SAndrii Nakryiko 		BPF_LD_IMM64(BPF_REG_0, 1),
5813c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5814c64779e2SAndrii Nakryiko 	},
5815c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5816c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5817c64779e2SAndrii Nakryiko 	.line_info = {
5818c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5819c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, 0, 2, 9),
5820c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
5821c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5822c64779e2SAndrii Nakryiko 	},
5823c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5824c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5825c64779e2SAndrii Nakryiko 	.err_str = "Invalid insn code at line_info[1]",
5826c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5827c64779e2SAndrii Nakryiko },
5828c64779e2SAndrii Nakryiko 
5829c64779e2SAndrii Nakryiko {
5830c64779e2SAndrii Nakryiko 	.descr = "line_info (No subprog. zero tailing line_info",
5831c64779e2SAndrii Nakryiko 	.raw_types = {
5832c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5833c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5834c64779e2SAndrii Nakryiko 	},
5835c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5836c64779e2SAndrii Nakryiko 	.insns = {
5837c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5838c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5839c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5840c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5841c64779e2SAndrii Nakryiko 	},
5842c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5843c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5844c64779e2SAndrii Nakryiko 	.line_info = {
5845c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0,
5846c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0,
5847c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0,
5848c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 0,
5849c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5850c64779e2SAndrii Nakryiko 	},
5851c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32),
5852c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5853c64779e2SAndrii Nakryiko },
5854c64779e2SAndrii Nakryiko 
5855c64779e2SAndrii Nakryiko {
5856c64779e2SAndrii Nakryiko 	.descr = "line_info (No subprog. nonzero tailing line_info)",
5857c64779e2SAndrii Nakryiko 	.raw_types = {
5858c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5859c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5860c64779e2SAndrii Nakryiko 	},
5861c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
5862c64779e2SAndrii Nakryiko 	.insns = {
5863c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
5864c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
5865c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
5866c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5867c64779e2SAndrii Nakryiko 	},
5868c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5869c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5870c64779e2SAndrii Nakryiko 	.line_info = {
5871c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10), 0,
5872c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9), 0,
5873c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8), 0,
5874c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7), 1,
5875c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5876c64779e2SAndrii Nakryiko 	},
5877c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info) + sizeof(__u32),
5878c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
5879c64779e2SAndrii Nakryiko 	.err_str = "nonzero tailing record in line_info",
5880c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5881c64779e2SAndrii Nakryiko },
5882c64779e2SAndrii Nakryiko 
5883c64779e2SAndrii Nakryiko {
5884c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog)",
5885c64779e2SAndrii Nakryiko 	.raw_types = {
5886c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5887c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5888c64779e2SAndrii Nakryiko 	},
5889c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5890c64779e2SAndrii Nakryiko 	.insns = {
5891c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5892c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5893c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5894c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5895c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5896c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5897c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5898c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5899c64779e2SAndrii Nakryiko 	},
5900c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5901c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5902c64779e2SAndrii Nakryiko 	.line_info = {
5903c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5904c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5905c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5906c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5907c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5908c64779e2SAndrii Nakryiko 	},
5909c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5910c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5911c64779e2SAndrii Nakryiko },
5912c64779e2SAndrii Nakryiko 
5913c64779e2SAndrii Nakryiko {
5914c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog + func_info)",
5915c64779e2SAndrii Nakryiko 	.raw_types = {
5916c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5917c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
5918c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
5919c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
5920c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
5921c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5922c64779e2SAndrii Nakryiko 	},
5923c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5924c64779e2SAndrii Nakryiko 	.insns = {
5925c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5926c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5927c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5928c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5929c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5930c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5931c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5932c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5933c64779e2SAndrii Nakryiko 	},
5934c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5935c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
5936c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
5937c64779e2SAndrii Nakryiko 	.func_info = { {0, 4}, {5, 3} },
5938c64779e2SAndrii Nakryiko 	.line_info = {
5939c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
5940c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5941c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5942c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5943c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5944c64779e2SAndrii Nakryiko 	},
5945c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5946c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5947c64779e2SAndrii Nakryiko },
5948c64779e2SAndrii Nakryiko 
5949c64779e2SAndrii Nakryiko {
5950c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog. missing 1st func line info)",
5951c64779e2SAndrii Nakryiko 	.raw_types = {
5952c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5953c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5954c64779e2SAndrii Nakryiko 	},
5955c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5956c64779e2SAndrii Nakryiko 	.insns = {
5957c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5958c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5959c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5960c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5961c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5962c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5963c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5964c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5965c64779e2SAndrii Nakryiko 	},
5966c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5967c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
5968c64779e2SAndrii Nakryiko 	.line_info = {
5969c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 1, 10),
5970c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
5971c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 3, 8),
5972c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
5973c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5974c64779e2SAndrii Nakryiko 	},
5975c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
5976c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
5977c64779e2SAndrii Nakryiko 	.err_str = "missing bpf_line_info for func#0",
5978c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
5979c64779e2SAndrii Nakryiko },
5980c64779e2SAndrii Nakryiko 
5981c64779e2SAndrii Nakryiko {
5982c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog. missing 2nd func line info)",
5983c64779e2SAndrii Nakryiko 	.raw_types = {
5984c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
5985c64779e2SAndrii Nakryiko 		BTF_END_RAW,
5986c64779e2SAndrii Nakryiko 	},
5987c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
5988c64779e2SAndrii Nakryiko 	.insns = {
5989c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
5990c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
5991c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
5992c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
5993c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5994c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
5995c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
5996c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
5997c64779e2SAndrii Nakryiko 	},
5998c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5999c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
6000c64779e2SAndrii Nakryiko 	.line_info = {
6001c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6002c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 2, 9),
6003c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 3, 8),
6004c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
6005c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6006c64779e2SAndrii Nakryiko 	},
6007c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6008c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6009c64779e2SAndrii Nakryiko 	.err_str = "missing bpf_line_info for func#1",
6010c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
6011c64779e2SAndrii Nakryiko },
6012c64779e2SAndrii Nakryiko 
6013c64779e2SAndrii Nakryiko {
6014c64779e2SAndrii Nakryiko 	.descr = "line_info (subprog. unordered insn offset)",
6015c64779e2SAndrii Nakryiko 	.raw_types = {
6016c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6017c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6018c64779e2SAndrii Nakryiko 	},
6019c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1+1;\0return func(a);\0b+=1;\0return b;"),
6020c64779e2SAndrii Nakryiko 	.insns = {
6021c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6022c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
6023c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
6024c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
6025c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6026c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
6027c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
6028c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6029c64779e2SAndrii Nakryiko 	},
6030c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6031c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
6032c64779e2SAndrii Nakryiko 	.line_info = {
6033c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6034c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 2, 9),
6035c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
6036c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 4, 7),
6037c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6038c64779e2SAndrii Nakryiko 	},
6039c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6040c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6041c64779e2SAndrii Nakryiko 	.err_str = "Invalid line_info[2].insn_off",
6042c64779e2SAndrii Nakryiko 	.expected_prog_load_failure = true,
6043c64779e2SAndrii Nakryiko },
6044c64779e2SAndrii Nakryiko 
6045c64779e2SAndrii Nakryiko {
6046c64779e2SAndrii Nakryiko 	.descr = "line_info (dead start)",
6047c64779e2SAndrii Nakryiko 	.raw_types = {
6048c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6049c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6050c64779e2SAndrii Nakryiko 	},
6051c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0/* dead jmp */\0int a=1;\0int b=2;\0return a + b;\0return a + b;"),
6052c64779e2SAndrii Nakryiko 	.insns = {
6053c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6054c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
6055c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
6056c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
6057c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6058c64779e2SAndrii Nakryiko 	},
6059c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6060c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
6061c64779e2SAndrii Nakryiko 	.line_info = {
6062c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6063c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 9),
6064c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 8),
6065c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 7),
6066c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 6),
6067c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6068c64779e2SAndrii Nakryiko 	},
6069c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6070c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
6071c64779e2SAndrii Nakryiko 	.dead_code_cnt = 1,
6072c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x01,
6073c64779e2SAndrii Nakryiko },
6074c64779e2SAndrii Nakryiko 
6075c64779e2SAndrii Nakryiko {
6076c64779e2SAndrii Nakryiko 	.descr = "line_info (dead end)",
6077c64779e2SAndrii Nakryiko 	.raw_types = {
6078c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6079c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6080c64779e2SAndrii Nakryiko 	},
6081c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0int a=1;\0int b=2;\0return a + b;\0/* dead jmp */\0return a + b;\0/* dead exit */"),
6082c64779e2SAndrii Nakryiko 	.insns = {
6083c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 1),
6084c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_1, 2),
6085c64779e2SAndrii Nakryiko 		BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
6086c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
6087c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6088c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6089c64779e2SAndrii Nakryiko 	},
6090c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6091c64779e2SAndrii Nakryiko 	.func_info_cnt = 0,
6092c64779e2SAndrii Nakryiko 	.line_info = {
6093c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 12),
6094c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(1, 0, NAME_TBD, 2, 11),
6095c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(2, 0, NAME_TBD, 3, 10),
6096c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 4, 9),
6097c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 5, 8),
6098c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 6, 7),
6099c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6100c64779e2SAndrii Nakryiko 	},
6101c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6102c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
6103c64779e2SAndrii Nakryiko 	.dead_code_cnt = 2,
6104c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x28,
6105c64779e2SAndrii Nakryiko },
6106c64779e2SAndrii Nakryiko 
6107c64779e2SAndrii Nakryiko {
6108c64779e2SAndrii Nakryiko 	.descr = "line_info (dead code + subprog + func_info)",
6109c64779e2SAndrii Nakryiko 	.raw_types = {
6110c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6111c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
6112c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6113c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
6114c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
6115c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6116c64779e2SAndrii Nakryiko 	},
6117c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0sub\0main\0int a=1+1;\0/* dead jmp */"
6118c64779e2SAndrii Nakryiko 		    "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
6119c64779e2SAndrii Nakryiko 		    "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
6120c64779e2SAndrii Nakryiko 		    "\0return func(a);\0b+=1;\0return b;"),
6121c64779e2SAndrii Nakryiko 	.insns = {
6122c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6123c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
6124c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
6125c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 8),
6126c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6127c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6128c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6129c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6130c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6131c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6132c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6133c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6134c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
6135c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6136c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
6137c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
6138c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6139c64779e2SAndrii Nakryiko 	},
6140c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6141c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
6142c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6143c64779e2SAndrii Nakryiko 	.func_info = { {0, 4}, {14, 3} },
6144c64779e2SAndrii Nakryiko 	.line_info = {
6145c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6146c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
6147c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
6148c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
6149c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6150c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
6151c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
6152c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
6153c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
6154c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
6155c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
6156c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(14, 0, NAME_TBD, 3, 8),
6157c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(16, 0, NAME_TBD, 4, 7),
6158c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6159c64779e2SAndrii Nakryiko 	},
6160c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6161c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6162c64779e2SAndrii Nakryiko 	.dead_code_cnt = 9,
6163c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x3fe,
6164c64779e2SAndrii Nakryiko },
6165c64779e2SAndrii Nakryiko 
6166c64779e2SAndrii Nakryiko {
6167c64779e2SAndrii Nakryiko 	.descr = "line_info (dead subprog)",
6168c64779e2SAndrii Nakryiko 	.raw_types = {
6169c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6170c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
6171c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6172c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
6173c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
6174c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [5] */
6175c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6176c64779e2SAndrii Nakryiko 	},
6177c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */"
6178c64779e2SAndrii Nakryiko 		    "\0return 0;\0return 0;\0/* dead */\0/* dead */"
6179c64779e2SAndrii Nakryiko 		    "\0/* dead */\0return bla + 1;\0return bla + 1;"
6180c64779e2SAndrii Nakryiko 		    "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"),
6181c64779e2SAndrii Nakryiko 	.insns = {
6182c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6183c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
6184c64779e2SAndrii Nakryiko 		BPF_CALL_REL(3),
6185c64779e2SAndrii Nakryiko 		BPF_CALL_REL(5),
6186c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6187c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6188c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6189c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
6190c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6191c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, 2),
6192c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
6193c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6194c64779e2SAndrii Nakryiko 	},
6195c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6196c64779e2SAndrii Nakryiko 	.func_info_cnt = 3,
6197c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6198c64779e2SAndrii Nakryiko 		.func_info = { {0, 4}, {6, 3}, {9, 5} },
6199c64779e2SAndrii Nakryiko 	.line_info = {
6200c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6201c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
6202c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
6203c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
6204c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6205c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
6206c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
6207c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
6208c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
6209c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
6210c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6211c64779e2SAndrii Nakryiko 	},
6212c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6213c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6214c64779e2SAndrii Nakryiko 	.dead_code_cnt = 3,
6215c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x70,
6216c64779e2SAndrii Nakryiko 	.dead_func_cnt = 1,
6217c64779e2SAndrii Nakryiko 	.dead_func_mask = 0x2,
6218c64779e2SAndrii Nakryiko },
6219c64779e2SAndrii Nakryiko 
6220c64779e2SAndrii Nakryiko {
6221c64779e2SAndrii Nakryiko 	.descr = "line_info (dead last subprog)",
6222c64779e2SAndrii Nakryiko 	.raw_types = {
6223c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6224c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
6225c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6226c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
6227c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [5] */
6228c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6229c64779e2SAndrii Nakryiko 	},
6230c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0dead\0main\0int a=1+1;\0/* live call */"
6231c64779e2SAndrii Nakryiko 		    "\0return 0;\0/* dead */\0/* dead */"),
6232c64779e2SAndrii Nakryiko 	.insns = {
6233c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6234c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
6235c64779e2SAndrii Nakryiko 		BPF_CALL_REL(2),
6236c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6237c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6238c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6239c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6240c64779e2SAndrii Nakryiko 	},
6241c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6242c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
6243c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6244c64779e2SAndrii Nakryiko 		.func_info = { {0, 4}, {5, 3} },
6245c64779e2SAndrii Nakryiko 	.line_info = {
6246c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6247c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
6248c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
6249c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
6250c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6251c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6252c64779e2SAndrii Nakryiko 	},
6253c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6254c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 1,
6255c64779e2SAndrii Nakryiko 	.dead_code_cnt = 2,
6256c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x18,
6257c64779e2SAndrii Nakryiko 	.dead_func_cnt = 1,
6258c64779e2SAndrii Nakryiko 	.dead_func_mask = 0x2,
6259c64779e2SAndrii Nakryiko },
6260c64779e2SAndrii Nakryiko 
6261c64779e2SAndrii Nakryiko {
6262c64779e2SAndrii Nakryiko 	.descr = "line_info (dead subprog + dead start)",
6263c64779e2SAndrii Nakryiko 	.raw_types = {
6264c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6265c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
6266c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6267c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
6268c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
6269c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [5] */
6270c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6271c64779e2SAndrii Nakryiko 	},
6272c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* dead */"
6273c64779e2SAndrii Nakryiko 		    "\0return 0;\0return 0;\0return 0;"
6274c64779e2SAndrii Nakryiko 		    "\0/* dead */\0/* dead */\0/* dead */\0/* dead */"
6275c64779e2SAndrii Nakryiko 		    "\0return b + 1;\0return b + 1;\0return b + 1;"),
6276c64779e2SAndrii Nakryiko 	.insns = {
6277c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6278c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6279c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
6280c64779e2SAndrii Nakryiko 		BPF_CALL_REL(3),
6281c64779e2SAndrii Nakryiko 		BPF_CALL_REL(5),
6282c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6283c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6284c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6285c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
6286c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6287c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6288c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, 2),
6289c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
6290c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6291c64779e2SAndrii Nakryiko 	},
6292c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6293c64779e2SAndrii Nakryiko 	.func_info_cnt = 3,
6294c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6295c64779e2SAndrii Nakryiko 		.func_info = { {0, 4}, {7, 3}, {10, 5} },
6296c64779e2SAndrii Nakryiko 	.line_info = {
6297c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6298c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
6299c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
6300c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
6301c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6302c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
6303c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
6304c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
6305c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(10, 0, NAME_TBD, 1, 10),
6306c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 2, 9),
6307c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
6308c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(13, 0, NAME_TBD, 2, 9),
6309c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6310c64779e2SAndrii Nakryiko 	},
6311c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6312c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6313c64779e2SAndrii Nakryiko 	.dead_code_cnt = 5,
6314c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x1e2,
6315c64779e2SAndrii Nakryiko 	.dead_func_cnt = 1,
6316c64779e2SAndrii Nakryiko 	.dead_func_mask = 0x2,
6317c64779e2SAndrii Nakryiko },
6318c64779e2SAndrii Nakryiko 
6319c64779e2SAndrii Nakryiko {
6320c64779e2SAndrii Nakryiko 	.descr = "line_info (dead subprog + dead start w/ move)",
6321c64779e2SAndrii Nakryiko 	.raw_types = {
6322c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6323c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
6324c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6325c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
6326c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
6327c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [5] */
6328c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6329c64779e2SAndrii Nakryiko 	},
6330c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0dead\0main\0func\0int a=1+1;\0/* live call */"
6331c64779e2SAndrii Nakryiko 		    "\0return 0;\0return 0;\0/* dead */\0/* dead */"
6332c64779e2SAndrii Nakryiko 		    "\0/* dead */\0return bla + 1;\0return bla + 1;"
6333c64779e2SAndrii Nakryiko 		    "\0return bla + 1;\0return func(a);\0b+=1;\0return b;"),
6334c64779e2SAndrii Nakryiko 	.insns = {
6335c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_2, 1),
6336c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
6337c64779e2SAndrii Nakryiko 		BPF_CALL_REL(3),
6338c64779e2SAndrii Nakryiko 		BPF_CALL_REL(5),
6339c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6340c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6341c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6342c64779e2SAndrii Nakryiko 		BPF_CALL_REL(1),
6343c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6344c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6345c64779e2SAndrii Nakryiko 		BPF_MOV64_REG(BPF_REG_0, 2),
6346c64779e2SAndrii Nakryiko 		BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
6347c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6348c64779e2SAndrii Nakryiko 	},
6349c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6350c64779e2SAndrii Nakryiko 	.func_info_cnt = 3,
6351c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6352c64779e2SAndrii Nakryiko 		.func_info = { {0, 4}, {6, 3}, {9, 5} },
6353c64779e2SAndrii Nakryiko 	.line_info = {
6354c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6355c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(3, 0, NAME_TBD, 1, 10),
6356c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(4, 0, NAME_TBD, 1, 10),
6357c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(5, 0, NAME_TBD, 1, 10),
6358c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6359c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(7, 0, NAME_TBD, 1, 10),
6360c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(8, 0, NAME_TBD, 1, 10),
6361c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(9, 0, NAME_TBD, 1, 10),
6362c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(11, 0, NAME_TBD, 1, 10),
6363c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(12, 0, NAME_TBD, 2, 9),
6364c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6365c64779e2SAndrii Nakryiko 	},
6366c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6367c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6368c64779e2SAndrii Nakryiko 	.dead_code_cnt = 3,
6369c64779e2SAndrii Nakryiko 	.dead_code_mask = 0x70,
6370c64779e2SAndrii Nakryiko 	.dead_func_cnt = 1,
6371c64779e2SAndrii Nakryiko 	.dead_func_mask = 0x2,
6372c64779e2SAndrii Nakryiko },
6373c64779e2SAndrii Nakryiko 
6374c64779e2SAndrii Nakryiko {
6375c64779e2SAndrii Nakryiko 	.descr = "line_info (dead end + subprog start w/ no linfo)",
6376c64779e2SAndrii Nakryiko 	.raw_types = {
6377c64779e2SAndrii Nakryiko 		BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6378c64779e2SAndrii Nakryiko 		BTF_FUNC_PROTO_ENC(1, 1),			/* [2] */
6379c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
6380c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */
6381c64779e2SAndrii Nakryiko 		BTF_FUNC_ENC(NAME_TBD, 2),			/* [4] */
6382c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6383c64779e2SAndrii Nakryiko 	},
6384c64779e2SAndrii Nakryiko 	BTF_STR_SEC("\0int\0x\0main\0func\0/* main linfo */\0/* func linfo */"),
6385c64779e2SAndrii Nakryiko 	.insns = {
6386c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6387c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 1, 3),
6388c64779e2SAndrii Nakryiko 		BPF_CALL_REL(3),
6389c64779e2SAndrii Nakryiko 		BPF_MOV64_IMM(BPF_REG_0, 0),
6390c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6391c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6392c64779e2SAndrii Nakryiko 		BPF_JMP_IMM(BPF_JA, 0, 0, 0),
6393c64779e2SAndrii Nakryiko 		BPF_EXIT_INSN(),
6394c64779e2SAndrii Nakryiko 	},
6395c64779e2SAndrii Nakryiko 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6396c64779e2SAndrii Nakryiko 	.func_info_cnt = 2,
6397c64779e2SAndrii Nakryiko 	.func_info_rec_size = 8,
6398c64779e2SAndrii Nakryiko 	.func_info = { {0, 3}, {6, 4}, },
6399c64779e2SAndrii Nakryiko 	.line_info = {
6400c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(0, 0, NAME_TBD, 1, 10),
6401c64779e2SAndrii Nakryiko 		BPF_LINE_INFO_ENC(6, 0, NAME_TBD, 1, 10),
6402c64779e2SAndrii Nakryiko 		BTF_END_RAW,
6403c64779e2SAndrii Nakryiko 	},
6404c64779e2SAndrii Nakryiko 	.line_info_rec_size = sizeof(struct bpf_line_info),
6405c64779e2SAndrii Nakryiko 	.nr_jited_ksyms = 2,
6406c64779e2SAndrii Nakryiko },
6407c64779e2SAndrii Nakryiko 
6408c64779e2SAndrii Nakryiko };
6409c64779e2SAndrii Nakryiko 
probe_prog_length(const struct bpf_insn * fp)6410c64779e2SAndrii Nakryiko static size_t probe_prog_length(const struct bpf_insn *fp)
6411c64779e2SAndrii Nakryiko {
6412c64779e2SAndrii Nakryiko 	size_t len;
6413c64779e2SAndrii Nakryiko 
6414c64779e2SAndrii Nakryiko 	for (len = MAX_INSNS - 1; len > 0; --len)
6415c64779e2SAndrii Nakryiko 		if (fp[len].code != 0 || fp[len].imm != 0)
6416c64779e2SAndrii Nakryiko 			break;
6417c64779e2SAndrii Nakryiko 	return len + 1;
6418c64779e2SAndrii Nakryiko }
6419c64779e2SAndrii Nakryiko 
patch_name_tbd(const __u32 * raw_u32,const char * str,__u32 str_off,unsigned int str_sec_size,unsigned int * ret_size)6420c64779e2SAndrii Nakryiko static __u32 *patch_name_tbd(const __u32 *raw_u32,
6421c64779e2SAndrii Nakryiko 			     const char *str, __u32 str_off,
6422c64779e2SAndrii Nakryiko 			     unsigned int str_sec_size,
6423c64779e2SAndrii Nakryiko 			     unsigned int *ret_size)
6424c64779e2SAndrii Nakryiko {
6425c64779e2SAndrii Nakryiko 	int i, raw_u32_size = get_raw_sec_size(raw_u32);
6426c64779e2SAndrii Nakryiko 	const char *end_str = str + str_sec_size;
6427c64779e2SAndrii Nakryiko 	const char *next_str = str + str_off;
6428c64779e2SAndrii Nakryiko 	__u32 *new_u32 = NULL;
6429c64779e2SAndrii Nakryiko 
6430c64779e2SAndrii Nakryiko 	if (raw_u32_size == -1)
6431c64779e2SAndrii Nakryiko 		return ERR_PTR(-EINVAL);
6432c64779e2SAndrii Nakryiko 
6433c64779e2SAndrii Nakryiko 	if (!raw_u32_size) {
6434c64779e2SAndrii Nakryiko 		*ret_size = 0;
6435c64779e2SAndrii Nakryiko 		return NULL;
6436c64779e2SAndrii Nakryiko 	}
6437c64779e2SAndrii Nakryiko 
6438c64779e2SAndrii Nakryiko 	new_u32 = malloc(raw_u32_size);
6439c64779e2SAndrii Nakryiko 	if (!new_u32)
6440c64779e2SAndrii Nakryiko 		return ERR_PTR(-ENOMEM);
6441c64779e2SAndrii Nakryiko 
6442c64779e2SAndrii Nakryiko 	for (i = 0; i < raw_u32_size / sizeof(raw_u32[0]); i++) {
6443c64779e2SAndrii Nakryiko 		if (raw_u32[i] == NAME_TBD) {
6444c64779e2SAndrii Nakryiko 			next_str = get_next_str(next_str, end_str);
6445c64779e2SAndrii Nakryiko 			if (CHECK(!next_str, "Error in getting next_str\n")) {
6446c64779e2SAndrii Nakryiko 				free(new_u32);
6447c64779e2SAndrii Nakryiko 				return ERR_PTR(-EINVAL);
6448c64779e2SAndrii Nakryiko 			}
6449c64779e2SAndrii Nakryiko 			new_u32[i] = next_str - str;
6450c64779e2SAndrii Nakryiko 			next_str += strlen(next_str);
6451c64779e2SAndrii Nakryiko 		} else {
6452c64779e2SAndrii Nakryiko 			new_u32[i] = raw_u32[i];
6453c64779e2SAndrii Nakryiko 		}
6454c64779e2SAndrii Nakryiko 	}
6455c64779e2SAndrii Nakryiko 
6456c64779e2SAndrii Nakryiko 	*ret_size = raw_u32_size;
6457c64779e2SAndrii Nakryiko 	return new_u32;
6458c64779e2SAndrii Nakryiko }
6459c64779e2SAndrii Nakryiko 
test_get_finfo(const struct prog_info_raw_test * test,int prog_fd)6460c64779e2SAndrii Nakryiko static int test_get_finfo(const struct prog_info_raw_test *test,
6461c64779e2SAndrii Nakryiko 			  int prog_fd)
6462c64779e2SAndrii Nakryiko {
6463c64779e2SAndrii Nakryiko 	struct bpf_prog_info info = {};
6464c64779e2SAndrii Nakryiko 	struct bpf_func_info *finfo;
6465c64779e2SAndrii Nakryiko 	__u32 info_len, rec_size, i;
6466c64779e2SAndrii Nakryiko 	void *func_info = NULL;
6467c64779e2SAndrii Nakryiko 	__u32 nr_func_info;
6468c64779e2SAndrii Nakryiko 	int err;
6469c64779e2SAndrii Nakryiko 
6470c64779e2SAndrii Nakryiko 	/* get necessary lens */
6471c64779e2SAndrii Nakryiko 	info_len = sizeof(struct bpf_prog_info);
6472c5a237a4SIlya Leoshkevich 	err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len);
6473bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "invalid get info (1st) errno:%d", errno)) {
6474c64779e2SAndrii Nakryiko 		fprintf(stderr, "%s\n", btf_log_buf);
6475c64779e2SAndrii Nakryiko 		return -1;
6476c64779e2SAndrii Nakryiko 	}
6477c64779e2SAndrii Nakryiko 	nr_func_info = test->func_info_cnt - test->dead_func_cnt;
6478c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_func_info != nr_func_info,
6479c64779e2SAndrii Nakryiko 		  "incorrect info.nr_func_info (1st) %d",
6480c64779e2SAndrii Nakryiko 		  info.nr_func_info)) {
6481c64779e2SAndrii Nakryiko 		return -1;
6482c64779e2SAndrii Nakryiko 	}
6483c64779e2SAndrii Nakryiko 
6484c64779e2SAndrii Nakryiko 	rec_size = info.func_info_rec_size;
6485c64779e2SAndrii Nakryiko 	if (CHECK(rec_size != sizeof(struct bpf_func_info),
6486c64779e2SAndrii Nakryiko 		  "incorrect info.func_info_rec_size (1st) %d", rec_size)) {
6487c64779e2SAndrii Nakryiko 		return -1;
6488c64779e2SAndrii Nakryiko 	}
6489c64779e2SAndrii Nakryiko 
6490c64779e2SAndrii Nakryiko 	if (!info.nr_func_info)
6491c64779e2SAndrii Nakryiko 		return 0;
6492c64779e2SAndrii Nakryiko 
6493c64779e2SAndrii Nakryiko 	func_info = malloc(info.nr_func_info * rec_size);
6494c64779e2SAndrii Nakryiko 	if (CHECK(!func_info, "out of memory"))
6495c64779e2SAndrii Nakryiko 		return -1;
6496c64779e2SAndrii Nakryiko 
6497c64779e2SAndrii Nakryiko 	/* reset info to only retrieve func_info related data */
6498c64779e2SAndrii Nakryiko 	memset(&info, 0, sizeof(info));
6499c64779e2SAndrii Nakryiko 	info.nr_func_info = nr_func_info;
6500c64779e2SAndrii Nakryiko 	info.func_info_rec_size = rec_size;
6501c64779e2SAndrii Nakryiko 	info.func_info = ptr_to_u64(func_info);
6502c5a237a4SIlya Leoshkevich 	err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len);
6503bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "invalid get info (2nd) errno:%d", errno)) {
6504c64779e2SAndrii Nakryiko 		fprintf(stderr, "%s\n", btf_log_buf);
6505c64779e2SAndrii Nakryiko 		err = -1;
6506c64779e2SAndrii Nakryiko 		goto done;
6507c64779e2SAndrii Nakryiko 	}
6508c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_func_info != nr_func_info,
6509c64779e2SAndrii Nakryiko 		  "incorrect info.nr_func_info (2nd) %d",
6510c64779e2SAndrii Nakryiko 		  info.nr_func_info)) {
6511c64779e2SAndrii Nakryiko 		err = -1;
6512c64779e2SAndrii Nakryiko 		goto done;
6513c64779e2SAndrii Nakryiko 	}
6514c64779e2SAndrii Nakryiko 	if (CHECK(info.func_info_rec_size != rec_size,
6515c64779e2SAndrii Nakryiko 		  "incorrect info.func_info_rec_size (2nd) %d",
6516c64779e2SAndrii Nakryiko 		  info.func_info_rec_size)) {
6517c64779e2SAndrii Nakryiko 		err = -1;
6518c64779e2SAndrii Nakryiko 		goto done;
6519c64779e2SAndrii Nakryiko 	}
6520c64779e2SAndrii Nakryiko 
6521c64779e2SAndrii Nakryiko 	finfo = func_info;
6522c64779e2SAndrii Nakryiko 	for (i = 0; i < nr_func_info; i++) {
6523c64779e2SAndrii Nakryiko 		if (test->dead_func_mask & (1 << i))
6524c64779e2SAndrii Nakryiko 			continue;
6525c64779e2SAndrii Nakryiko 		if (CHECK(finfo->type_id != test->func_info[i][1],
6526c64779e2SAndrii Nakryiko 			  "incorrect func_type %u expected %u",
6527c64779e2SAndrii Nakryiko 			  finfo->type_id, test->func_info[i][1])) {
6528c64779e2SAndrii Nakryiko 			err = -1;
6529c64779e2SAndrii Nakryiko 			goto done;
6530c64779e2SAndrii Nakryiko 		}
6531c64779e2SAndrii Nakryiko 		finfo = (void *)finfo + rec_size;
6532c64779e2SAndrii Nakryiko 	}
6533c64779e2SAndrii Nakryiko 
6534c64779e2SAndrii Nakryiko 	err = 0;
6535c64779e2SAndrii Nakryiko 
6536c64779e2SAndrii Nakryiko done:
6537c64779e2SAndrii Nakryiko 	free(func_info);
6538c64779e2SAndrii Nakryiko 	return err;
6539c64779e2SAndrii Nakryiko }
6540c64779e2SAndrii Nakryiko 
test_get_linfo(const struct prog_info_raw_test * test,const void * patched_linfo,__u32 cnt,int prog_fd)6541c64779e2SAndrii Nakryiko static int test_get_linfo(const struct prog_info_raw_test *test,
6542c64779e2SAndrii Nakryiko 			  const void *patched_linfo,
6543c64779e2SAndrii Nakryiko 			  __u32 cnt, int prog_fd)
6544c64779e2SAndrii Nakryiko {
6545c64779e2SAndrii Nakryiko 	__u32 i, info_len, nr_jited_ksyms, nr_jited_func_lens;
6546c64779e2SAndrii Nakryiko 	__u64 *jited_linfo = NULL, *jited_ksyms = NULL;
6547c64779e2SAndrii Nakryiko 	__u32 rec_size, jited_rec_size, jited_cnt;
6548c64779e2SAndrii Nakryiko 	struct bpf_line_info *linfo = NULL;
6549c64779e2SAndrii Nakryiko 	__u32 cur_func_len, ksyms_found;
6550c64779e2SAndrii Nakryiko 	struct bpf_prog_info info = {};
6551c64779e2SAndrii Nakryiko 	__u32 *jited_func_lens = NULL;
6552c64779e2SAndrii Nakryiko 	__u64 cur_func_ksyms;
6553c64779e2SAndrii Nakryiko 	__u32 dead_insns;
6554c64779e2SAndrii Nakryiko 	int err;
6555c64779e2SAndrii Nakryiko 
6556c64779e2SAndrii Nakryiko 	jited_cnt = cnt;
6557c64779e2SAndrii Nakryiko 	rec_size = sizeof(*linfo);
6558c64779e2SAndrii Nakryiko 	jited_rec_size = sizeof(*jited_linfo);
6559c64779e2SAndrii Nakryiko 	if (test->nr_jited_ksyms)
6560c64779e2SAndrii Nakryiko 		nr_jited_ksyms = test->nr_jited_ksyms;
6561c64779e2SAndrii Nakryiko 	else
6562c64779e2SAndrii Nakryiko 		nr_jited_ksyms = test->func_info_cnt - test->dead_func_cnt;
6563c64779e2SAndrii Nakryiko 	nr_jited_func_lens = nr_jited_ksyms;
6564c64779e2SAndrii Nakryiko 
6565c64779e2SAndrii Nakryiko 	info_len = sizeof(struct bpf_prog_info);
6566c5a237a4SIlya Leoshkevich 	err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len);
6567bad2e478SAndrii Nakryiko 	if (CHECK(err < 0, "err:%d errno:%d", err, errno)) {
6568c64779e2SAndrii Nakryiko 		err = -1;
6569c64779e2SAndrii Nakryiko 		goto done;
6570c64779e2SAndrii Nakryiko 	}
6571c64779e2SAndrii Nakryiko 
6572c64779e2SAndrii Nakryiko 	if (!info.jited_prog_len) {
6573c64779e2SAndrii Nakryiko 		/* prog is not jited */
6574c64779e2SAndrii Nakryiko 		jited_cnt = 0;
6575c64779e2SAndrii Nakryiko 		nr_jited_ksyms = 1;
6576c64779e2SAndrii Nakryiko 		nr_jited_func_lens = 1;
6577c64779e2SAndrii Nakryiko 	}
6578c64779e2SAndrii Nakryiko 
6579c64779e2SAndrii Nakryiko 	if (CHECK(info.nr_line_info != cnt ||
6580c64779e2SAndrii Nakryiko 		  info.nr_jited_line_info != jited_cnt ||
6581c64779e2SAndrii Nakryiko 		  info.nr_jited_ksyms != nr_jited_ksyms ||
6582c64779e2SAndrii Nakryiko 		  info.nr_jited_func_lens != nr_jited_func_lens ||
6583c64779e2SAndrii Nakryiko 		  (!info.nr_line_info && info.nr_jited_line_info),
6584c64779e2SAndrii 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)",
6585c64779e2SAndrii Nakryiko 		  info.nr_line_info, cnt,
6586c64779e2SAndrii Nakryiko 		  info.nr_jited_line_info, jited_cnt,
6587c64779e2SAndrii Nakryiko 		  info.nr_jited_ksyms, nr_jited_ksyms,
6588c64779e2SAndrii Nakryiko 		  info.nr_jited_func_lens, nr_jited_func_lens)) {
6589c64779e2SAndrii Nakryiko 		err = -1;
6590c64779e2SAndrii Nakryiko 		goto done;
6591c64779e2SAndrii Nakryiko 	}
6592c64779e2SAndrii Nakryiko 
6593c64779e2SAndrii Nakryiko 	if (CHECK(info.line_info_rec_size != sizeof(struct bpf_line_info) ||
6594c64779e2SAndrii Nakryiko 		  info.jited_line_info_rec_size != sizeof(__u64),
6595c64779e2SAndrii Nakryiko 		  "info: line_info_rec_size:%u(userspace expected:%u) jited_line_info_rec_size:%u(userspace expected:%u)",
6596c64779e2SAndrii Nakryiko 		  info.line_info_rec_size, rec_size,
6597c64779e2SAndrii Nakryiko 		  info.jited_line_info_rec_size, jited_rec_size)) {
6598c64779e2SAndrii Nakryiko 		err = -1;
6599c64779e2SAndrii Nakryiko 		goto done;
6600c64779e2SAndrii Nakryiko 	}
6601c64779e2SAndrii Nakryiko 
6602c64779e2SAndrii Nakryiko 	if (!cnt)
6603c64779e2SAndrii Nakryiko 		return 0;
6604c64779e2SAndrii Nakryiko 
6605c64779e2SAndrii Nakryiko 	rec_size = info.line_info_rec_size;
6606c64779e2SAndrii Nakryiko 	jited_rec_size = info.jited_line_info_rec_size;
6607c64779e2SAndrii Nakryiko 
6608c64779e2SAndrii Nakryiko 	memset(&info, 0, sizeof(info));
6609c64779e2SAndrii Nakryiko 
6610c64779e2SAndrii Nakryiko 	linfo = calloc(cnt, rec_size);
6611c64779e2SAndrii Nakryiko 	if (CHECK(!linfo, "!linfo")) {
6612c64779e2SAndrii Nakryiko 		err = -1;
6613c64779e2SAndrii Nakryiko 		goto done;
6614c64779e2SAndrii Nakryiko 	}
6615c64779e2SAndrii Nakryiko 	info.nr_line_info = cnt;
6616c64779e2SAndrii Nakryiko 	info.line_info_rec_size = rec_size;
6617c64779e2SAndrii Nakryiko 	info.line_info = ptr_to_u64(linfo);
6618c64779e2SAndrii Nakryiko 
6619c64779e2SAndrii Nakryiko 	if (jited_cnt) {
6620c64779e2SAndrii Nakryiko 		jited_linfo = calloc(jited_cnt, jited_rec_size);
6621c64779e2SAndrii Nakryiko 		jited_ksyms = calloc(nr_jited_ksyms, sizeof(*jited_ksyms));
6622c64779e2SAndrii Nakryiko 		jited_func_lens = calloc(nr_jited_func_lens,
6623c64779e2SAndrii Nakryiko 					 sizeof(*jited_func_lens));
6624c64779e2SAndrii Nakryiko 		if (CHECK(!jited_linfo || !jited_ksyms || !jited_func_lens,
6625c64779e2SAndrii Nakryiko 			  "jited_linfo:%p jited_ksyms:%p jited_func_lens:%p",
6626c64779e2SAndrii Nakryiko 			  jited_linfo, jited_ksyms, jited_func_lens)) {
6627c64779e2SAndrii Nakryiko 			err = -1;
6628c64779e2SAndrii Nakryiko 			goto done;
6629c64779e2SAndrii Nakryiko 		}
6630c64779e2SAndrii Nakryiko 
6631c64779e2SAndrii Nakryiko 		info.nr_jited_line_info = jited_cnt;
6632c64779e2SAndrii Nakryiko 		info.jited_line_info_rec_size = jited_rec_size;
6633c64779e2SAndrii Nakryiko 		info.jited_line_info = ptr_to_u64(jited_linfo);
6634c64779e2SAndrii Nakryiko 		info.nr_jited_ksyms = nr_jited_ksyms;
6635c64779e2SAndrii Nakryiko 		info.jited_ksyms = ptr_to_u64(jited_ksyms);
6636c64779e2SAndrii Nakryiko 		info.nr_jited_func_lens = nr_jited_func_lens;
6637c64779e2SAndrii Nakryiko 		info.jited_func_lens = ptr_to_u64(jited_func_lens);
6638c64779e2SAndrii Nakryiko 	}
6639c64779e2SAndrii Nakryiko 
6640c5a237a4SIlya Leoshkevich 	err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len);
6641c64779e2SAndrii Nakryiko 
6642c64779e2SAndrii Nakryiko 	/*
6643c64779e2SAndrii Nakryiko 	 * Only recheck the info.*line_info* fields.
6644c64779e2SAndrii Nakryiko 	 * Other fields are not the concern of this test.
6645c64779e2SAndrii Nakryiko 	 */
6646bad2e478SAndrii Nakryiko 	if (CHECK(err < 0 ||
6647c64779e2SAndrii Nakryiko 		  info.nr_line_info != cnt ||
6648c64779e2SAndrii Nakryiko 		  (jited_cnt && !info.jited_line_info) ||
6649c64779e2SAndrii Nakryiko 		  info.nr_jited_line_info != jited_cnt ||
6650c64779e2SAndrii Nakryiko 		  info.line_info_rec_size != rec_size ||
6651c64779e2SAndrii Nakryiko 		  info.jited_line_info_rec_size != jited_rec_size,
6652c64779e2SAndrii 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",
6653c64779e2SAndrii Nakryiko 		  err, errno,
6654c64779e2SAndrii Nakryiko 		  info.nr_line_info, cnt,
6655c64779e2SAndrii Nakryiko 		  info.nr_jited_line_info, jited_cnt,
6656c64779e2SAndrii Nakryiko 		  info.line_info_rec_size, rec_size,
6657c64779e2SAndrii Nakryiko 		  info.jited_line_info_rec_size, jited_rec_size,
6658c64779e2SAndrii Nakryiko 		  (void *)(long)info.line_info,
6659c64779e2SAndrii Nakryiko 		  (void *)(long)info.jited_line_info)) {
6660c64779e2SAndrii Nakryiko 		err = -1;
6661c64779e2SAndrii Nakryiko 		goto done;
6662c64779e2SAndrii Nakryiko 	}
6663c64779e2SAndrii Nakryiko 
6664c64779e2SAndrii Nakryiko 	dead_insns = 0;
6665c64779e2SAndrii Nakryiko 	while (test->dead_code_mask & (1 << dead_insns))
6666c64779e2SAndrii Nakryiko 		dead_insns++;
6667c64779e2SAndrii Nakryiko 
6668c64779e2SAndrii Nakryiko 	CHECK(linfo[0].insn_off, "linfo[0].insn_off:%u",
6669c64779e2SAndrii Nakryiko 	      linfo[0].insn_off);
6670c64779e2SAndrii Nakryiko 	for (i = 1; i < cnt; i++) {
6671c64779e2SAndrii Nakryiko 		const struct bpf_line_info *expected_linfo;
6672c64779e2SAndrii Nakryiko 
6673c64779e2SAndrii Nakryiko 		while (test->dead_code_mask & (1 << (i + dead_insns)))
6674c64779e2SAndrii Nakryiko 			dead_insns++;
6675c64779e2SAndrii Nakryiko 
6676c64779e2SAndrii Nakryiko 		expected_linfo = patched_linfo +
6677c64779e2SAndrii Nakryiko 			((i + dead_insns) * test->line_info_rec_size);
6678c64779e2SAndrii Nakryiko 		if (CHECK(linfo[i].insn_off <= linfo[i - 1].insn_off,
6679c64779e2SAndrii Nakryiko 			  "linfo[%u].insn_off:%u <= linfo[%u].insn_off:%u",
6680c64779e2SAndrii Nakryiko 			  i, linfo[i].insn_off,
6681c64779e2SAndrii Nakryiko 			  i - 1, linfo[i - 1].insn_off)) {
6682c64779e2SAndrii Nakryiko 			err = -1;
6683c64779e2SAndrii Nakryiko 			goto done;
6684c64779e2SAndrii Nakryiko 		}
6685c64779e2SAndrii Nakryiko 		if (CHECK(linfo[i].file_name_off != expected_linfo->file_name_off ||
6686c64779e2SAndrii Nakryiko 			  linfo[i].line_off != expected_linfo->line_off ||
6687c64779e2SAndrii Nakryiko 			  linfo[i].line_col != expected_linfo->line_col,
6688c64779e2SAndrii Nakryiko 			  "linfo[%u] (%u, %u, %u) != (%u, %u, %u)", i,
6689c64779e2SAndrii Nakryiko 			  linfo[i].file_name_off,
6690c64779e2SAndrii Nakryiko 			  linfo[i].line_off,
6691c64779e2SAndrii Nakryiko 			  linfo[i].line_col,
6692c64779e2SAndrii Nakryiko 			  expected_linfo->file_name_off,
6693c64779e2SAndrii Nakryiko 			  expected_linfo->line_off,
6694c64779e2SAndrii Nakryiko 			  expected_linfo->line_col)) {
6695c64779e2SAndrii Nakryiko 			err = -1;
6696c64779e2SAndrii Nakryiko 			goto done;
6697c64779e2SAndrii Nakryiko 		}
6698c64779e2SAndrii Nakryiko 	}
6699c64779e2SAndrii Nakryiko 
6700c64779e2SAndrii Nakryiko 	if (!jited_cnt) {
6701c64779e2SAndrii Nakryiko 		fprintf(stderr, "not jited. skipping jited_line_info check. ");
6702c64779e2SAndrii Nakryiko 		err = 0;
6703c64779e2SAndrii Nakryiko 		goto done;
6704c64779e2SAndrii Nakryiko 	}
6705c64779e2SAndrii Nakryiko 
6706c64779e2SAndrii Nakryiko 	if (CHECK(jited_linfo[0] != jited_ksyms[0],
6707c64779e2SAndrii Nakryiko 		  "jited_linfo[0]:%lx != jited_ksyms[0]:%lx",
6708c64779e2SAndrii Nakryiko 		  (long)(jited_linfo[0]), (long)(jited_ksyms[0]))) {
6709c64779e2SAndrii Nakryiko 		err = -1;
6710c64779e2SAndrii Nakryiko 		goto done;
6711c64779e2SAndrii Nakryiko 	}
6712c64779e2SAndrii Nakryiko 
6713c64779e2SAndrii Nakryiko 	ksyms_found = 1;
6714c64779e2SAndrii Nakryiko 	cur_func_len = jited_func_lens[0];
6715c64779e2SAndrii Nakryiko 	cur_func_ksyms = jited_ksyms[0];
6716c64779e2SAndrii Nakryiko 	for (i = 1; i < jited_cnt; i++) {
6717c64779e2SAndrii Nakryiko 		if (ksyms_found < nr_jited_ksyms &&
6718c64779e2SAndrii Nakryiko 		    jited_linfo[i] == jited_ksyms[ksyms_found]) {
6719c64779e2SAndrii Nakryiko 			cur_func_ksyms = jited_ksyms[ksyms_found];
6720c64779e2SAndrii Nakryiko 			cur_func_len = jited_ksyms[ksyms_found];
6721c64779e2SAndrii Nakryiko 			ksyms_found++;
6722c64779e2SAndrii Nakryiko 			continue;
6723c64779e2SAndrii Nakryiko 		}
6724c64779e2SAndrii Nakryiko 
6725c64779e2SAndrii Nakryiko 		if (CHECK(jited_linfo[i] <= jited_linfo[i - 1],
6726c64779e2SAndrii Nakryiko 			  "jited_linfo[%u]:%lx <= jited_linfo[%u]:%lx",
6727c64779e2SAndrii Nakryiko 			  i, (long)jited_linfo[i],
6728c64779e2SAndrii Nakryiko 			  i - 1, (long)(jited_linfo[i - 1]))) {
6729c64779e2SAndrii Nakryiko 			err = -1;
6730c64779e2SAndrii Nakryiko 			goto done;
6731c64779e2SAndrii Nakryiko 		}
6732c64779e2SAndrii Nakryiko 
6733c64779e2SAndrii Nakryiko 		if (CHECK(jited_linfo[i] - cur_func_ksyms > cur_func_len,
6734c64779e2SAndrii Nakryiko 			  "jited_linfo[%u]:%lx - %lx > %u",
6735c64779e2SAndrii Nakryiko 			  i, (long)jited_linfo[i], (long)cur_func_ksyms,
6736c64779e2SAndrii Nakryiko 			  cur_func_len)) {
6737c64779e2SAndrii Nakryiko 			err = -1;
6738c64779e2SAndrii Nakryiko 			goto done;
6739c64779e2SAndrii Nakryiko 		}
6740c64779e2SAndrii Nakryiko 	}
6741c64779e2SAndrii Nakryiko 
6742c64779e2SAndrii Nakryiko 	if (CHECK(ksyms_found != nr_jited_ksyms,
6743c64779e2SAndrii Nakryiko 		  "ksyms_found:%u != nr_jited_ksyms:%u",
6744c64779e2SAndrii Nakryiko 		  ksyms_found, nr_jited_ksyms)) {
6745c64779e2SAndrii Nakryiko 		err = -1;
6746c64779e2SAndrii Nakryiko 		goto done;
6747c64779e2SAndrii Nakryiko 	}
6748c64779e2SAndrii Nakryiko 
6749c64779e2SAndrii Nakryiko 	err = 0;
6750c64779e2SAndrii Nakryiko 
6751c64779e2SAndrii Nakryiko done:
6752c64779e2SAndrii Nakryiko 	free(linfo);
6753c64779e2SAndrii Nakryiko 	free(jited_linfo);
6754c64779e2SAndrii Nakryiko 	free(jited_ksyms);
6755c64779e2SAndrii Nakryiko 	free(jited_func_lens);
6756c64779e2SAndrii Nakryiko 	return err;
6757c64779e2SAndrii Nakryiko }
6758c64779e2SAndrii Nakryiko 
do_test_info_raw(unsigned int test_num)6759c64779e2SAndrii Nakryiko static void do_test_info_raw(unsigned int test_num)
6760c64779e2SAndrii Nakryiko {
6761c64779e2SAndrii Nakryiko 	const struct prog_info_raw_test *test = &info_raw_tests[test_num - 1];
6762d3b0b800SAndrii Nakryiko 	unsigned int raw_btf_size, linfo_str_off, linfo_size = 0;
6763c64779e2SAndrii Nakryiko 	int btf_fd = -1, prog_fd = -1, err = 0;
6764c64779e2SAndrii Nakryiko 	void *raw_btf, *patched_linfo = NULL;
6765c64779e2SAndrii Nakryiko 	const char *ret_next_str;
6766c64779e2SAndrii Nakryiko 	union bpf_attr attr = {};
6767c64779e2SAndrii Nakryiko 
6768c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
6769c64779e2SAndrii Nakryiko 		return;
6770c64779e2SAndrii Nakryiko 
6771c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl, test->raw_types,
6772c64779e2SAndrii Nakryiko 				 test->str_sec, test->str_sec_size,
6773c64779e2SAndrii Nakryiko 				 &raw_btf_size, &ret_next_str);
6774c64779e2SAndrii Nakryiko 	if (!raw_btf)
6775c64779e2SAndrii Nakryiko 		return;
6776c64779e2SAndrii Nakryiko 
6777c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
6778dc94121bSAndrii Nakryiko 	btf_fd = load_raw_btf(raw_btf, raw_btf_size);
6779c64779e2SAndrii Nakryiko 	free(raw_btf);
6780c64779e2SAndrii Nakryiko 
6781bad2e478SAndrii Nakryiko 	if (CHECK(btf_fd < 0, "invalid btf_fd errno:%d", errno)) {
6782c64779e2SAndrii Nakryiko 		err = -1;
6783c64779e2SAndrii Nakryiko 		goto done;
6784c64779e2SAndrii Nakryiko 	}
6785c64779e2SAndrii Nakryiko 
6786c64779e2SAndrii Nakryiko 	if (*btf_log_buf && always_log)
6787c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
6788c64779e2SAndrii Nakryiko 	*btf_log_buf = '\0';
6789c64779e2SAndrii Nakryiko 
6790c64779e2SAndrii Nakryiko 	linfo_str_off = ret_next_str - test->str_sec;
6791c64779e2SAndrii Nakryiko 	patched_linfo = patch_name_tbd(test->line_info,
6792c64779e2SAndrii Nakryiko 				       test->str_sec, linfo_str_off,
6793c64779e2SAndrii Nakryiko 				       test->str_sec_size, &linfo_size);
6794bad2e478SAndrii Nakryiko 	err = libbpf_get_error(patched_linfo);
6795bad2e478SAndrii Nakryiko 	if (err) {
6796c64779e2SAndrii Nakryiko 		fprintf(stderr, "error in creating raw bpf_line_info");
6797c64779e2SAndrii Nakryiko 		err = -1;
6798c64779e2SAndrii Nakryiko 		goto done;
6799c64779e2SAndrii Nakryiko 	}
6800c64779e2SAndrii Nakryiko 
6801c64779e2SAndrii Nakryiko 	attr.prog_type = test->prog_type;
6802c64779e2SAndrii Nakryiko 	attr.insns = ptr_to_u64(test->insns);
6803c64779e2SAndrii Nakryiko 	attr.insn_cnt = probe_prog_length(test->insns);
6804c64779e2SAndrii Nakryiko 	attr.license = ptr_to_u64("GPL");
6805c64779e2SAndrii Nakryiko 	attr.prog_btf_fd = btf_fd;
6806c64779e2SAndrii Nakryiko 	attr.func_info_rec_size = test->func_info_rec_size;
6807c64779e2SAndrii Nakryiko 	attr.func_info_cnt = test->func_info_cnt;
6808c64779e2SAndrii Nakryiko 	attr.func_info = ptr_to_u64(test->func_info);
6809c64779e2SAndrii Nakryiko 	attr.log_buf = ptr_to_u64(btf_log_buf);
6810c64779e2SAndrii Nakryiko 	attr.log_size = BTF_LOG_BUF_SIZE;
6811c64779e2SAndrii Nakryiko 	attr.log_level = 1;
6812c64779e2SAndrii Nakryiko 	if (linfo_size) {
6813c64779e2SAndrii Nakryiko 		attr.line_info_rec_size = test->line_info_rec_size;
6814c64779e2SAndrii Nakryiko 		attr.line_info = ptr_to_u64(patched_linfo);
6815c64779e2SAndrii Nakryiko 		attr.line_info_cnt = linfo_size / attr.line_info_rec_size;
6816c64779e2SAndrii Nakryiko 	}
6817c64779e2SAndrii Nakryiko 
6818c64779e2SAndrii Nakryiko 	prog_fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
6819bad2e478SAndrii Nakryiko 	err = ((prog_fd < 0) != test->expected_prog_load_failure);
6820c64779e2SAndrii Nakryiko 	if (CHECK(err, "prog_fd:%d expected_prog_load_failure:%u errno:%d",
6821c64779e2SAndrii Nakryiko 		  prog_fd, test->expected_prog_load_failure, errno) ||
6822c64779e2SAndrii Nakryiko 	    CHECK(test->err_str && !strstr(btf_log_buf, test->err_str),
6823c64779e2SAndrii Nakryiko 		  "expected err_str:%s", test->err_str)) {
6824c64779e2SAndrii Nakryiko 		err = -1;
6825c64779e2SAndrii Nakryiko 		goto done;
6826c64779e2SAndrii Nakryiko 	}
6827c64779e2SAndrii Nakryiko 
6828bad2e478SAndrii Nakryiko 	if (prog_fd < 0)
6829c64779e2SAndrii Nakryiko 		goto done;
6830c64779e2SAndrii Nakryiko 
6831c64779e2SAndrii Nakryiko 	err = test_get_finfo(test, prog_fd);
6832c64779e2SAndrii Nakryiko 	if (err)
6833c64779e2SAndrii Nakryiko 		goto done;
6834c64779e2SAndrii Nakryiko 
6835c64779e2SAndrii Nakryiko 	err = test_get_linfo(test, patched_linfo,
6836c64779e2SAndrii Nakryiko 			     attr.line_info_cnt - test->dead_code_cnt,
6837c64779e2SAndrii Nakryiko 			     prog_fd);
6838c64779e2SAndrii Nakryiko 	if (err)
6839c64779e2SAndrii Nakryiko 		goto done;
6840c64779e2SAndrii Nakryiko 
6841c64779e2SAndrii Nakryiko done:
6842c64779e2SAndrii Nakryiko 	if (*btf_log_buf && (err || always_log))
6843c64779e2SAndrii Nakryiko 		fprintf(stderr, "\n%s", btf_log_buf);
6844c64779e2SAndrii Nakryiko 
6845bad2e478SAndrii Nakryiko 	if (btf_fd >= 0)
6846c64779e2SAndrii Nakryiko 		close(btf_fd);
6847bad2e478SAndrii Nakryiko 	if (prog_fd >= 0)
6848c64779e2SAndrii Nakryiko 		close(prog_fd);
6849c64779e2SAndrii Nakryiko 
6850bad2e478SAndrii Nakryiko 	if (!libbpf_get_error(patched_linfo))
6851c64779e2SAndrii Nakryiko 		free(patched_linfo);
6852c64779e2SAndrii Nakryiko }
6853c64779e2SAndrii Nakryiko 
6854c64779e2SAndrii Nakryiko struct btf_raw_data {
6855c64779e2SAndrii Nakryiko 	__u32 raw_types[MAX_NR_RAW_U32];
6856c64779e2SAndrii Nakryiko 	const char *str_sec;
6857c64779e2SAndrii Nakryiko 	__u32 str_sec_size;
6858c64779e2SAndrii Nakryiko };
6859c64779e2SAndrii Nakryiko 
6860c64779e2SAndrii Nakryiko struct btf_dedup_test {
6861c64779e2SAndrii Nakryiko 	const char *descr;
6862c64779e2SAndrii Nakryiko 	struct btf_raw_data input;
6863c64779e2SAndrii Nakryiko 	struct btf_raw_data expect;
6864c64779e2SAndrii Nakryiko 	struct btf_dedup_opts opts;
6865c64779e2SAndrii Nakryiko };
6866c64779e2SAndrii Nakryiko 
6867957d350aSAndrii Nakryiko static struct btf_dedup_test dedup_tests[] = {
6868c64779e2SAndrii Nakryiko 
6869c64779e2SAndrii Nakryiko {
6870c64779e2SAndrii Nakryiko 	.descr = "dedup: unused strings filtering",
6871c64779e2SAndrii Nakryiko 	.input = {
6872c64779e2SAndrii Nakryiko 		.raw_types = {
6873c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 4),
6874c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 64, 8),
6875c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6876c64779e2SAndrii Nakryiko 		},
6877c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0unused\0int\0foo\0bar\0long"),
6878c64779e2SAndrii Nakryiko 	},
6879c64779e2SAndrii Nakryiko 	.expect = {
6880c64779e2SAndrii Nakryiko 		.raw_types = {
6881c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6882c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6883c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6884c64779e2SAndrii Nakryiko 		},
6885c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0int\0long"),
6886c64779e2SAndrii Nakryiko 	},
6887c64779e2SAndrii Nakryiko },
6888c64779e2SAndrii Nakryiko {
6889c64779e2SAndrii Nakryiko 	.descr = "dedup: strings deduplication",
6890c64779e2SAndrii Nakryiko 	.input = {
6891c64779e2SAndrii Nakryiko 		.raw_types = {
6892c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6893c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6894c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(3), BTF_INT_SIGNED, 0, 32, 4),
6895c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(4), BTF_INT_SIGNED, 0, 64, 8),
6896c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4),
6897c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6898c64779e2SAndrii Nakryiko 		},
6899c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0int\0long int\0int\0long int\0int"),
6900c64779e2SAndrii Nakryiko 	},
6901c64779e2SAndrii Nakryiko 	.expect = {
6902c64779e2SAndrii Nakryiko 		.raw_types = {
6903c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
6904c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 64, 8),
6905c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6906c64779e2SAndrii Nakryiko 		},
6907c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0int\0long int"),
6908c64779e2SAndrii Nakryiko 	},
6909c64779e2SAndrii Nakryiko },
6910c64779e2SAndrii Nakryiko {
6911c64779e2SAndrii Nakryiko 	.descr = "dedup: struct example #1",
6912c64779e2SAndrii Nakryiko 	/*
6913c64779e2SAndrii Nakryiko 	 * struct s {
6914c64779e2SAndrii Nakryiko 	 *	struct s *next;
6915c64779e2SAndrii Nakryiko 	 *	const int *a;
6916c64779e2SAndrii Nakryiko 	 *	int b[16];
6917c64779e2SAndrii Nakryiko 	 *	int c;
6918c64779e2SAndrii Nakryiko 	 * }
6919c64779e2SAndrii Nakryiko 	 */
6920c64779e2SAndrii Nakryiko 	.input = {
6921c64779e2SAndrii Nakryiko 		.raw_types = {
6922c64779e2SAndrii Nakryiko 			/* int */
6923c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6924c64779e2SAndrii Nakryiko 			/* int[16] */
6925c64779e2SAndrii Nakryiko 			BTF_TYPE_ARRAY_ENC(1, 1, 16),					/* [2] */
6926c64779e2SAndrii Nakryiko 			/* struct s { */
69277999cf7dSIlya Leoshkevich 			BTF_STRUCT_ENC(NAME_NTH(2), 5, 88),				/* [3] */
6928c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(3), 4, 0),	/* struct s *next;	*/
6929c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(4), 5, 64),	/* const int *a;	*/
6930c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(5), 2, 128),	/* int b[16];		*/
6931c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(6), 1, 640),	/* int c;		*/
6932ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(8), 15, 672),	/* float d;		*/
6933c64779e2SAndrii Nakryiko 			/* ptr -> [3] struct s */
6934c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(3),							/* [4] */
6935c64779e2SAndrii Nakryiko 			/* ptr -> [6] const int */
6936c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(6),							/* [5] */
6937c64779e2SAndrii Nakryiko 			/* const -> [1] int */
6938c64779e2SAndrii Nakryiko 			BTF_CONST_ENC(1),						/* [6] */
6939ad526474SYonghong Song 			/* tag -> [3] struct s */
6940223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1),				/* [7] */
6941ad526474SYonghong Song 			/* tag -> [3] struct s, member 1 */
6942223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1),				/* [8] */
6943c64779e2SAndrii Nakryiko 
6944c64779e2SAndrii Nakryiko 			/* full copy of the above */
6945ad526474SYonghong Song 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),	/* [9] */
6946ad526474SYonghong Song 			BTF_TYPE_ARRAY_ENC(9, 9, 16),					/* [10] */
6947ad526474SYonghong Song 			BTF_STRUCT_ENC(NAME_NTH(2), 5, 88),				/* [11] */
6948ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(3), 12, 0),
6949ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(4), 13, 64),
6950ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(5), 10, 128),
6951ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(6), 9, 640),
6952ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(8), 15, 672),
6953ad526474SYonghong Song 			BTF_PTR_ENC(11),						/* [12] */
6954ad526474SYonghong Song 			BTF_PTR_ENC(14),						/* [13] */
6955ad526474SYonghong Song 			BTF_CONST_ENC(9),						/* [14] */
6956ad526474SYonghong Song 			BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4),				/* [15] */
6957223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 11, -1),				/* [16] */
6958223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 11, 1),				/* [17] */
6959c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6960c64779e2SAndrii Nakryiko 		},
69617999cf7dSIlya Leoshkevich 		BTF_STR_SEC("\0int\0s\0next\0a\0b\0c\0float\0d"),
6962c64779e2SAndrii Nakryiko 	},
6963c64779e2SAndrii Nakryiko 	.expect = {
6964c64779e2SAndrii Nakryiko 		.raw_types = {
6965c64779e2SAndrii Nakryiko 			/* int */
69667999cf7dSIlya Leoshkevich 			BTF_TYPE_INT_ENC(NAME_NTH(5), BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
6967c64779e2SAndrii Nakryiko 			/* int[16] */
6968c64779e2SAndrii Nakryiko 			BTF_TYPE_ARRAY_ENC(1, 1, 16),					/* [2] */
6969c64779e2SAndrii Nakryiko 			/* struct s { */
69707999cf7dSIlya Leoshkevich 			BTF_STRUCT_ENC(NAME_NTH(8), 5, 88),				/* [3] */
69717999cf7dSIlya Leoshkevich 				BTF_MEMBER_ENC(NAME_NTH(7), 4, 0),	/* struct s *next;	*/
6972c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(1), 5, 64),	/* const int *a;	*/
6973c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 2, 128),	/* int b[16];		*/
6974c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(3), 1, 640),	/* int c;		*/
6975ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(4), 9, 672),	/* float d;		*/
6976c64779e2SAndrii Nakryiko 			/* ptr -> [3] struct s */
6977c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(3),							/* [4] */
6978c64779e2SAndrii Nakryiko 			/* ptr -> [6] const int */
6979c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(6),							/* [5] */
6980c64779e2SAndrii Nakryiko 			/* const -> [1] int */
6981c64779e2SAndrii Nakryiko 			BTF_CONST_ENC(1),						/* [6] */
6982223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1),				/* [7] */
6983223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1),				/* [8] */
6984ad526474SYonghong Song 			BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4),				/* [9] */
6985c64779e2SAndrii Nakryiko 			BTF_END_RAW,
6986c64779e2SAndrii Nakryiko 		},
69877999cf7dSIlya Leoshkevich 		BTF_STR_SEC("\0a\0b\0c\0d\0int\0float\0next\0s"),
6988c64779e2SAndrii Nakryiko 	},
6989c64779e2SAndrii Nakryiko },
6990c64779e2SAndrii Nakryiko {
6991c64779e2SAndrii Nakryiko 	.descr = "dedup: struct <-> fwd resolution w/ hash collision",
6992c64779e2SAndrii Nakryiko 	/*
6993c64779e2SAndrii Nakryiko 	 * // CU 1:
6994c64779e2SAndrii Nakryiko 	 * struct x;
6995c64779e2SAndrii Nakryiko 	 * struct s {
6996c64779e2SAndrii Nakryiko 	 *	struct x *x;
6997c64779e2SAndrii Nakryiko 	 * };
6998c64779e2SAndrii Nakryiko 	 * // CU 2:
6999c64779e2SAndrii Nakryiko 	 * struct x {};
7000c64779e2SAndrii Nakryiko 	 * struct s {
7001c64779e2SAndrii Nakryiko 	 *	struct x *x;
7002c64779e2SAndrii Nakryiko 	 * };
7003c64779e2SAndrii Nakryiko 	 */
7004c64779e2SAndrii Nakryiko 	.input = {
7005c64779e2SAndrii Nakryiko 		.raw_types = {
7006c64779e2SAndrii Nakryiko 			/* CU 1 */
7007c64779e2SAndrii Nakryiko 			BTF_FWD_ENC(NAME_TBD, 0 /* struct fwd */),	/* [1] fwd x      */
7008c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(1),					/* [2] ptr -> [1] */
7009c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [3] struct s   */
7010c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 2, 0),
7011c64779e2SAndrii Nakryiko 			/* CU 2 */
7012c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 0, 0),			/* [4] struct x   */
7013c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(4),					/* [5] ptr -> [4] */
7014c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [6] struct s   */
7015c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 5, 0),
7016c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7017c64779e2SAndrii Nakryiko 		},
7018c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0x\0s\0x\0x\0s\0x\0"),
7019c64779e2SAndrii Nakryiko 	},
7020c64779e2SAndrii Nakryiko 	.expect = {
7021c64779e2SAndrii Nakryiko 		.raw_types = {
7022c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(3),					/* [1] ptr -> [3] */
7023c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 8),			/* [2] struct s   */
7024c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
7025c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(2), 0, 0),		/* [3] struct x   */
7026c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7027c64779e2SAndrii Nakryiko 		},
7028c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0s\0x"),
7029c64779e2SAndrii Nakryiko 	},
7030c64779e2SAndrii Nakryiko 	.opts = {
7031957d350aSAndrii Nakryiko 		.force_collisions = true, /* force hash collisions */
7032c64779e2SAndrii Nakryiko 	},
7033c64779e2SAndrii Nakryiko },
7034c64779e2SAndrii Nakryiko {
7035c64779e2SAndrii Nakryiko 	.descr = "dedup: void equiv check",
7036c64779e2SAndrii Nakryiko 	/*
7037c64779e2SAndrii Nakryiko 	 * // CU 1:
7038c64779e2SAndrii Nakryiko 	 * struct s {
7039c64779e2SAndrii Nakryiko 	 *	struct {} *x;
7040c64779e2SAndrii Nakryiko 	 * };
7041c64779e2SAndrii Nakryiko 	 * // CU 2:
7042c64779e2SAndrii Nakryiko 	 * struct s {
7043c64779e2SAndrii Nakryiko 	 *	int *x;
7044c64779e2SAndrii Nakryiko 	 * };
7045c64779e2SAndrii Nakryiko 	 */
7046c64779e2SAndrii Nakryiko 	.input = {
7047c64779e2SAndrii Nakryiko 		.raw_types = {
7048c64779e2SAndrii Nakryiko 			/* CU 1 */
7049c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(0, 0, 1),				/* [1] struct {}  */
7050c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(1),						/* [2] ptr -> [1] */
7051c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [3] struct s   */
7052c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
7053c64779e2SAndrii Nakryiko 			/* CU 2 */
7054c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(0),						/* [4] ptr -> void */
7055c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [5] struct s   */
7056c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 4, 0),
7057c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7058c64779e2SAndrii Nakryiko 		},
7059c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0s\0x"),
7060c64779e2SAndrii Nakryiko 	},
7061c64779e2SAndrii Nakryiko 	.expect = {
7062c64779e2SAndrii Nakryiko 		.raw_types = {
7063c64779e2SAndrii Nakryiko 			/* CU 1 */
7064c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(0, 0, 1),				/* [1] struct {}  */
7065c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(1),						/* [2] ptr -> [1] */
7066c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [3] struct s   */
7067c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
7068c64779e2SAndrii Nakryiko 			/* CU 2 */
7069c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(0),						/* [4] ptr -> void */
7070c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 8),			/* [5] struct s   */
7071c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_NTH(2), 4, 0),
7072c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7073c64779e2SAndrii Nakryiko 		},
7074c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0s\0x"),
7075c64779e2SAndrii Nakryiko 	},
7076c64779e2SAndrii Nakryiko 	.opts = {
7077957d350aSAndrii Nakryiko 		.force_collisions = true, /* force hash collisions */
7078c64779e2SAndrii Nakryiko 	},
7079c64779e2SAndrii Nakryiko },
7080c64779e2SAndrii Nakryiko {
7081c64779e2SAndrii Nakryiko 	.descr = "dedup: all possible kinds (no duplicates)",
7082c64779e2SAndrii Nakryiko 	.input = {
7083c64779e2SAndrii Nakryiko 		.raw_types = {
7084c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8),		/* [1] int */
7085c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4),	/* [2] enum */
7086c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_TBD, 0),
7087c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_TBD, 1),
7088c64779e2SAndrii Nakryiko 			BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */),			/* [3] fwd */
7089c64779e2SAndrii Nakryiko 			BTF_TYPE_ARRAY_ENC(2, 1, 7),					/* [4] array */
7090c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 4),					/* [5] struct */
7091c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
7092c64779e2SAndrii Nakryiko 			BTF_UNION_ENC(NAME_TBD, 1, 4),					/* [6] union */
7093c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
7094c64779e2SAndrii Nakryiko 			BTF_TYPEDEF_ENC(NAME_TBD, 1),					/* [7] typedef */
7095c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(0),							/* [8] ptr */
7096c64779e2SAndrii Nakryiko 			BTF_CONST_ENC(8),						/* [9] const */
7097c64779e2SAndrii Nakryiko 			BTF_VOLATILE_ENC(8),						/* [10] volatile */
7098c64779e2SAndrii Nakryiko 			BTF_RESTRICT_ENC(8),						/* [11] restrict */
7099c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ENC(1, 2),					/* [12] func_proto */
7100c64779e2SAndrii Nakryiko 				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
7101846f4826SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 18),
7102c64779e2SAndrii Nakryiko 			BTF_FUNC_ENC(NAME_TBD, 12),					/* [13] func */
71037999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_TBD, 2),				/* [14] float */
7104557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 13, -1),				/* [15] decl_tag */
7105557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 13, 1),				/* [16] decl_tag */
7106557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 7, -1),				/* [17] decl_tag */
7107846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_TBD, 8),					/* [18] type_tag */
7108adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8),	/* [19] enum64 */
7109adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_TBD, 0, 0),
7110adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_TBD, 1, 1),
7111c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7112c64779e2SAndrii Nakryiko 		},
7113adc26d13SYonghong 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"),
7114c64779e2SAndrii Nakryiko 	},
7115c64779e2SAndrii Nakryiko 	.expect = {
7116c64779e2SAndrii Nakryiko 		.raw_types = {
7117c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 8),		/* [1] int */
7118c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 4),	/* [2] enum */
7119c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_TBD, 0),
7120c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_TBD, 1),
7121c64779e2SAndrii Nakryiko 			BTF_FWD_ENC(NAME_TBD, 1 /* union kind_flag */),			/* [3] fwd */
7122c64779e2SAndrii Nakryiko 			BTF_TYPE_ARRAY_ENC(2, 1, 7),					/* [4] array */
7123c64779e2SAndrii Nakryiko 			BTF_STRUCT_ENC(NAME_TBD, 1, 4),					/* [5] struct */
7124c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
7125c64779e2SAndrii Nakryiko 			BTF_UNION_ENC(NAME_TBD, 1, 4),					/* [6] union */
7126c64779e2SAndrii Nakryiko 				BTF_MEMBER_ENC(NAME_TBD, 1, 0),
7127c64779e2SAndrii Nakryiko 			BTF_TYPEDEF_ENC(NAME_TBD, 1),					/* [7] typedef */
7128c64779e2SAndrii Nakryiko 			BTF_PTR_ENC(0),							/* [8] ptr */
7129c64779e2SAndrii Nakryiko 			BTF_CONST_ENC(8),						/* [9] const */
7130c64779e2SAndrii Nakryiko 			BTF_VOLATILE_ENC(8),						/* [10] volatile */
7131c64779e2SAndrii Nakryiko 			BTF_RESTRICT_ENC(8),						/* [11] restrict */
7132c64779e2SAndrii Nakryiko 			BTF_FUNC_PROTO_ENC(1, 2),					/* [12] func_proto */
7133c64779e2SAndrii Nakryiko 				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),
7134846f4826SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 18),
7135c64779e2SAndrii Nakryiko 			BTF_FUNC_ENC(NAME_TBD, 12),					/* [13] func */
71367999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_TBD, 2),				/* [14] float */
7137557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 13, -1),				/* [15] decl_tag */
7138557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 13, 1),				/* [16] decl_tag */
7139557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_TBD, 7, -1),				/* [17] decl_tag */
7140846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_TBD, 8),					/* [18] type_tag */
7141adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8),	/* [19] enum64 */
7142adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_TBD, 0, 0),
7143adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_TBD, 1, 1),
7144c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7145c64779e2SAndrii Nakryiko 		},
7146adc26d13SYonghong 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"),
7147c64779e2SAndrii Nakryiko 	},
7148c64779e2SAndrii Nakryiko },
7149c64779e2SAndrii Nakryiko {
71507999cf7dSIlya Leoshkevich 	.descr = "dedup: no int/float duplicates",
7151c64779e2SAndrii Nakryiko 	.input = {
7152c64779e2SAndrii Nakryiko 		.raw_types = {
7153c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8),
7154c64779e2SAndrii Nakryiko 			/* different name */
7155c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8),
7156c64779e2SAndrii Nakryiko 			/* different encoding */
7157c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8),
7158c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8),
7159c64779e2SAndrii Nakryiko 			/* different bit offset */
7160c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8),
7161c64779e2SAndrii Nakryiko 			/* different bit size */
7162c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8),
7163c64779e2SAndrii Nakryiko 			/* different byte size */
7164c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
71657999cf7dSIlya Leoshkevich 			/* all allowed sizes */
71667999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 2),
71677999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 4),
71687999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 8),
71697999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 12),
71707999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 16),
7171c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7172c64779e2SAndrii Nakryiko 		},
71737999cf7dSIlya Leoshkevich 		BTF_STR_SEC("\0int\0some other int\0float"),
7174c64779e2SAndrii Nakryiko 	},
7175c64779e2SAndrii Nakryiko 	.expect = {
7176c64779e2SAndrii Nakryiko 		.raw_types = {
7177c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 8),
7178c64779e2SAndrii Nakryiko 			/* different name */
7179c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(2), BTF_INT_SIGNED, 0, 32, 8),
7180c64779e2SAndrii Nakryiko 			/* different encoding */
7181c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_CHAR, 0, 32, 8),
7182c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_BOOL, 0, 32, 8),
7183c64779e2SAndrii Nakryiko 			/* different bit offset */
7184c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 8, 32, 8),
7185c64779e2SAndrii Nakryiko 			/* different bit size */
7186c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 27, 8),
7187c64779e2SAndrii Nakryiko 			/* different byte size */
7188c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),
71897999cf7dSIlya Leoshkevich 			/* all allowed sizes */
71907999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 2),
71917999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 4),
71927999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 8),
71937999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 12),
71947999cf7dSIlya Leoshkevich 			BTF_TYPE_FLOAT_ENC(NAME_NTH(3), 16),
7195c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7196c64779e2SAndrii Nakryiko 		},
71977999cf7dSIlya Leoshkevich 		BTF_STR_SEC("\0int\0some other int\0float"),
7198c64779e2SAndrii Nakryiko 	},
7199c64779e2SAndrii Nakryiko },
7200c64779e2SAndrii Nakryiko {
7201c64779e2SAndrii Nakryiko 	.descr = "dedup: enum fwd resolution",
7202c64779e2SAndrii Nakryiko 	.input = {
7203c64779e2SAndrii Nakryiko 		.raw_types = {
7204c64779e2SAndrii Nakryiko 			/* [1] fwd enum 'e1' before full enum */
7205c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4),
7206c64779e2SAndrii Nakryiko 			/* [2] full enum 'e1' after fwd */
7207c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
7208c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(2), 123),
7209c64779e2SAndrii Nakryiko 			/* [3] full enum 'e2' before fwd */
7210c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
7211c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(4), 456),
7212c64779e2SAndrii Nakryiko 			/* [4] fwd enum 'e2' after full enum */
7213c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4),
72142e20f50fSEduard Zingerman 			/* [5] fwd enum with different size, size does not matter for fwd */
7215c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 1),
7216c64779e2SAndrii Nakryiko 			/* [6] incompatible full enum with different value */
7217c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
7218c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(2), 321),
7219c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7220c64779e2SAndrii Nakryiko 		},
7221c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
7222c64779e2SAndrii Nakryiko 	},
7223c64779e2SAndrii Nakryiko 	.expect = {
7224c64779e2SAndrii Nakryiko 		.raw_types = {
7225c64779e2SAndrii Nakryiko 			/* [1] full enum 'e1' */
7226c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
7227c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(2), 123),
7228c64779e2SAndrii Nakryiko 			/* [2] full enum 'e2' */
7229c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
7230c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(4), 456),
72312e20f50fSEduard Zingerman 			/* [3] incompatible full enum with different value */
7232c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
7233c64779e2SAndrii Nakryiko 				BTF_ENUM_ENC(NAME_NTH(2), 321),
7234c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7235c64779e2SAndrii Nakryiko 		},
7236c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
7237c64779e2SAndrii Nakryiko 	},
7238c64779e2SAndrii Nakryiko },
7239c64779e2SAndrii Nakryiko {
7240c64779e2SAndrii Nakryiko 	.descr = "dedup: datasec and vars pass-through",
7241c64779e2SAndrii Nakryiko 	.input = {
7242c64779e2SAndrii Nakryiko 		.raw_types = {
7243c64779e2SAndrii Nakryiko 			/* int */
7244c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7245c64779e2SAndrii Nakryiko 			/* static int t */
7246c64779e2SAndrii Nakryiko 			BTF_VAR_ENC(NAME_NTH(2), 1, 0),			/* [2] */
7247c64779e2SAndrii Nakryiko 			/* .bss section */				/* [3] */
7248c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
7249c64779e2SAndrii Nakryiko 			BTF_VAR_SECINFO_ENC(2, 0, 4),
7250c64779e2SAndrii Nakryiko 			/* int, referenced from [5] */
7251c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [4] */
7252c64779e2SAndrii Nakryiko 			/* another static int t */
7253c64779e2SAndrii Nakryiko 			BTF_VAR_ENC(NAME_NTH(2), 4, 0),			/* [5] */
7254c64779e2SAndrii Nakryiko 			/* another .bss section */			/* [6] */
7255c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
7256c64779e2SAndrii Nakryiko 			BTF_VAR_SECINFO_ENC(5, 0, 4),
7257c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7258c64779e2SAndrii Nakryiko 		},
7259c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0.bss\0t"),
7260c64779e2SAndrii Nakryiko 	},
7261c64779e2SAndrii Nakryiko 	.expect = {
7262c64779e2SAndrii Nakryiko 		.raw_types = {
7263c64779e2SAndrii Nakryiko 			/* int */
7264c64779e2SAndrii Nakryiko 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7265c64779e2SAndrii Nakryiko 			/* static int t */
7266c64779e2SAndrii Nakryiko 			BTF_VAR_ENC(NAME_NTH(2), 1, 0),			/* [2] */
7267c64779e2SAndrii Nakryiko 			/* .bss section */				/* [3] */
7268c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
7269c64779e2SAndrii Nakryiko 			BTF_VAR_SECINFO_ENC(2, 0, 4),
7270c64779e2SAndrii Nakryiko 			/* another static int t */
7271c64779e2SAndrii Nakryiko 			BTF_VAR_ENC(NAME_NTH(2), 1, 0),			/* [4] */
7272c64779e2SAndrii Nakryiko 			/* another .bss section */			/* [5] */
7273c64779e2SAndrii Nakryiko 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
7274c64779e2SAndrii Nakryiko 			BTF_VAR_SECINFO_ENC(4, 0, 4),
7275c64779e2SAndrii Nakryiko 			BTF_END_RAW,
7276c64779e2SAndrii Nakryiko 		},
7277c64779e2SAndrii Nakryiko 		BTF_STR_SEC("\0.bss\0t"),
7278c64779e2SAndrii Nakryiko 	},
7279c64779e2SAndrii Nakryiko 	.opts = {
7280957d350aSAndrii Nakryiko 		.force_collisions = true
7281c64779e2SAndrii Nakryiko 	},
7282c64779e2SAndrii Nakryiko },
7283ad526474SYonghong Song {
7284ad526474SYonghong Song 	.descr = "dedup: func/func_arg/var tags",
7285ad526474SYonghong Song 	.input = {
7286ad526474SYonghong Song 		.raw_types = {
7287ad526474SYonghong Song 			/* int */
7288ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7289ad526474SYonghong Song 			/* static int t */
7290ad526474SYonghong Song 			BTF_VAR_ENC(NAME_NTH(1), 1, 0),			/* [2] */
7291ad526474SYonghong Song 			/* void f(int a1, int a2) */
7292ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
7293ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7294ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1),
7295ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(4), 2),			/* [4] */
7296ad526474SYonghong Song 			/* tag -> t */
7297223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */
7298223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [6] */
7299ad526474SYonghong Song 			/* tag -> func */
7300223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [7] */
7301223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [8] */
7302ad526474SYonghong Song 			/* tag -> func arg a1 */
7303223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [9] */
7304223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [10] */
7305ad526474SYonghong Song 			BTF_END_RAW,
7306ad526474SYonghong Song 		},
7307ad526474SYonghong Song 		BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"),
7308ad526474SYonghong Song 	},
7309ad526474SYonghong Song 	.expect = {
7310ad526474SYonghong Song 		.raw_types = {
7311ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7312ad526474SYonghong Song 			BTF_VAR_ENC(NAME_NTH(1), 1, 0),			/* [2] */
7313ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [3] */
7314ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7315ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1),
7316ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(4), 2),			/* [4] */
7317223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */
7318223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [6] */
7319223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [7] */
7320ad526474SYonghong Song 			BTF_END_RAW,
7321ad526474SYonghong Song 		},
7322ad526474SYonghong Song 		BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"),
7323ad526474SYonghong Song 	},
7324ad526474SYonghong Song },
7325ad526474SYonghong Song {
7326ad526474SYonghong Song 	.descr = "dedup: func/func_param tags",
7327ad526474SYonghong Song 	.input = {
7328ad526474SYonghong Song 		.raw_types = {
7329ad526474SYonghong Song 			/* int */
7330ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7331ad526474SYonghong Song 			/* void f(int a1, int a2) */
7332ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
7333ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1),
7334ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7335ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(3), 2),			/* [3] */
7336ad526474SYonghong Song 			/* void f(int a1, int a2) */
7337ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [4] */
7338ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1),
7339ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7340ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(3), 4),			/* [5] */
7341ad526474SYonghong Song 			/* tag -> f: tag1, tag2 */
7342223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [6] */
7343223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1),		/* [7] */
7344ad526474SYonghong Song 			/* tag -> f/a2: tag1, tag2 */
7345223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [8] */
7346223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1),		/* [9] */
7347ad526474SYonghong Song 			/* tag -> f: tag1, tag3 */
7348223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 5, -1),		/* [10] */
7349223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 5, -1),		/* [11] */
7350ad526474SYonghong Song 			/* tag -> f/a2: tag1, tag3 */
7351223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 5, 1),		/* [12] */
7352223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 5, 1),		/* [13] */
7353ad526474SYonghong Song 			BTF_END_RAW,
7354ad526474SYonghong Song 		},
7355ad526474SYonghong Song 		BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"),
7356ad526474SYonghong Song 	},
7357ad526474SYonghong Song 	.expect = {
7358ad526474SYonghong Song 		.raw_types = {
7359ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7360ad526474SYonghong Song 			BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */
7361ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1),
7362ad526474SYonghong Song 				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),
7363ad526474SYonghong Song 			BTF_FUNC_ENC(NAME_NTH(3), 2),			/* [3] */
7364223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [4] */
7365223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1),		/* [5] */
7366223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1),		/* [6] */
7367223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [7] */
7368223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1),		/* [8] */
7369223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1),		/* [9] */
7370ad526474SYonghong Song 			BTF_END_RAW,
7371ad526474SYonghong Song 		},
7372ad526474SYonghong Song 		BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"),
7373ad526474SYonghong Song 	},
7374ad526474SYonghong Song },
7375ad526474SYonghong Song {
7376ad526474SYonghong Song 	.descr = "dedup: struct/struct_member tags",
7377ad526474SYonghong Song 	.input = {
7378ad526474SYonghong Song 		.raw_types = {
7379ad526474SYonghong Song 			/* int */
7380ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7381ad526474SYonghong Song 			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),		/* [2] */
7382ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(2), 1, 0),
7383ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(3), 1, 32),
7384ad526474SYonghong Song 			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),		/* [3] */
7385ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(2), 1, 0),
7386ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(3), 1, 32),
7387ad526474SYonghong Song 			/* tag -> t: tag1, tag2 */
7388223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1),		/* [4] */
7389223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */
7390ad526474SYonghong Song 			/* tag -> t/m2: tag1, tag2 */
7391223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1),		/* [6] */
7392223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1),		/* [7] */
7393ad526474SYonghong Song 			/* tag -> t: tag1, tag3 */
7394223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [8] */
7395223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1),		/* [9] */
7396ad526474SYonghong Song 			/* tag -> t/m2: tag1, tag3 */
7397223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [10] */
7398223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1),		/* [11] */
7399ad526474SYonghong Song 			BTF_END_RAW,
7400ad526474SYonghong Song 		},
7401ad526474SYonghong Song 		BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"),
7402ad526474SYonghong Song 	},
7403ad526474SYonghong Song 	.expect = {
7404ad526474SYonghong Song 		.raw_types = {
7405ad526474SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7406ad526474SYonghong Song 			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),		/* [2] */
7407ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(2), 1, 0),
7408ad526474SYonghong Song 				BTF_MEMBER_ENC(NAME_NTH(3), 1, 32),
7409223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1),		/* [3] */
7410223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [4] */
7411223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 2, -1),		/* [5] */
7412223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1),		/* [6] */
7413223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1),		/* [7] */
7414223f903eSYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(6), 2, 1),		/* [8] */
7415ad526474SYonghong Song 			BTF_END_RAW,
7416ad526474SYonghong Song 		},
7417ad526474SYonghong Song 		BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"),
7418ad526474SYonghong Song 	},
7419ad526474SYonghong Song },
7420557c8c48SYonghong Song {
7421557c8c48SYonghong Song 	.descr = "dedup: typedef tags",
7422557c8c48SYonghong Song 	.input = {
7423557c8c48SYonghong Song 		.raw_types = {
7424557c8c48SYonghong Song 			/* int */
7425557c8c48SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7426557c8c48SYonghong Song 			BTF_TYPEDEF_ENC(NAME_NTH(1), 1),		/* [2] */
7427557c8c48SYonghong Song 			BTF_TYPEDEF_ENC(NAME_NTH(1), 1),		/* [3] */
7428557c8c48SYonghong Song 			/* tag -> t: tag1, tag2 */
7429557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 2, -1),		/* [4] */
7430557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(3), 2, -1),		/* [5] */
7431557c8c48SYonghong Song 			/* tag -> t: tag1, tag3 */
7432557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1),		/* [6] */
7433557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [7] */
7434557c8c48SYonghong Song 			BTF_END_RAW,
7435557c8c48SYonghong Song 		},
7436557c8c48SYonghong Song 		BTF_STR_SEC("\0t\0tag1\0tag2\0tag3"),
7437557c8c48SYonghong Song 	},
7438557c8c48SYonghong Song 	.expect = {
7439557c8c48SYonghong Song 		.raw_types = {
7440557c8c48SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7441557c8c48SYonghong Song 			BTF_TYPEDEF_ENC(NAME_NTH(1), 1),		/* [2] */
7442557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(2), 2, -1),		/* [3] */
7443557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(3), 2, -1),		/* [4] */
7444557c8c48SYonghong Song 			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1),		/* [5] */
7445557c8c48SYonghong Song 			BTF_END_RAW,
7446557c8c48SYonghong Song 		},
7447557c8c48SYonghong Song 		BTF_STR_SEC("\0t\0tag1\0tag2\0tag3"),
7448557c8c48SYonghong Song 	},
7449557c8c48SYonghong Song },
7450846f4826SYonghong Song {
7451846f4826SYonghong Song 	.descr = "dedup: btf_type_tag #1",
7452846f4826SYonghong Song 	.input = {
7453846f4826SYonghong Song 		.raw_types = {
7454846f4826SYonghong Song 			/* ptr -> tag2 -> tag1 -> int */
7455846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7456846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [2] */
7457846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 2),		/* [3] */
7458846f4826SYonghong Song 			BTF_PTR_ENC(3),					/* [4] */
7459846f4826SYonghong Song 			/* ptr -> tag2 -> tag1 -> int */
7460846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [5] */
7461846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 5),		/* [6] */
7462846f4826SYonghong Song 			BTF_PTR_ENC(6),					/* [7] */
7463846f4826SYonghong Song 			/* ptr -> tag1 -> int */
7464846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [8] */
7465846f4826SYonghong Song 			BTF_PTR_ENC(8),					/* [9] */
7466846f4826SYonghong Song 			BTF_END_RAW,
7467846f4826SYonghong Song 		},
7468846f4826SYonghong Song 		BTF_STR_SEC("\0tag1\0tag2"),
7469846f4826SYonghong Song 	},
7470846f4826SYonghong Song 	.expect = {
7471846f4826SYonghong Song 		.raw_types = {
7472846f4826SYonghong Song 			/* ptr -> tag2 -> tag1 -> int */
7473846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7474846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [2] */
7475846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 2),		/* [3] */
7476846f4826SYonghong Song 			BTF_PTR_ENC(3),					/* [4] */
7477846f4826SYonghong Song 			/* ptr -> tag1 -> int */
7478846f4826SYonghong Song 			BTF_PTR_ENC(2),					/* [5] */
7479846f4826SYonghong Song 			BTF_END_RAW,
7480846f4826SYonghong Song 		},
7481846f4826SYonghong Song 		BTF_STR_SEC("\0tag1\0tag2"),
7482846f4826SYonghong Song 	},
7483846f4826SYonghong Song },
7484846f4826SYonghong Song {
7485846f4826SYonghong Song 	.descr = "dedup: btf_type_tag #2",
7486846f4826SYonghong Song 	.input = {
7487846f4826SYonghong Song 		.raw_types = {
7488846f4826SYonghong Song 			/* ptr -> tag2 -> 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_TYPE_TAG_ENC(NAME_NTH(2), 2),		/* [3] */
7492846f4826SYonghong Song 			BTF_PTR_ENC(3),					/* [4] */
7493846f4826SYonghong Song 			/* ptr -> tag2 -> int */
7494846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 1),		/* [5] */
7495846f4826SYonghong Song 			BTF_PTR_ENC(5),					/* [6] */
7496846f4826SYonghong Song 			BTF_END_RAW,
7497846f4826SYonghong Song 		},
7498846f4826SYonghong Song 		BTF_STR_SEC("\0tag1\0tag2"),
7499846f4826SYonghong Song 	},
7500846f4826SYonghong Song 	.expect = {
7501846f4826SYonghong Song 		.raw_types = {
7502846f4826SYonghong Song 			/* ptr -> tag2 -> tag1 -> int */
7503846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7504846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [2] */
7505846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 2),		/* [3] */
7506846f4826SYonghong Song 			BTF_PTR_ENC(3),					/* [4] */
7507846f4826SYonghong Song 			/* ptr -> tag2 -> int */
7508846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 1),		/* [5] */
7509846f4826SYonghong Song 			BTF_PTR_ENC(5),					/* [6] */
7510846f4826SYonghong Song 			BTF_END_RAW,
7511846f4826SYonghong Song 		},
7512846f4826SYonghong Song 		BTF_STR_SEC("\0tag1\0tag2"),
7513846f4826SYonghong Song 	},
7514846f4826SYonghong Song },
7515846f4826SYonghong Song {
7516846f4826SYonghong Song 	.descr = "dedup: btf_type_tag #3",
7517846f4826SYonghong Song 	.input = {
7518846f4826SYonghong Song 		.raw_types = {
7519846f4826SYonghong Song 			/* ptr -> tag2 -> tag1 -> int */
7520846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7521846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [2] */
7522846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 2),		/* [3] */
7523846f4826SYonghong Song 			BTF_PTR_ENC(3),					/* [4] */
7524846f4826SYonghong Song 			/* ptr -> tag1 -> tag2 -> int */
7525846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 1),		/* [5] */
7526846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 5),		/* [6] */
7527846f4826SYonghong Song 			BTF_PTR_ENC(6),					/* [7] */
7528846f4826SYonghong Song 			BTF_END_RAW,
7529846f4826SYonghong Song 		},
7530846f4826SYonghong Song 		BTF_STR_SEC("\0tag1\0tag2"),
7531846f4826SYonghong Song 	},
7532846f4826SYonghong Song 	.expect = {
7533846f4826SYonghong Song 		.raw_types = {
7534846f4826SYonghong Song 			/* ptr -> tag2 -> tag1 -> int */
7535846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7536846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [2] */
7537846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 2),		/* [3] */
7538846f4826SYonghong Song 			BTF_PTR_ENC(3),					/* [4] */
7539846f4826SYonghong Song 			/* ptr -> tag1 -> tag2 -> int */
7540846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(2), 1),		/* [5] */
7541846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 5),		/* [6] */
7542846f4826SYonghong Song 			BTF_PTR_ENC(6),					/* [7] */
7543846f4826SYonghong Song 			BTF_END_RAW,
7544846f4826SYonghong Song 		},
7545846f4826SYonghong Song 		BTF_STR_SEC("\0tag1\0tag2"),
7546846f4826SYonghong Song 	},
7547846f4826SYonghong Song },
7548846f4826SYonghong Song {
7549846f4826SYonghong Song 	.descr = "dedup: btf_type_tag #4",
7550846f4826SYonghong Song 	.input = {
7551846f4826SYonghong Song 		.raw_types = {
7552846f4826SYonghong Song 			/* ptr -> tag1 -> int */
7553846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7554846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [2] */
7555846f4826SYonghong Song 			BTF_PTR_ENC(2),					/* [3] */
7556846f4826SYonghong Song 			/* ptr -> tag1 -> long */
7557846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 64, 8),	/* [4] */
7558846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 4),		/* [5] */
7559846f4826SYonghong Song 			BTF_PTR_ENC(5),					/* [6] */
7560846f4826SYonghong Song 			BTF_END_RAW,
7561846f4826SYonghong Song 		},
7562846f4826SYonghong Song 		BTF_STR_SEC("\0tag1"),
7563846f4826SYonghong Song 	},
7564846f4826SYonghong Song 	.expect = {
7565846f4826SYonghong Song 		.raw_types = {
7566846f4826SYonghong Song 			/* ptr -> tag1 -> int */
7567846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */
7568846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),		/* [2] */
7569846f4826SYonghong Song 			BTF_PTR_ENC(2),					/* [3] */
7570846f4826SYonghong Song 			/* ptr -> tag1 -> long */
7571846f4826SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 64, 8),	/* [4] */
7572846f4826SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 4),		/* [5] */
7573846f4826SYonghong Song 			BTF_PTR_ENC(5),					/* [6] */
7574846f4826SYonghong Song 			BTF_END_RAW,
7575846f4826SYonghong Song 		},
7576846f4826SYonghong Song 		BTF_STR_SEC("\0tag1"),
7577846f4826SYonghong Song 	},
7578846f4826SYonghong Song },
757947461583SYonghong Song {
758047461583SYonghong Song 	.descr = "dedup: btf_type_tag #5, struct",
758147461583SYonghong Song 	.input = {
758247461583SYonghong Song 		.raw_types = {
758347461583SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),				/* [1] */
758447461583SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),					/* [2] */
758547461583SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(2), BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 4),	/* [3] */
758647461583SYonghong Song 			BTF_MEMBER_ENC(NAME_NTH(3), 2, BTF_MEMBER_OFFSET(0, 0)),
758747461583SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),					/* [4] */
758847461583SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(2), BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 4),	/* [5] */
758947461583SYonghong Song 			BTF_MEMBER_ENC(NAME_NTH(3), 4, BTF_MEMBER_OFFSET(0, 0)),
759047461583SYonghong Song 			BTF_END_RAW,
759147461583SYonghong Song 		},
759247461583SYonghong Song 		BTF_STR_SEC("\0tag1\0t\0m"),
759347461583SYonghong Song 	},
759447461583SYonghong Song 	.expect = {
759547461583SYonghong Song 		.raw_types = {
759647461583SYonghong Song 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),				/* [1] */
759747461583SYonghong Song 			BTF_TYPE_TAG_ENC(NAME_NTH(1), 1),					/* [2] */
759847461583SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(2), BTF_INFO_ENC(BTF_KIND_STRUCT, 1, 1), 4),	/* [3] */
759947461583SYonghong Song 			BTF_MEMBER_ENC(NAME_NTH(3), 2, BTF_MEMBER_OFFSET(0, 0)),
760047461583SYonghong Song 			BTF_END_RAW,
760147461583SYonghong Song 		},
760247461583SYonghong Song 		BTF_STR_SEC("\0tag1\0t\0m"),
760347461583SYonghong Song 	},
760447461583SYonghong Song },
7605adc26d13SYonghong Song {
7606adc26d13SYonghong Song 	.descr = "dedup: enum64, standalone",
7607adc26d13SYonghong Song 	.input = {
7608adc26d13SYonghong Song 		.raw_types = {
7609adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7610adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123),
7611adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7612adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123),
7613adc26d13SYonghong Song 			BTF_END_RAW,
7614adc26d13SYonghong Song 		},
7615adc26d13SYonghong Song 		BTF_STR_SEC("\0e1\0e1_val"),
7616adc26d13SYonghong Song 	},
7617adc26d13SYonghong Song 	.expect = {
7618adc26d13SYonghong Song 		.raw_types = {
7619adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7620adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123),
7621adc26d13SYonghong Song 			BTF_END_RAW,
7622adc26d13SYonghong Song 		},
7623adc26d13SYonghong Song 		BTF_STR_SEC("\0e1\0e1_val"),
7624adc26d13SYonghong Song 	},
7625adc26d13SYonghong Song },
7626adc26d13SYonghong Song {
7627adc26d13SYonghong Song 	.descr = "dedup: enum64, fwd resolution",
7628adc26d13SYonghong Song 	.input = {
7629adc26d13SYonghong Song 		.raw_types = {
7630adc26d13SYonghong Song 			/* [1] fwd enum64 'e1' before full enum */
7631adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8),
7632adc26d13SYonghong Song 			/* [2] full enum64 'e1' after fwd */
7633adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7634adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123),
7635adc26d13SYonghong Song 			/* [3] full enum64 'e2' before fwd */
7636adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7637adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(4), 0, 456),
7638adc26d13SYonghong Song 			/* [4] fwd enum64 'e2' after full enum */
7639adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8),
7640adc26d13SYonghong Song 			/* [5] incompatible full enum64 with different value */
7641adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7642adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 0, 321),
7643adc26d13SYonghong Song 			BTF_END_RAW,
7644adc26d13SYonghong Song 		},
7645adc26d13SYonghong Song 		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
7646adc26d13SYonghong Song 	},
7647adc26d13SYonghong Song 	.expect = {
7648adc26d13SYonghong Song 		.raw_types = {
7649adc26d13SYonghong Song 			/* [1] full enum64 'e1' */
7650adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7651adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123),
7652adc26d13SYonghong Song 			/* [2] full enum64 'e2' */
7653adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7654adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(4), 0, 456),
7655adc26d13SYonghong Song 			/* [3] incompatible full enum64 with different value */
7656adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
7657adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 0, 321),
7658adc26d13SYonghong Song 			BTF_END_RAW,
7659adc26d13SYonghong Song 		},
7660adc26d13SYonghong Song 		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"),
7661adc26d13SYonghong Song 	},
7662adc26d13SYonghong Song },
7663adc26d13SYonghong Song {
7664adc26d13SYonghong Song 	.descr = "dedup: enum and enum64, no dedup",
7665adc26d13SYonghong Song 	.input = {
7666adc26d13SYonghong Song 		.raw_types = {
7667adc26d13SYonghong Song 			/* [1] enum 'e1' */
7668adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
7669adc26d13SYonghong Song 				BTF_ENUM_ENC(NAME_NTH(2), 1),
7670adc26d13SYonghong Song 			/* [2] enum64 'e1' */
7671adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 4),
7672adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 0),
7673adc26d13SYonghong Song 			BTF_END_RAW,
7674adc26d13SYonghong Song 		},
7675adc26d13SYonghong Song 		BTF_STR_SEC("\0e1\0e1_val"),
7676adc26d13SYonghong Song 	},
7677adc26d13SYonghong Song 	.expect = {
7678adc26d13SYonghong Song 		.raw_types = {
7679adc26d13SYonghong Song 			/* [1] enum 'e1' */
7680adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
7681adc26d13SYonghong Song 				BTF_ENUM_ENC(NAME_NTH(2), 1),
7682adc26d13SYonghong Song 			/* [2] enum64 'e1' */
7683adc26d13SYonghong Song 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 4),
7684adc26d13SYonghong Song 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 0),
7685adc26d13SYonghong Song 			BTF_END_RAW,
7686adc26d13SYonghong Song 		},
7687adc26d13SYonghong Song 		BTF_STR_SEC("\0e1\0e1_val"),
7688adc26d13SYonghong Song 	},
7689adc26d13SYonghong Song },
76902e20f50fSEduard Zingerman {
76912e20f50fSEduard Zingerman 	.descr = "dedup: enum of different size: no dedup",
76922e20f50fSEduard Zingerman 	.input = {
76932e20f50fSEduard Zingerman 		.raw_types = {
76942e20f50fSEduard Zingerman 			/* [1] enum 'e1' */
76952e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
76962e20f50fSEduard Zingerman 				BTF_ENUM_ENC(NAME_NTH(2), 1),
76972e20f50fSEduard Zingerman 			/* [2] enum 'e1' */
76982e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2),
76992e20f50fSEduard Zingerman 				BTF_ENUM_ENC(NAME_NTH(2), 1),
77002e20f50fSEduard Zingerman 			BTF_END_RAW,
77012e20f50fSEduard Zingerman 		},
77022e20f50fSEduard Zingerman 		BTF_STR_SEC("\0e1\0e1_val"),
77032e20f50fSEduard Zingerman 	},
77042e20f50fSEduard Zingerman 	.expect = {
77052e20f50fSEduard Zingerman 		.raw_types = {
77062e20f50fSEduard Zingerman 			/* [1] enum 'e1' */
77072e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
77082e20f50fSEduard Zingerman 				BTF_ENUM_ENC(NAME_NTH(2), 1),
77092e20f50fSEduard Zingerman 			/* [2] enum 'e1' */
77102e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 2),
77112e20f50fSEduard Zingerman 				BTF_ENUM_ENC(NAME_NTH(2), 1),
77122e20f50fSEduard Zingerman 			BTF_END_RAW,
77132e20f50fSEduard Zingerman 		},
77142e20f50fSEduard Zingerman 		BTF_STR_SEC("\0e1\0e1_val"),
77152e20f50fSEduard Zingerman 	},
77162e20f50fSEduard Zingerman },
77172e20f50fSEduard Zingerman {
77182e20f50fSEduard Zingerman 	.descr = "dedup: enum fwd to enum64",
77192e20f50fSEduard Zingerman 	.input = {
77202e20f50fSEduard Zingerman 		.raw_types = {
77212e20f50fSEduard Zingerman 			/* [1] enum64 'e1' */
77222e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
77232e20f50fSEduard Zingerman 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 0),
77242e20f50fSEduard Zingerman 			/* [2] enum 'e1' fwd */
77252e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 0), 4),
77262e20f50fSEduard Zingerman 			/* [3] typedef enum 'e1' td */
77272e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 2),
77282e20f50fSEduard Zingerman 			BTF_END_RAW,
77292e20f50fSEduard Zingerman 		},
77302e20f50fSEduard Zingerman 		BTF_STR_SEC("\0e1\0e1_val\0td"),
77312e20f50fSEduard Zingerman 	},
77322e20f50fSEduard Zingerman 	.expect = {
77332e20f50fSEduard Zingerman 		.raw_types = {
77342e20f50fSEduard Zingerman 			/* [1] enum64 'e1' */
77352e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8),
77362e20f50fSEduard Zingerman 				BTF_ENUM64_ENC(NAME_NTH(2), 1, 0),
77372e20f50fSEduard Zingerman 			/* [2] typedef enum 'e1' td */
77382e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 1),
77392e20f50fSEduard Zingerman 			BTF_END_RAW,
77402e20f50fSEduard Zingerman 		},
77412e20f50fSEduard Zingerman 		BTF_STR_SEC("\0e1\0e1_val\0td"),
77422e20f50fSEduard Zingerman 	},
77432e20f50fSEduard Zingerman },
77442e20f50fSEduard Zingerman {
77452e20f50fSEduard Zingerman 	.descr = "dedup: enum64 fwd to enum",
77462e20f50fSEduard Zingerman 	.input = {
77472e20f50fSEduard Zingerman 		.raw_types = {
77482e20f50fSEduard Zingerman 			/* [1] enum 'e1' */
77492e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
77502e20f50fSEduard Zingerman 				BTF_ENUM_ENC(NAME_NTH(2), 1),
77512e20f50fSEduard Zingerman 			/* [2] enum64 'e1' fwd */
77522e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8),
77532e20f50fSEduard Zingerman 			/* [3] typedef enum 'e1' td */
77542e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 2),
77552e20f50fSEduard Zingerman 			BTF_END_RAW,
77562e20f50fSEduard Zingerman 		},
77572e20f50fSEduard Zingerman 		BTF_STR_SEC("\0e1\0e1_val\0td"),
77582e20f50fSEduard Zingerman 	},
77592e20f50fSEduard Zingerman 	.expect = {
77602e20f50fSEduard Zingerman 		.raw_types = {
77612e20f50fSEduard Zingerman 			/* [1] enum 'e1' */
77622e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4),
77632e20f50fSEduard Zingerman 				BTF_ENUM_ENC(NAME_NTH(2), 1),
77642e20f50fSEduard Zingerman 			/* [2] typedef enum 'e1' td */
77652e20f50fSEduard Zingerman 			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0), 1),
77662e20f50fSEduard Zingerman 			BTF_END_RAW,
77672e20f50fSEduard Zingerman 		},
77682e20f50fSEduard Zingerman 		BTF_STR_SEC("\0e1\0e1_val\0td"),
77692e20f50fSEduard Zingerman 	},
77702e20f50fSEduard Zingerman },
777199e18fadSEduard Zingerman {
777299e18fadSEduard Zingerman 	.descr = "dedup: standalone fwd declaration struct",
777399e18fadSEduard Zingerman 	/*
777499e18fadSEduard Zingerman 	 * Verify that CU1:foo and CU2:foo would be unified and that
777599e18fadSEduard Zingerman 	 * typedef/ptr would be updated to point to CU1:foo.
777699e18fadSEduard Zingerman 	 *
777799e18fadSEduard Zingerman 	 * // CU 1:
777899e18fadSEduard Zingerman 	 * struct foo { int x; };
777999e18fadSEduard Zingerman 	 *
778099e18fadSEduard Zingerman 	 * // CU 2:
778199e18fadSEduard Zingerman 	 * struct foo;
778299e18fadSEduard Zingerman 	 * typedef struct foo *foo_ptr;
778399e18fadSEduard Zingerman 	 */
778499e18fadSEduard Zingerman 	.input = {
778599e18fadSEduard Zingerman 		.raw_types = {
778699e18fadSEduard Zingerman 			/* CU 1 */
778799e18fadSEduard Zingerman 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 4),             /* [1] */
778899e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
778999e18fadSEduard Zingerman 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
779099e18fadSEduard Zingerman 			/* CU 2 */
779199e18fadSEduard Zingerman 			BTF_FWD_ENC(NAME_NTH(1), 0),                   /* [3] */
779299e18fadSEduard Zingerman 			BTF_PTR_ENC(3),                                /* [4] */
779399e18fadSEduard Zingerman 			BTF_TYPEDEF_ENC(NAME_NTH(3), 4),               /* [5] */
779499e18fadSEduard Zingerman 			BTF_END_RAW,
779599e18fadSEduard Zingerman 		},
779699e18fadSEduard Zingerman 		BTF_STR_SEC("\0foo\0x\0foo_ptr"),
779799e18fadSEduard Zingerman 	},
779899e18fadSEduard Zingerman 	.expect = {
779999e18fadSEduard Zingerman 		.raw_types = {
780099e18fadSEduard Zingerman 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 4),             /* [1] */
780199e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
780299e18fadSEduard Zingerman 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
780399e18fadSEduard Zingerman 			BTF_PTR_ENC(1),                                /* [3] */
780499e18fadSEduard Zingerman 			BTF_TYPEDEF_ENC(NAME_NTH(3), 3),               /* [4] */
780599e18fadSEduard Zingerman 			BTF_END_RAW,
780699e18fadSEduard Zingerman 		},
780799e18fadSEduard Zingerman 		BTF_STR_SEC("\0foo\0x\0foo_ptr"),
780899e18fadSEduard Zingerman 	},
780999e18fadSEduard Zingerman },
781099e18fadSEduard Zingerman {
781199e18fadSEduard Zingerman 	.descr = "dedup: standalone fwd declaration union",
781299e18fadSEduard Zingerman 	/*
781399e18fadSEduard Zingerman 	 * Verify that CU1:foo and CU2:foo would be unified and that
781499e18fadSEduard Zingerman 	 * typedef/ptr would be updated to point to CU1:foo.
781599e18fadSEduard Zingerman 	 * Same as "dedup: standalone fwd declaration struct" but for unions.
781699e18fadSEduard Zingerman 	 *
781799e18fadSEduard Zingerman 	 * // CU 1:
781899e18fadSEduard Zingerman 	 * union foo { int x; };
781999e18fadSEduard Zingerman 	 *
782099e18fadSEduard Zingerman 	 * // CU 2:
782199e18fadSEduard Zingerman 	 * union foo;
782299e18fadSEduard Zingerman 	 * typedef union foo *foo_ptr;
782399e18fadSEduard Zingerman 	 */
782499e18fadSEduard Zingerman 	.input = {
782599e18fadSEduard Zingerman 		.raw_types = {
782699e18fadSEduard Zingerman 			/* CU 1 */
782799e18fadSEduard Zingerman 			BTF_UNION_ENC(NAME_NTH(1), 1, 4),              /* [1] */
782899e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
782999e18fadSEduard Zingerman 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
783099e18fadSEduard Zingerman 			/* CU 2 */
783199e18fadSEduard Zingerman 			BTF_FWD_ENC(NAME_TBD, 1),                      /* [3] */
783299e18fadSEduard Zingerman 			BTF_PTR_ENC(3),                                /* [4] */
783399e18fadSEduard Zingerman 			BTF_TYPEDEF_ENC(NAME_NTH(3), 4),               /* [5] */
783499e18fadSEduard Zingerman 			BTF_END_RAW,
783599e18fadSEduard Zingerman 		},
783699e18fadSEduard Zingerman 		BTF_STR_SEC("\0foo\0x\0foo_ptr"),
783799e18fadSEduard Zingerman 	},
783899e18fadSEduard Zingerman 	.expect = {
783999e18fadSEduard Zingerman 		.raw_types = {
784099e18fadSEduard Zingerman 			BTF_UNION_ENC(NAME_NTH(1), 1, 4),              /* [1] */
784199e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
784299e18fadSEduard Zingerman 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
784399e18fadSEduard Zingerman 			BTF_PTR_ENC(1),                                /* [3] */
784499e18fadSEduard Zingerman 			BTF_TYPEDEF_ENC(NAME_NTH(3), 3),               /* [4] */
784599e18fadSEduard Zingerman 			BTF_END_RAW,
784699e18fadSEduard Zingerman 		},
784799e18fadSEduard Zingerman 		BTF_STR_SEC("\0foo\0x\0foo_ptr"),
784899e18fadSEduard Zingerman 	},
784999e18fadSEduard Zingerman },
785099e18fadSEduard Zingerman {
785199e18fadSEduard Zingerman 	.descr = "dedup: standalone fwd declaration wrong kind",
785299e18fadSEduard Zingerman 	/*
785399e18fadSEduard Zingerman 	 * Negative test for btf_dedup_resolve_fwds:
785499e18fadSEduard Zingerman 	 * - CU1:foo is a struct, C2:foo is a union, thus CU2:foo is not deduped;
785599e18fadSEduard Zingerman 	 * - typedef/ptr should remain unchanged as well.
785699e18fadSEduard Zingerman 	 *
785799e18fadSEduard Zingerman 	 * // CU 1:
785899e18fadSEduard Zingerman 	 * struct foo { int x; };
785999e18fadSEduard Zingerman 	 *
786099e18fadSEduard Zingerman 	 * // CU 2:
786199e18fadSEduard Zingerman 	 * union foo;
786299e18fadSEduard Zingerman 	 * typedef union foo *foo_ptr;
786399e18fadSEduard Zingerman 	 */
786499e18fadSEduard Zingerman 	.input = {
786599e18fadSEduard Zingerman 		.raw_types = {
786699e18fadSEduard Zingerman 			/* CU 1 */
786799e18fadSEduard Zingerman 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 4),             /* [1] */
786899e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
786999e18fadSEduard Zingerman 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
787099e18fadSEduard Zingerman 			/* CU 2 */
787199e18fadSEduard Zingerman 			BTF_FWD_ENC(NAME_NTH(3), 1),                   /* [3] */
787299e18fadSEduard Zingerman 			BTF_PTR_ENC(3),                                /* [4] */
787399e18fadSEduard Zingerman 			BTF_TYPEDEF_ENC(NAME_NTH(3), 4),               /* [5] */
787499e18fadSEduard Zingerman 			BTF_END_RAW,
787599e18fadSEduard Zingerman 		},
787699e18fadSEduard Zingerman 		BTF_STR_SEC("\0foo\0x\0foo_ptr"),
787799e18fadSEduard Zingerman 	},
787899e18fadSEduard Zingerman 	.expect = {
787999e18fadSEduard Zingerman 		.raw_types = {
788099e18fadSEduard Zingerman 			/* CU 1 */
788199e18fadSEduard Zingerman 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 4),             /* [1] */
788299e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
788399e18fadSEduard Zingerman 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
788499e18fadSEduard Zingerman 			/* CU 2 */
788599e18fadSEduard Zingerman 			BTF_FWD_ENC(NAME_NTH(3), 1),                   /* [3] */
788699e18fadSEduard Zingerman 			BTF_PTR_ENC(3),                                /* [4] */
788799e18fadSEduard Zingerman 			BTF_TYPEDEF_ENC(NAME_NTH(3), 4),               /* [5] */
788899e18fadSEduard Zingerman 			BTF_END_RAW,
788999e18fadSEduard Zingerman 		},
789099e18fadSEduard Zingerman 		BTF_STR_SEC("\0foo\0x\0foo_ptr"),
789199e18fadSEduard Zingerman 	},
789299e18fadSEduard Zingerman },
789399e18fadSEduard Zingerman {
789499e18fadSEduard Zingerman 	.descr = "dedup: standalone fwd declaration name conflict",
789599e18fadSEduard Zingerman 	/*
789699e18fadSEduard Zingerman 	 * Negative test for btf_dedup_resolve_fwds:
789799e18fadSEduard Zingerman 	 * - two candidates for CU2:foo dedup, thus it is unchanged;
789899e18fadSEduard Zingerman 	 * - typedef/ptr should remain unchanged as well.
789999e18fadSEduard Zingerman 	 *
790099e18fadSEduard Zingerman 	 * // CU 1:
790199e18fadSEduard Zingerman 	 * struct foo { int x; };
790299e18fadSEduard Zingerman 	 *
790399e18fadSEduard Zingerman 	 * // CU 2:
790499e18fadSEduard Zingerman 	 * struct foo;
790599e18fadSEduard Zingerman 	 * typedef struct foo *foo_ptr;
790699e18fadSEduard Zingerman 	 *
790799e18fadSEduard Zingerman 	 * // CU 3:
790899e18fadSEduard Zingerman 	 * struct foo { int x; int y; };
790999e18fadSEduard Zingerman 	 */
791099e18fadSEduard Zingerman 	.input = {
791199e18fadSEduard Zingerman 		.raw_types = {
791299e18fadSEduard Zingerman 			/* CU 1 */
791399e18fadSEduard Zingerman 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 4),             /* [1] */
791499e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
791599e18fadSEduard Zingerman 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
791699e18fadSEduard Zingerman 			/* CU 2 */
791799e18fadSEduard Zingerman 			BTF_FWD_ENC(NAME_NTH(1), 0),                   /* [3] */
791899e18fadSEduard Zingerman 			BTF_PTR_ENC(3),                                /* [4] */
791999e18fadSEduard Zingerman 			BTF_TYPEDEF_ENC(NAME_NTH(4), 4),               /* [5] */
792099e18fadSEduard Zingerman 			/* CU 3 */
792199e18fadSEduard Zingerman 			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),             /* [6] */
792299e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
792399e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(3), 2, 0),
792499e18fadSEduard Zingerman 			BTF_END_RAW,
792599e18fadSEduard Zingerman 		},
792699e18fadSEduard Zingerman 		BTF_STR_SEC("\0foo\0x\0y\0foo_ptr"),
792799e18fadSEduard Zingerman 	},
792899e18fadSEduard Zingerman 	.expect = {
792999e18fadSEduard Zingerman 		.raw_types = {
793099e18fadSEduard Zingerman 			/* CU 1 */
793199e18fadSEduard Zingerman 			BTF_STRUCT_ENC(NAME_NTH(1), 1, 4),             /* [1] */
793299e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
793399e18fadSEduard Zingerman 			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [2] */
793499e18fadSEduard Zingerman 			/* CU 2 */
793599e18fadSEduard Zingerman 			BTF_FWD_ENC(NAME_NTH(1), 0),                   /* [3] */
793699e18fadSEduard Zingerman 			BTF_PTR_ENC(3),                                /* [4] */
793799e18fadSEduard Zingerman 			BTF_TYPEDEF_ENC(NAME_NTH(4), 4),               /* [5] */
793899e18fadSEduard Zingerman 			/* CU 3 */
793999e18fadSEduard Zingerman 			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),             /* [6] */
794099e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(2), 2, 0),
794199e18fadSEduard Zingerman 			BTF_MEMBER_ENC(NAME_NTH(3), 2, 0),
794299e18fadSEduard Zingerman 			BTF_END_RAW,
794399e18fadSEduard Zingerman 		},
794499e18fadSEduard Zingerman 		BTF_STR_SEC("\0foo\0x\0y\0foo_ptr"),
794599e18fadSEduard Zingerman 	},
794699e18fadSEduard Zingerman },
7947c64779e2SAndrii Nakryiko };
7948c64779e2SAndrii Nakryiko 
btf_type_size(const struct btf_type * t)7949c64779e2SAndrii Nakryiko static int btf_type_size(const struct btf_type *t)
7950c64779e2SAndrii Nakryiko {
7951c64779e2SAndrii Nakryiko 	int base_size = sizeof(struct btf_type);
7952c64779e2SAndrii Nakryiko 	__u16 vlen = BTF_INFO_VLEN(t->info);
7953c64779e2SAndrii Nakryiko 	__u16 kind = BTF_INFO_KIND(t->info);
7954c64779e2SAndrii Nakryiko 
7955c64779e2SAndrii Nakryiko 	switch (kind) {
7956c64779e2SAndrii Nakryiko 	case BTF_KIND_FWD:
7957c64779e2SAndrii Nakryiko 	case BTF_KIND_CONST:
7958c64779e2SAndrii Nakryiko 	case BTF_KIND_VOLATILE:
7959c64779e2SAndrii Nakryiko 	case BTF_KIND_RESTRICT:
7960c64779e2SAndrii Nakryiko 	case BTF_KIND_PTR:
7961c64779e2SAndrii Nakryiko 	case BTF_KIND_TYPEDEF:
7962c64779e2SAndrii Nakryiko 	case BTF_KIND_FUNC:
79637e72aad3SIlya Leoshkevich 	case BTF_KIND_FLOAT:
79646aa5dabcSYonghong Song 	case BTF_KIND_TYPE_TAG:
7965c64779e2SAndrii Nakryiko 		return base_size;
7966c64779e2SAndrii Nakryiko 	case BTF_KIND_INT:
7967c64779e2SAndrii Nakryiko 		return base_size + sizeof(__u32);
7968c64779e2SAndrii Nakryiko 	case BTF_KIND_ENUM:
7969c64779e2SAndrii Nakryiko 		return base_size + vlen * sizeof(struct btf_enum);
7970adc26d13SYonghong Song 	case BTF_KIND_ENUM64:
7971adc26d13SYonghong Song 		return base_size + vlen * sizeof(struct btf_enum64);
7972c64779e2SAndrii Nakryiko 	case BTF_KIND_ARRAY:
7973c64779e2SAndrii Nakryiko 		return base_size + sizeof(struct btf_array);
7974c64779e2SAndrii Nakryiko 	case BTF_KIND_STRUCT:
7975c64779e2SAndrii Nakryiko 	case BTF_KIND_UNION:
7976c64779e2SAndrii Nakryiko 		return base_size + vlen * sizeof(struct btf_member);
7977c64779e2SAndrii Nakryiko 	case BTF_KIND_FUNC_PROTO:
7978c64779e2SAndrii Nakryiko 		return base_size + vlen * sizeof(struct btf_param);
7979c64779e2SAndrii Nakryiko 	case BTF_KIND_VAR:
7980c64779e2SAndrii Nakryiko 		return base_size + sizeof(struct btf_var);
7981c64779e2SAndrii Nakryiko 	case BTF_KIND_DATASEC:
7982c64779e2SAndrii Nakryiko 		return base_size + vlen * sizeof(struct btf_var_secinfo);
7983223f903eSYonghong Song 	case BTF_KIND_DECL_TAG:
7984223f903eSYonghong Song 		return base_size + sizeof(struct btf_decl_tag);
7985c64779e2SAndrii Nakryiko 	default:
7986c64779e2SAndrii Nakryiko 		fprintf(stderr, "Unsupported BTF_KIND:%u\n", kind);
7987c64779e2SAndrii Nakryiko 		return -EINVAL;
7988c64779e2SAndrii Nakryiko 	}
7989c64779e2SAndrii Nakryiko }
7990c64779e2SAndrii Nakryiko 
dump_btf_strings(const char * strs,__u32 len)7991c64779e2SAndrii Nakryiko static void dump_btf_strings(const char *strs, __u32 len)
7992c64779e2SAndrii Nakryiko {
7993c64779e2SAndrii Nakryiko 	const char *cur = strs;
7994c64779e2SAndrii Nakryiko 	int i = 0;
7995c64779e2SAndrii Nakryiko 
7996c64779e2SAndrii Nakryiko 	while (cur < strs + len) {
7997c64779e2SAndrii Nakryiko 		fprintf(stderr, "string #%d: '%s'\n", i, cur);
7998c64779e2SAndrii Nakryiko 		cur += strlen(cur) + 1;
7999c64779e2SAndrii Nakryiko 		i++;
8000c64779e2SAndrii Nakryiko 	}
8001c64779e2SAndrii Nakryiko }
8002c64779e2SAndrii Nakryiko 
do_test_dedup(unsigned int test_num)8003c64779e2SAndrii Nakryiko static void do_test_dedup(unsigned int test_num)
8004c64779e2SAndrii Nakryiko {
8005957d350aSAndrii Nakryiko 	struct btf_dedup_test *test = &dedup_tests[test_num - 1];
8006c64779e2SAndrii Nakryiko 	__u32 test_nr_types, expect_nr_types, test_btf_size, expect_btf_size;
8007c64779e2SAndrii Nakryiko 	const struct btf_header *test_hdr, *expect_hdr;
8008c64779e2SAndrii Nakryiko 	struct btf *test_btf = NULL, *expect_btf = NULL;
8009c64779e2SAndrii Nakryiko 	const void *test_btf_data, *expect_btf_data;
8010c64779e2SAndrii Nakryiko 	const char *ret_test_next_str, *ret_expect_next_str;
8011c64779e2SAndrii Nakryiko 	const char *test_strs, *expect_strs;
8012d9448f94SAndrii Nakryiko 	const char *test_str_cur;
8013c64779e2SAndrii Nakryiko 	const char *expect_str_cur, *expect_str_end;
8014c64779e2SAndrii Nakryiko 	unsigned int raw_btf_size;
8015c64779e2SAndrii Nakryiko 	void *raw_btf;
8016c64779e2SAndrii Nakryiko 	int err = 0, i;
8017c64779e2SAndrii Nakryiko 
8018c64779e2SAndrii Nakryiko 	if (!test__start_subtest(test->descr))
8019c64779e2SAndrii Nakryiko 		return;
8020c64779e2SAndrii Nakryiko 
8021c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl, test->input.raw_types,
8022c64779e2SAndrii Nakryiko 				 test->input.str_sec, test->input.str_sec_size,
8023c64779e2SAndrii Nakryiko 				 &raw_btf_size, &ret_test_next_str);
8024c64779e2SAndrii Nakryiko 	if (!raw_btf)
8025c64779e2SAndrii Nakryiko 		return;
8026c64779e2SAndrii Nakryiko 
8027c64779e2SAndrii Nakryiko 	test_btf = btf__new((__u8 *)raw_btf, raw_btf_size);
8028bad2e478SAndrii Nakryiko 	err = libbpf_get_error(test_btf);
8029c64779e2SAndrii Nakryiko 	free(raw_btf);
8030bad2e478SAndrii Nakryiko 	if (CHECK(err, "invalid test_btf errno:%d", err)) {
8031c64779e2SAndrii Nakryiko 		err = -1;
8032c64779e2SAndrii Nakryiko 		goto done;
8033c64779e2SAndrii Nakryiko 	}
8034c64779e2SAndrii Nakryiko 
8035c64779e2SAndrii Nakryiko 	raw_btf = btf_raw_create(&hdr_tmpl, test->expect.raw_types,
8036c64779e2SAndrii Nakryiko 				 test->expect.str_sec,
8037c64779e2SAndrii Nakryiko 				 test->expect.str_sec_size,
8038c64779e2SAndrii Nakryiko 				 &raw_btf_size, &ret_expect_next_str);
8039c64779e2SAndrii Nakryiko 	if (!raw_btf)
8040c64779e2SAndrii Nakryiko 		return;
8041c64779e2SAndrii Nakryiko 	expect_btf = btf__new((__u8 *)raw_btf, raw_btf_size);
8042bad2e478SAndrii Nakryiko 	err = libbpf_get_error(expect_btf);
8043c64779e2SAndrii Nakryiko 	free(raw_btf);
8044bad2e478SAndrii Nakryiko 	if (CHECK(err, "invalid expect_btf errno:%d", err)) {
8045c64779e2SAndrii Nakryiko 		err = -1;
8046c64779e2SAndrii Nakryiko 		goto done;
8047c64779e2SAndrii Nakryiko 	}
8048c64779e2SAndrii Nakryiko 
8049957d350aSAndrii Nakryiko 	test->opts.sz = sizeof(test->opts);
8050957d350aSAndrii Nakryiko 	err = btf__dedup(test_btf, &test->opts);
8051c64779e2SAndrii Nakryiko 	if (CHECK(err, "btf_dedup failed errno:%d", err)) {
8052c64779e2SAndrii Nakryiko 		err = -1;
8053c64779e2SAndrii Nakryiko 		goto done;
8054c64779e2SAndrii Nakryiko 	}
8055c64779e2SAndrii Nakryiko 
8056487ef148SHengqi Chen 	test_btf_data = btf__raw_data(test_btf, &test_btf_size);
8057487ef148SHengqi Chen 	expect_btf_data = btf__raw_data(expect_btf, &expect_btf_size);
8058c64779e2SAndrii Nakryiko 	if (CHECK(test_btf_size != expect_btf_size,
8059c64779e2SAndrii Nakryiko 		  "test_btf_size:%u != expect_btf_size:%u",
8060c64779e2SAndrii Nakryiko 		  test_btf_size, expect_btf_size)) {
8061c64779e2SAndrii Nakryiko 		err = -1;
8062c64779e2SAndrii Nakryiko 		goto done;
8063c64779e2SAndrii Nakryiko 	}
8064c64779e2SAndrii Nakryiko 
8065c64779e2SAndrii Nakryiko 	test_hdr = test_btf_data;
8066c64779e2SAndrii Nakryiko 	test_strs = test_btf_data + sizeof(*test_hdr) + test_hdr->str_off;
8067c64779e2SAndrii Nakryiko 	expect_hdr = expect_btf_data;
8068c64779e2SAndrii Nakryiko 	expect_strs = expect_btf_data + sizeof(*test_hdr) + expect_hdr->str_off;
8069c64779e2SAndrii Nakryiko 	if (CHECK(test_hdr->str_len != expect_hdr->str_len,
8070c64779e2SAndrii Nakryiko 		  "test_hdr->str_len:%u != expect_hdr->str_len:%u",
8071c64779e2SAndrii Nakryiko 		  test_hdr->str_len, expect_hdr->str_len)) {
8072c64779e2SAndrii Nakryiko 		fprintf(stderr, "\ntest strings:\n");
8073c64779e2SAndrii Nakryiko 		dump_btf_strings(test_strs, test_hdr->str_len);
8074c64779e2SAndrii Nakryiko 		fprintf(stderr, "\nexpected strings:\n");
8075c64779e2SAndrii Nakryiko 		dump_btf_strings(expect_strs, expect_hdr->str_len);
8076c64779e2SAndrii Nakryiko 		err = -1;
8077c64779e2SAndrii Nakryiko 		goto done;
8078c64779e2SAndrii Nakryiko 	}
8079c64779e2SAndrii Nakryiko 
8080c64779e2SAndrii Nakryiko 	expect_str_cur = expect_strs;
8081c64779e2SAndrii Nakryiko 	expect_str_end = expect_strs + expect_hdr->str_len;
8082d9448f94SAndrii Nakryiko 	while (expect_str_cur < expect_str_end) {
8083c64779e2SAndrii Nakryiko 		size_t test_len, expect_len;
8084d9448f94SAndrii Nakryiko 		int off;
8085d9448f94SAndrii Nakryiko 
8086d9448f94SAndrii Nakryiko 		off = btf__find_str(test_btf, expect_str_cur);
8087d9448f94SAndrii Nakryiko 		if (CHECK(off < 0, "exp str '%s' not found: %d\n", expect_str_cur, off)) {
8088d9448f94SAndrii Nakryiko 			err = -1;
8089d9448f94SAndrii Nakryiko 			goto done;
8090d9448f94SAndrii Nakryiko 		}
8091d9448f94SAndrii Nakryiko 		test_str_cur = btf__str_by_offset(test_btf, off);
8092c64779e2SAndrii Nakryiko 
8093c64779e2SAndrii Nakryiko 		test_len = strlen(test_str_cur);
8094c64779e2SAndrii Nakryiko 		expect_len = strlen(expect_str_cur);
8095c64779e2SAndrii Nakryiko 		if (CHECK(test_len != expect_len,
8096c64779e2SAndrii Nakryiko 			  "test_len:%zu != expect_len:%zu "
8097c64779e2SAndrii Nakryiko 			  "(test_str:%s, expect_str:%s)",
8098c64779e2SAndrii Nakryiko 			  test_len, expect_len, test_str_cur, expect_str_cur)) {
8099c64779e2SAndrii Nakryiko 			err = -1;
8100c64779e2SAndrii Nakryiko 			goto done;
8101c64779e2SAndrii Nakryiko 		}
8102c64779e2SAndrii Nakryiko 		if (CHECK(strcmp(test_str_cur, expect_str_cur),
8103c64779e2SAndrii Nakryiko 			  "test_str:%s != expect_str:%s",
8104c64779e2SAndrii Nakryiko 			  test_str_cur, expect_str_cur)) {
8105c64779e2SAndrii Nakryiko 			err = -1;
8106c64779e2SAndrii Nakryiko 			goto done;
8107c64779e2SAndrii Nakryiko 		}
8108c64779e2SAndrii Nakryiko 		expect_str_cur += expect_len + 1;
8109c64779e2SAndrii Nakryiko 	}
8110c64779e2SAndrii Nakryiko 
8111487ef148SHengqi Chen 	test_nr_types = btf__type_cnt(test_btf);
8112487ef148SHengqi Chen 	expect_nr_types = btf__type_cnt(expect_btf);
8113c64779e2SAndrii Nakryiko 	if (CHECK(test_nr_types != expect_nr_types,
8114c64779e2SAndrii Nakryiko 		  "test_nr_types:%u != expect_nr_types:%u",
8115c64779e2SAndrii Nakryiko 		  test_nr_types, expect_nr_types)) {
8116c64779e2SAndrii Nakryiko 		err = -1;
8117c64779e2SAndrii Nakryiko 		goto done;
8118c64779e2SAndrii Nakryiko 	}
8119c64779e2SAndrii Nakryiko 
8120487ef148SHengqi Chen 	for (i = 1; i < test_nr_types; i++) {
8121c64779e2SAndrii Nakryiko 		const struct btf_type *test_type, *expect_type;
8122c64779e2SAndrii Nakryiko 		int test_size, expect_size;
8123c64779e2SAndrii Nakryiko 
8124c64779e2SAndrii Nakryiko 		test_type = btf__type_by_id(test_btf, i);
8125c64779e2SAndrii Nakryiko 		expect_type = btf__type_by_id(expect_btf, i);
8126c64779e2SAndrii Nakryiko 		test_size = btf_type_size(test_type);
8127c64779e2SAndrii Nakryiko 		expect_size = btf_type_size(expect_type);
8128c64779e2SAndrii Nakryiko 
8129c64779e2SAndrii Nakryiko 		if (CHECK(test_size != expect_size,
8130c64779e2SAndrii Nakryiko 			  "type #%d: test_size:%d != expect_size:%u",
8131c64779e2SAndrii Nakryiko 			  i, test_size, expect_size)) {
8132c64779e2SAndrii Nakryiko 			err = -1;
8133c64779e2SAndrii Nakryiko 			goto done;
8134c64779e2SAndrii Nakryiko 		}
8135d9448f94SAndrii Nakryiko 		if (CHECK(btf_kind(test_type) != btf_kind(expect_type),
8136d9448f94SAndrii Nakryiko 			  "type %d kind: exp %d != got %u\n",
8137d9448f94SAndrii Nakryiko 			  i, btf_kind(expect_type), btf_kind(test_type))) {
8138d9448f94SAndrii Nakryiko 			err = -1;
8139d9448f94SAndrii Nakryiko 			goto done;
8140d9448f94SAndrii Nakryiko 		}
8141d9448f94SAndrii Nakryiko 		if (CHECK(test_type->info != expect_type->info,
8142d9448f94SAndrii Nakryiko 			  "type %d info: exp %d != got %u\n",
8143d9448f94SAndrii Nakryiko 			  i, expect_type->info, test_type->info)) {
8144d9448f94SAndrii Nakryiko 			err = -1;
8145d9448f94SAndrii Nakryiko 			goto done;
8146d9448f94SAndrii Nakryiko 		}
8147d9448f94SAndrii Nakryiko 		if (CHECK(test_type->size != expect_type->size,
8148d9448f94SAndrii Nakryiko 			  "type %d size/type: exp %d != got %u\n",
8149d9448f94SAndrii Nakryiko 			  i, expect_type->size, test_type->size)) {
8150c64779e2SAndrii Nakryiko 			err = -1;
8151c64779e2SAndrii Nakryiko 			goto done;
8152c64779e2SAndrii Nakryiko 		}
8153c64779e2SAndrii Nakryiko 	}
8154c64779e2SAndrii Nakryiko 
8155c64779e2SAndrii Nakryiko done:
8156c64779e2SAndrii Nakryiko 	btf__free(test_btf);
8157c64779e2SAndrii Nakryiko 	btf__free(expect_btf);
8158c64779e2SAndrii Nakryiko }
8159c64779e2SAndrii Nakryiko 
test_btf(void)8160c64779e2SAndrii Nakryiko void test_btf(void)
8161c64779e2SAndrii Nakryiko {
8162c64779e2SAndrii Nakryiko 	int i;
8163c64779e2SAndrii Nakryiko 
8164c64779e2SAndrii Nakryiko 	always_log = env.verbosity > VERBOSE_NONE;
8165c64779e2SAndrii Nakryiko 
8166c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(raw_tests); i++)
8167c64779e2SAndrii Nakryiko 		do_test_raw(i);
8168c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(get_info_tests); i++)
8169c64779e2SAndrii Nakryiko 		do_test_get_info(i);
8170c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(file_tests); i++)
8171c64779e2SAndrii Nakryiko 		do_test_file(i);
8172c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(info_raw_tests); i++)
8173c64779e2SAndrii Nakryiko 		do_test_info_raw(i);
8174c64779e2SAndrii Nakryiko 	for (i = 1; i <= ARRAY_SIZE(dedup_tests); i++)
8175c64779e2SAndrii Nakryiko 		do_test_dedup(i);
8176c64779e2SAndrii Nakryiko 	test_pprint();
8177c64779e2SAndrii Nakryiko }
8178