brintos

brintos / linux-shallow public Read only

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