xref: /third_party/libbpf/src/btf.c (revision 7c2aad20)
1// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2/* Copyright (c) 2018 Facebook */
3
4#include <byteswap.h>
5#include <endian.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <fcntl.h>
10#include <unistd.h>
11#include <errno.h>
12#include <sys/utsname.h>
13#include <sys/param.h>
14#include <sys/stat.h>
15#include <linux/kernel.h>
16#include <linux/err.h>
17#include <linux/btf.h>
18
19#ifdef HAVE_LIBELF
20#include <gelf.h>
21#endif
22
23#include "btf.h"
24#include "bpf.h"
25#include "libbpf.h"
26#include "libbpf_internal.h"
27#include "hashmap.h"
28#include "strset.h"
29
30#define BTF_MAX_NR_TYPES 0x7fffffffU
31#define BTF_MAX_STR_OFFSET 0x7fffffffU
32
33static struct btf_type btf_void;
34
35struct btf {
36	/* raw BTF data in native endianness */
37	void *raw_data;
38	/* raw BTF data in non-native endianness */
39	void *raw_data_swapped;
40	__u32 raw_size;
41	/* whether target endianness differs from the native one */
42	bool swapped_endian;
43
44	/*
45	 * When BTF is loaded from an ELF or raw memory it is stored
46	 * in a contiguous memory block. The hdr, type_data, and, strs_data
47	 * point inside that memory region to their respective parts of BTF
48	 * representation:
49	 *
50	 * +--------------------------------+
51	 * |  Header  |  Types  |  Strings  |
52	 * +--------------------------------+
53	 * ^          ^         ^
54	 * |          |         |
55	 * hdr        |         |
56	 * types_data-+         |
57	 * strs_data------------+
58	 *
59	 * If BTF data is later modified, e.g., due to types added or
60	 * removed, BTF deduplication performed, etc, this contiguous
61	 * representation is broken up into three independently allocated
62	 * memory regions to be able to modify them independently.
63	 * raw_data is nulled out at that point, but can be later allocated
64	 * and cached again if user calls btf__raw_data(), at which point
65	 * raw_data will contain a contiguous copy of header, types, and
66	 * strings:
67	 *
68	 * +----------+  +---------+  +-----------+
69	 * |  Header  |  |  Types  |  |  Strings  |
70	 * +----------+  +---------+  +-----------+
71	 * ^             ^            ^
72	 * |             |            |
73	 * hdr           |            |
74	 * types_data----+            |
75	 * strset__data(strs_set)-----+
76	 *
77	 *               +----------+---------+-----------+
78	 *               |  Header  |  Types  |  Strings  |
79	 * raw_data----->+----------+---------+-----------+
80	 */
81	struct btf_header *hdr;
82
83	void *types_data;
84	size_t types_data_cap; /* used size stored in hdr->type_len */
85
86	/* type ID to `struct btf_type *` lookup index
87	 * type_offs[0] corresponds to the first non-VOID type:
88	 *   - for base BTF it's type [1];
89	 *   - for split BTF it's the first non-base BTF type.
90	 */
91	__u32 *type_offs;
92	size_t type_offs_cap;
93	/* number of types in this BTF instance:
94	 *   - doesn't include special [0] void type;
95	 *   - for split BTF counts number of types added on top of base BTF.
96	 */
97	__u32 nr_types;
98	/* if not NULL, points to the base BTF on top of which the current
99	 * split BTF is based
100	 */
101	struct btf *base_btf;
102	/* BTF type ID of the first type in this BTF instance:
103	 *   - for base BTF it's equal to 1;
104	 *   - for split BTF it's equal to biggest type ID of base BTF plus 1.
105	 */
106	int start_id;
107	/* logical string offset of this BTF instance:
108	 *   - for base BTF it's equal to 0;
109	 *   - for split BTF it's equal to total size of base BTF's string section size.
110	 */
111	int start_str_off;
112
113	/* only one of strs_data or strs_set can be non-NULL, depending on
114	 * whether BTF is in a modifiable state (strs_set is used) or not
115	 * (strs_data points inside raw_data)
116	 */
117	void *strs_data;
118	/* a set of unique strings */
119	struct strset *strs_set;
120	/* whether strings are already deduplicated */
121	bool strs_deduped;
122
123	/* BTF object FD, if loaded into kernel */
124	int fd;
125
126	/* Pointer size (in bytes) for a target architecture of this BTF */
127	int ptr_sz;
128};
129
130static inline __u64 ptr_to_u64(const void *ptr)
131{
132	return (__u64) (unsigned long) ptr;
133}
134
135/* Ensure given dynamically allocated memory region pointed to by *data* with
136 * capacity of *cap_cnt* elements each taking *elem_sz* bytes has enough
137 * memory to accommodate *add_cnt* new elements, assuming *cur_cnt* elements
138 * are already used. At most *max_cnt* elements can be ever allocated.
139 * If necessary, memory is reallocated and all existing data is copied over,
140 * new pointer to the memory region is stored at *data, new memory region
141 * capacity (in number of elements) is stored in *cap.
142 * On success, memory pointer to the beginning of unused memory is returned.
143 * On error, NULL is returned.
144 */
145void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz,
146		     size_t cur_cnt, size_t max_cnt, size_t add_cnt)
147{
148	size_t new_cnt;
149	void *new_data;
150
151	if (cur_cnt + add_cnt <= *cap_cnt)
152		return *data + cur_cnt * elem_sz;
153
154	/* requested more than the set limit */
155	if (cur_cnt + add_cnt > max_cnt)
156		return NULL;
157
158	new_cnt = *cap_cnt;
159	new_cnt += new_cnt / 4;		  /* expand by 25% */
160	if (new_cnt < 16)		  /* but at least 16 elements */
161		new_cnt = 16;
162	if (new_cnt > max_cnt)		  /* but not exceeding a set limit */
163		new_cnt = max_cnt;
164	if (new_cnt < cur_cnt + add_cnt)  /* also ensure we have enough memory */
165		new_cnt = cur_cnt + add_cnt;
166
167	new_data = libbpf_reallocarray(*data, new_cnt, elem_sz);
168	if (!new_data)
169		return NULL;
170
171	/* zero out newly allocated portion of memory */
172	memset(new_data + (*cap_cnt) * elem_sz, 0, (new_cnt - *cap_cnt) * elem_sz);
173
174	*data = new_data;
175	*cap_cnt = new_cnt;
176	return new_data + cur_cnt * elem_sz;
177}
178
179/* Ensure given dynamically allocated memory region has enough allocated space
180 * to accommodate *need_cnt* elements of size *elem_sz* bytes each
181 */
182int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt)
183{
184	void *p;
185
186	if (need_cnt <= *cap_cnt)
187		return 0;
188
189	p = libbpf_add_mem(data, cap_cnt, elem_sz, *cap_cnt, SIZE_MAX, need_cnt - *cap_cnt);
190	if (!p)
191		return -ENOMEM;
192
193	return 0;
194}
195
196static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt)
197{
198	return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32),
199			      btf->nr_types, BTF_MAX_NR_TYPES, add_cnt);
200}
201
202static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off)
203{
204	__u32 *p;
205
206	p = btf_add_type_offs_mem(btf, 1);
207	if (!p)
208		return -ENOMEM;
209
210	*p = type_off;
211	return 0;
212}
213
214static void btf_bswap_hdr(struct btf_header *h)
215{
216	h->magic = bswap_16(h->magic);
217	h->hdr_len = bswap_32(h->hdr_len);
218	h->type_off = bswap_32(h->type_off);
219	h->type_len = bswap_32(h->type_len);
220	h->str_off = bswap_32(h->str_off);
221	h->str_len = bswap_32(h->str_len);
222}
223
224static int btf_parse_hdr(struct btf *btf)
225{
226	struct btf_header *hdr = btf->hdr;
227	__u32 meta_left;
228
229	if (btf->raw_size < sizeof(struct btf_header)) {
230		pr_debug("BTF header not found\n");
231		return -EINVAL;
232	}
233
234	if (hdr->magic == bswap_16(BTF_MAGIC)) {
235		btf->swapped_endian = true;
236		if (bswap_32(hdr->hdr_len) != sizeof(struct btf_header)) {
237			pr_warn("Can't load BTF with non-native endianness due to unsupported header length %u\n",
238				bswap_32(hdr->hdr_len));
239			return -ENOTSUP;
240		}
241		btf_bswap_hdr(hdr);
242	} else if (hdr->magic != BTF_MAGIC) {
243		pr_debug("Invalid BTF magic: %x\n", hdr->magic);
244		return -EINVAL;
245	}
246
247	if (btf->raw_size < hdr->hdr_len) {
248		pr_debug("BTF header len %u larger than data size %u\n",
249			 hdr->hdr_len, btf->raw_size);
250		return -EINVAL;
251	}
252
253	meta_left = btf->raw_size - hdr->hdr_len;
254	if (meta_left < (long long)hdr->str_off + hdr->str_len) {
255		pr_debug("Invalid BTF total size: %u\n", btf->raw_size);
256		return -EINVAL;
257	}
258
259	if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) {
260		pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n",
261			 hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len);
262		return -EINVAL;
263	}
264
265	if (hdr->type_off % 4) {
266		pr_debug("BTF type section is not aligned to 4 bytes\n");
267		return -EINVAL;
268	}
269
270	return 0;
271}
272
273static int btf_parse_str_sec(struct btf *btf)
274{
275	const struct btf_header *hdr = btf->hdr;
276	const char *start = btf->strs_data;
277	const char *end = start + btf->hdr->str_len;
278
279	if (btf->base_btf && hdr->str_len == 0)
280		return 0;
281	if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_STR_OFFSET || end[-1]) {
282		pr_debug("Invalid BTF string section\n");
283		return -EINVAL;
284	}
285	if (!btf->base_btf && start[0]) {
286		pr_debug("Invalid BTF string section\n");
287		return -EINVAL;
288	}
289	return 0;
290}
291
292static int btf_type_size(const struct btf_type *t)
293{
294	const int base_size = sizeof(struct btf_type);
295	__u16 vlen = btf_vlen(t);
296
297	switch (btf_kind(t)) {
298	case BTF_KIND_FWD:
299	case BTF_KIND_CONST:
300	case BTF_KIND_VOLATILE:
301	case BTF_KIND_RESTRICT:
302	case BTF_KIND_PTR:
303	case BTF_KIND_TYPEDEF:
304	case BTF_KIND_FUNC:
305	case BTF_KIND_FLOAT:
306	case BTF_KIND_TYPE_TAG:
307		return base_size;
308	case BTF_KIND_INT:
309		return base_size + sizeof(__u32);
310	case BTF_KIND_ENUM:
311		return base_size + vlen * sizeof(struct btf_enum);
312	case BTF_KIND_ENUM64:
313		return base_size + vlen * sizeof(struct btf_enum64);
314	case BTF_KIND_ARRAY:
315		return base_size + sizeof(struct btf_array);
316	case BTF_KIND_STRUCT:
317	case BTF_KIND_UNION:
318		return base_size + vlen * sizeof(struct btf_member);
319	case BTF_KIND_FUNC_PROTO:
320		return base_size + vlen * sizeof(struct btf_param);
321	case BTF_KIND_VAR:
322		return base_size + sizeof(struct btf_var);
323	case BTF_KIND_DATASEC:
324		return base_size + vlen * sizeof(struct btf_var_secinfo);
325	case BTF_KIND_DECL_TAG:
326		return base_size + sizeof(struct btf_decl_tag);
327	default:
328		pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
329		return -EINVAL;
330	}
331}
332
333static void btf_bswap_type_base(struct btf_type *t)
334{
335	t->name_off = bswap_32(t->name_off);
336	t->info = bswap_32(t->info);
337	t->type = bswap_32(t->type);
338}
339
340static int btf_bswap_type_rest(struct btf_type *t)
341{
342	struct btf_var_secinfo *v;
343	struct btf_enum64 *e64;
344	struct btf_member *m;
345	struct btf_array *a;
346	struct btf_param *p;
347	struct btf_enum *e;
348	__u16 vlen = btf_vlen(t);
349	int i;
350
351	switch (btf_kind(t)) {
352	case BTF_KIND_FWD:
353	case BTF_KIND_CONST:
354	case BTF_KIND_VOLATILE:
355	case BTF_KIND_RESTRICT:
356	case BTF_KIND_PTR:
357	case BTF_KIND_TYPEDEF:
358	case BTF_KIND_FUNC:
359	case BTF_KIND_FLOAT:
360	case BTF_KIND_TYPE_TAG:
361		return 0;
362	case BTF_KIND_INT:
363		*(__u32 *)(t + 1) = bswap_32(*(__u32 *)(t + 1));
364		return 0;
365	case BTF_KIND_ENUM:
366		for (i = 0, e = btf_enum(t); i < vlen; i++, e++) {
367			e->name_off = bswap_32(e->name_off);
368			e->val = bswap_32(e->val);
369		}
370		return 0;
371	case BTF_KIND_ENUM64:
372		for (i = 0, e64 = btf_enum64(t); i < vlen; i++, e64++) {
373			e64->name_off = bswap_32(e64->name_off);
374			e64->val_lo32 = bswap_32(e64->val_lo32);
375			e64->val_hi32 = bswap_32(e64->val_hi32);
376		}
377		return 0;
378	case BTF_KIND_ARRAY:
379		a = btf_array(t);
380		a->type = bswap_32(a->type);
381		a->index_type = bswap_32(a->index_type);
382		a->nelems = bswap_32(a->nelems);
383		return 0;
384	case BTF_KIND_STRUCT:
385	case BTF_KIND_UNION:
386		for (i = 0, m = btf_members(t); i < vlen; i++, m++) {
387			m->name_off = bswap_32(m->name_off);
388			m->type = bswap_32(m->type);
389			m->offset = bswap_32(m->offset);
390		}
391		return 0;
392	case BTF_KIND_FUNC_PROTO:
393		for (i = 0, p = btf_params(t); i < vlen; i++, p++) {
394			p->name_off = bswap_32(p->name_off);
395			p->type = bswap_32(p->type);
396		}
397		return 0;
398	case BTF_KIND_VAR:
399		btf_var(t)->linkage = bswap_32(btf_var(t)->linkage);
400		return 0;
401	case BTF_KIND_DATASEC:
402		for (i = 0, v = btf_var_secinfos(t); i < vlen; i++, v++) {
403			v->type = bswap_32(v->type);
404			v->offset = bswap_32(v->offset);
405			v->size = bswap_32(v->size);
406		}
407		return 0;
408	case BTF_KIND_DECL_TAG:
409		btf_decl_tag(t)->component_idx = bswap_32(btf_decl_tag(t)->component_idx);
410		return 0;
411	default:
412		pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
413		return -EINVAL;
414	}
415}
416
417static int btf_parse_type_sec(struct btf *btf)
418{
419	struct btf_header *hdr = btf->hdr;
420	void *next_type = btf->types_data;
421	void *end_type = next_type + hdr->type_len;
422	int err, type_size;
423
424	while (next_type + sizeof(struct btf_type) <= end_type) {
425		if (btf->swapped_endian)
426			btf_bswap_type_base(next_type);
427
428		type_size = btf_type_size(next_type);
429		if (type_size < 0)
430			return type_size;
431		if (next_type + type_size > end_type) {
432			pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types);
433			return -EINVAL;
434		}
435
436		if (btf->swapped_endian && btf_bswap_type_rest(next_type))
437			return -EINVAL;
438
439		err = btf_add_type_idx_entry(btf, next_type - btf->types_data);
440		if (err)
441			return err;
442
443		next_type += type_size;
444		btf->nr_types++;
445	}
446
447	if (next_type != end_type) {
448		pr_warn("BTF types data is malformed\n");
449		return -EINVAL;
450	}
451
452	return 0;
453}
454
455static int btf_validate_str(const struct btf *btf, __u32 str_off, const char *what, __u32 type_id)
456{
457	const char *s;
458
459	s = btf__str_by_offset(btf, str_off);
460	if (!s) {
461		pr_warn("btf: type [%u]: invalid %s (string offset %u)\n", type_id, what, str_off);
462		return -EINVAL;
463	}
464
465	return 0;
466}
467
468static int btf_validate_id(const struct btf *btf, __u32 id, __u32 ctx_id)
469{
470	const struct btf_type *t;
471
472	t = btf__type_by_id(btf, id);
473	if (!t) {
474		pr_warn("btf: type [%u]: invalid referenced type ID %u\n", ctx_id, id);
475		return -EINVAL;
476	}
477
478	return 0;
479}
480
481static int btf_validate_type(const struct btf *btf, const struct btf_type *t, __u32 id)
482{
483	__u32 kind = btf_kind(t);
484	int err, i, n;
485
486	err = btf_validate_str(btf, t->name_off, "type name", id);
487	if (err)
488		return err;
489
490	switch (kind) {
491	case BTF_KIND_UNKN:
492	case BTF_KIND_INT:
493	case BTF_KIND_FWD:
494	case BTF_KIND_FLOAT:
495		break;
496	case BTF_KIND_PTR:
497	case BTF_KIND_TYPEDEF:
498	case BTF_KIND_VOLATILE:
499	case BTF_KIND_CONST:
500	case BTF_KIND_RESTRICT:
501	case BTF_KIND_VAR:
502	case BTF_KIND_DECL_TAG:
503	case BTF_KIND_TYPE_TAG:
504		err = btf_validate_id(btf, t->type, id);
505		if (err)
506			return err;
507		break;
508	case BTF_KIND_ARRAY: {
509		const struct btf_array *a = btf_array(t);
510
511		err = btf_validate_id(btf, a->type, id);
512		err = err ?: btf_validate_id(btf, a->index_type, id);
513		if (err)
514			return err;
515		break;
516	}
517	case BTF_KIND_STRUCT:
518	case BTF_KIND_UNION: {
519		const struct btf_member *m = btf_members(t);
520
521		n = btf_vlen(t);
522		for (i = 0; i < n; i++, m++) {
523			err = btf_validate_str(btf, m->name_off, "field name", id);
524			err = err ?: btf_validate_id(btf, m->type, id);
525			if (err)
526				return err;
527		}
528		break;
529	}
530	case BTF_KIND_ENUM: {
531		const struct btf_enum *m = btf_enum(t);
532
533		n = btf_vlen(t);
534		for (i = 0; i < n; i++, m++) {
535			err = btf_validate_str(btf, m->name_off, "enum name", id);
536			if (err)
537				return err;
538		}
539		break;
540	}
541	case BTF_KIND_ENUM64: {
542		const struct btf_enum64 *m = btf_enum64(t);
543
544		n = btf_vlen(t);
545		for (i = 0; i < n; i++, m++) {
546			err = btf_validate_str(btf, m->name_off, "enum name", id);
547			if (err)
548				return err;
549		}
550		break;
551	}
552	case BTF_KIND_FUNC: {
553		const struct btf_type *ft;
554
555		err = btf_validate_id(btf, t->type, id);
556		if (err)
557			return err;
558		ft = btf__type_by_id(btf, t->type);
559		if (btf_kind(ft) != BTF_KIND_FUNC_PROTO) {
560			pr_warn("btf: type [%u]: referenced type [%u] is not FUNC_PROTO\n", id, t->type);
561			return -EINVAL;
562		}
563		break;
564	}
565	case BTF_KIND_FUNC_PROTO: {
566		const struct btf_param *m = btf_params(t);
567
568		n = btf_vlen(t);
569		for (i = 0; i < n; i++, m++) {
570			err = btf_validate_str(btf, m->name_off, "param name", id);
571			err = err ?: btf_validate_id(btf, m->type, id);
572			if (err)
573				return err;
574		}
575		break;
576	}
577	case BTF_KIND_DATASEC: {
578		const struct btf_var_secinfo *m = btf_var_secinfos(t);
579
580		n = btf_vlen(t);
581		for (i = 0; i < n; i++, m++) {
582			err = btf_validate_id(btf, m->type, id);
583			if (err)
584				return err;
585		}
586		break;
587	}
588	default:
589		pr_warn("btf: type [%u]: unrecognized kind %u\n", id, kind);
590		return -EINVAL;
591	}
592	return 0;
593}
594
595/* Validate basic sanity of BTF. It's intentionally less thorough than
596 * kernel's validation and validates only properties of BTF that libbpf relies
597 * on to be correct (e.g., valid type IDs, valid string offsets, etc)
598 */
599static int btf_sanity_check(const struct btf *btf)
600{
601	const struct btf_type *t;
602	__u32 i, n = btf__type_cnt(btf);
603	int err;
604
605	for (i = 1; i < n; i++) {
606		t = btf_type_by_id(btf, i);
607		err = btf_validate_type(btf, t, i);
608		if (err)
609			return err;
610	}
611	return 0;
612}
613
614__u32 btf__type_cnt(const struct btf *btf)
615{
616	return btf->start_id + btf->nr_types;
617}
618
619const struct btf *btf__base_btf(const struct btf *btf)
620{
621	return btf->base_btf;
622}
623
624/* internal helper returning non-const pointer to a type */
625struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id)
626{
627	if (type_id == 0)
628		return &btf_void;
629	if (type_id < btf->start_id)
630		return btf_type_by_id(btf->base_btf, type_id);
631	return btf->types_data + btf->type_offs[type_id - btf->start_id];
632}
633
634const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id)
635{
636	if (type_id >= btf->start_id + btf->nr_types)
637		return errno = EINVAL, NULL;
638	return btf_type_by_id((struct btf *)btf, type_id);
639}
640
641static int determine_ptr_size(const struct btf *btf)
642{
643	static const char * const long_aliases[] = {
644		"long",
645		"long int",
646		"int long",
647		"unsigned long",
648		"long unsigned",
649		"unsigned long int",
650		"unsigned int long",
651		"long unsigned int",
652		"long int unsigned",
653		"int unsigned long",
654		"int long unsigned",
655	};
656	const struct btf_type *t;
657	const char *name;
658	int i, j, n;
659
660	if (btf->base_btf && btf->base_btf->ptr_sz > 0)
661		return btf->base_btf->ptr_sz;
662
663	n = btf__type_cnt(btf);
664	for (i = 1; i < n; i++) {
665		t = btf__type_by_id(btf, i);
666		if (!btf_is_int(t))
667			continue;
668
669		if (t->size != 4 && t->size != 8)
670			continue;
671
672		name = btf__name_by_offset(btf, t->name_off);
673		if (!name)
674			continue;
675
676		for (j = 0; j < ARRAY_SIZE(long_aliases); j++) {
677			if (strcmp(name, long_aliases[j]) == 0)
678				return t->size;
679		}
680	}
681
682	return -1;
683}
684
685static size_t btf_ptr_sz(const struct btf *btf)
686{
687	if (!btf->ptr_sz)
688		((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
689	return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz;
690}
691
692/* Return pointer size this BTF instance assumes. The size is heuristically
693 * determined by looking for 'long' or 'unsigned long' integer type and
694 * recording its size in bytes. If BTF type information doesn't have any such
695 * type, this function returns 0. In the latter case, native architecture's
696 * pointer size is assumed, so will be either 4 or 8, depending on
697 * architecture that libbpf was compiled for. It's possible to override
698 * guessed value by using btf__set_pointer_size() API.
699 */
700size_t btf__pointer_size(const struct btf *btf)
701{
702	if (!btf->ptr_sz)
703		((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
704
705	if (btf->ptr_sz < 0)
706		/* not enough BTF type info to guess */
707		return 0;
708
709	return btf->ptr_sz;
710}
711
712/* Override or set pointer size in bytes. Only values of 4 and 8 are
713 * supported.
714 */
715int btf__set_pointer_size(struct btf *btf, size_t ptr_sz)
716{
717	if (ptr_sz != 4 && ptr_sz != 8)
718		return libbpf_err(-EINVAL);
719	btf->ptr_sz = ptr_sz;
720	return 0;
721}
722
723static bool is_host_big_endian(void)
724{
725#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
726	return false;
727#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
728	return true;
729#else
730# error "Unrecognized __BYTE_ORDER__"
731#endif
732}
733
734enum btf_endianness btf__endianness(const struct btf *btf)
735{
736	if (is_host_big_endian())
737		return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN;
738	else
739		return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN;
740}
741
742int btf__set_endianness(struct btf *btf, enum btf_endianness endian)
743{
744	if (endian != BTF_LITTLE_ENDIAN && endian != BTF_BIG_ENDIAN)
745		return libbpf_err(-EINVAL);
746
747	btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN);
748	if (!btf->swapped_endian) {
749		free(btf->raw_data_swapped);
750		btf->raw_data_swapped = NULL;
751	}
752	return 0;
753}
754
755static bool btf_type_is_void(const struct btf_type *t)
756{
757	return t == &btf_void || btf_is_fwd(t);
758}
759
760static bool btf_type_is_void_or_null(const struct btf_type *t)
761{
762	return !t || btf_type_is_void(t);
763}
764
765#define MAX_RESOLVE_DEPTH 32
766
767__s64 btf__resolve_size(const struct btf *btf, __u32 type_id)
768{
769	const struct btf_array *array;
770	const struct btf_type *t;
771	__u32 nelems = 1;
772	__s64 size = -1;
773	int i;
774
775	t = btf__type_by_id(btf, type_id);
776	for (i = 0; i < MAX_RESOLVE_DEPTH && !btf_type_is_void_or_null(t); i++) {
777		switch (btf_kind(t)) {
778		case BTF_KIND_INT:
779		case BTF_KIND_STRUCT:
780		case BTF_KIND_UNION:
781		case BTF_KIND_ENUM:
782		case BTF_KIND_ENUM64:
783		case BTF_KIND_DATASEC:
784		case BTF_KIND_FLOAT:
785			size = t->size;
786			goto done;
787		case BTF_KIND_PTR:
788			size = btf_ptr_sz(btf);
789			goto done;
790		case BTF_KIND_TYPEDEF:
791		case BTF_KIND_VOLATILE:
792		case BTF_KIND_CONST:
793		case BTF_KIND_RESTRICT:
794		case BTF_KIND_VAR:
795		case BTF_KIND_DECL_TAG:
796		case BTF_KIND_TYPE_TAG:
797			type_id = t->type;
798			break;
799		case BTF_KIND_ARRAY:
800			array = btf_array(t);
801			if (nelems && array->nelems > UINT32_MAX / nelems)
802				return libbpf_err(-E2BIG);
803			nelems *= array->nelems;
804			type_id = array->type;
805			break;
806		default:
807			return libbpf_err(-EINVAL);
808		}
809
810		t = btf__type_by_id(btf, type_id);
811	}
812
813done:
814	if (size < 0)
815		return libbpf_err(-EINVAL);
816	if (nelems && size > UINT32_MAX / nelems)
817		return libbpf_err(-E2BIG);
818
819	return nelems * size;
820}
821
822int btf__align_of(const struct btf *btf, __u32 id)
823{
824	const struct btf_type *t = btf__type_by_id(btf, id);
825	__u16 kind = btf_kind(t);
826
827	switch (kind) {
828	case BTF_KIND_INT:
829	case BTF_KIND_ENUM:
830	case BTF_KIND_ENUM64:
831	case BTF_KIND_FLOAT:
832		return min(btf_ptr_sz(btf), (size_t)t->size);
833	case BTF_KIND_PTR:
834		return btf_ptr_sz(btf);
835	case BTF_KIND_TYPEDEF:
836	case BTF_KIND_VOLATILE:
837	case BTF_KIND_CONST:
838	case BTF_KIND_RESTRICT:
839	case BTF_KIND_TYPE_TAG:
840		return btf__align_of(btf, t->type);
841	case BTF_KIND_ARRAY:
842		return btf__align_of(btf, btf_array(t)->type);
843	case BTF_KIND_STRUCT:
844	case BTF_KIND_UNION: {
845		const struct btf_member *m = btf_members(t);
846		__u16 vlen = btf_vlen(t);
847		int i, max_align = 1, align;
848
849		for (i = 0; i < vlen; i++, m++) {
850			align = btf__align_of(btf, m->type);
851			if (align <= 0)
852				return libbpf_err(align);
853			max_align = max(max_align, align);
854
855			/* if field offset isn't aligned according to field
856			 * type's alignment, then struct must be packed
857			 */
858			if (btf_member_bitfield_size(t, i) == 0 &&
859			    (m->offset % (8 * align)) != 0)
860				return 1;
861		}
862
863		/* if struct/union size isn't a multiple of its alignment,
864		 * then struct must be packed
865		 */
866		if ((t->size % max_align) != 0)
867			return 1;
868
869		return max_align;
870	}
871	default:
872		pr_warn("unsupported BTF_KIND:%u\n", btf_kind(t));
873		return errno = EINVAL, 0;
874	}
875}
876
877int btf__resolve_type(const struct btf *btf, __u32 type_id)
878{
879	const struct btf_type *t;
880	int depth = 0;
881
882	t = btf__type_by_id(btf, type_id);
883	while (depth < MAX_RESOLVE_DEPTH &&
884	       !btf_type_is_void_or_null(t) &&
885	       (btf_is_mod(t) || btf_is_typedef(t) || btf_is_var(t))) {
886		type_id = t->type;
887		t = btf__type_by_id(btf, type_id);
888		depth++;
889	}
890
891	if (depth == MAX_RESOLVE_DEPTH || btf_type_is_void_or_null(t))
892		return libbpf_err(-EINVAL);
893
894	return type_id;
895}
896
897__s32 btf__find_by_name(const struct btf *btf, const char *type_name)
898{
899	__u32 i, nr_types = btf__type_cnt(btf);
900
901	if (!strcmp(type_name, "void"))
902		return 0;
903
904	for (i = 1; i < nr_types; i++) {
905		const struct btf_type *t = btf__type_by_id(btf, i);
906		const char *name = btf__name_by_offset(btf, t->name_off);
907
908		if (name && !strcmp(type_name, name))
909			return i;
910	}
911
912	return libbpf_err(-ENOENT);
913}
914
915static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id,
916				   const char *type_name, __u32 kind)
917{
918	__u32 i, nr_types = btf__type_cnt(btf);
919
920	if (kind == BTF_KIND_UNKN || !strcmp(type_name, "void"))
921		return 0;
922
923	for (i = start_id; i < nr_types; i++) {
924		const struct btf_type *t = btf__type_by_id(btf, i);
925		const char *name;
926
927		if (btf_kind(t) != kind)
928			continue;
929		name = btf__name_by_offset(btf, t->name_off);
930		if (name && !strcmp(type_name, name))
931			return i;
932	}
933
934	return libbpf_err(-ENOENT);
935}
936
937__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name,
938				 __u32 kind)
939{
940	return btf_find_by_name_kind(btf, btf->start_id, type_name, kind);
941}
942
943__s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name,
944			     __u32 kind)
945{
946	return btf_find_by_name_kind(btf, 1, type_name, kind);
947}
948
949static bool btf_is_modifiable(const struct btf *btf)
950{
951	return (void *)btf->hdr != btf->raw_data;
952}
953
954void btf__free(struct btf *btf)
955{
956	if (IS_ERR_OR_NULL(btf))
957		return;
958
959	if (btf->fd >= 0)
960		close(btf->fd);
961
962	if (btf_is_modifiable(btf)) {
963		/* if BTF was modified after loading, it will have a split
964		 * in-memory representation for header, types, and strings
965		 * sections, so we need to free all of them individually. It
966		 * might still have a cached contiguous raw data present,
967		 * which will be unconditionally freed below.
968		 */
969		free(btf->hdr);
970		free(btf->types_data);
971		strset__free(btf->strs_set);
972	}
973	free(btf->raw_data);
974	free(btf->raw_data_swapped);
975	free(btf->type_offs);
976	free(btf);
977}
978
979static struct btf *btf_new_empty(struct btf *base_btf)
980{
981	struct btf *btf;
982
983	btf = calloc(1, sizeof(*btf));
984	if (!btf)
985		return ERR_PTR(-ENOMEM);
986
987	btf->nr_types = 0;
988	btf->start_id = 1;
989	btf->start_str_off = 0;
990	btf->fd = -1;
991	btf->ptr_sz = sizeof(void *);
992	btf->swapped_endian = false;
993
994	if (base_btf) {
995		btf->base_btf = base_btf;
996		btf->start_id = btf__type_cnt(base_btf);
997		btf->start_str_off = base_btf->hdr->str_len;
998	}
999
1000	/* +1 for empty string at offset 0 */
1001	btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1);
1002	btf->raw_data = calloc(1, btf->raw_size);
1003	if (!btf->raw_data) {
1004		free(btf);
1005		return ERR_PTR(-ENOMEM);
1006	}
1007
1008	btf->hdr = btf->raw_data;
1009	btf->hdr->hdr_len = sizeof(struct btf_header);
1010	btf->hdr->magic = BTF_MAGIC;
1011	btf->hdr->version = BTF_VERSION;
1012
1013	btf->types_data = btf->raw_data + btf->hdr->hdr_len;
1014	btf->strs_data = btf->raw_data + btf->hdr->hdr_len;
1015	btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */
1016
1017	return btf;
1018}
1019
1020struct btf *btf__new_empty(void)
1021{
1022	return libbpf_ptr(btf_new_empty(NULL));
1023}
1024
1025struct btf *btf__new_empty_split(struct btf *base_btf)
1026{
1027	return libbpf_ptr(btf_new_empty(base_btf));
1028}
1029
1030static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf)
1031{
1032	struct btf *btf;
1033	int err;
1034
1035	btf = calloc(1, sizeof(struct btf));
1036	if (!btf)
1037		return ERR_PTR(-ENOMEM);
1038
1039	btf->nr_types = 0;
1040	btf->start_id = 1;
1041	btf->start_str_off = 0;
1042	btf->fd = -1;
1043
1044	if (base_btf) {
1045		btf->base_btf = base_btf;
1046		btf->start_id = btf__type_cnt(base_btf);
1047		btf->start_str_off = base_btf->hdr->str_len;
1048	}
1049
1050	btf->raw_data = malloc(size);
1051	if (!btf->raw_data) {
1052		err = -ENOMEM;
1053		goto done;
1054	}
1055	memcpy(btf->raw_data, data, size);
1056	btf->raw_size = size;
1057
1058	btf->hdr = btf->raw_data;
1059	err = btf_parse_hdr(btf);
1060	if (err)
1061		goto done;
1062
1063	btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off;
1064	btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off;
1065
1066	err = btf_parse_str_sec(btf);
1067	err = err ?: btf_parse_type_sec(btf);
1068	err = err ?: btf_sanity_check(btf);
1069	if (err)
1070		goto done;
1071
1072done:
1073	if (err) {
1074		btf__free(btf);
1075		return ERR_PTR(err);
1076	}
1077
1078	return btf;
1079}
1080
1081struct btf *btf__new(const void *data, __u32 size)
1082{
1083	return libbpf_ptr(btf_new(data, size, NULL));
1084}
1085
1086#ifdef HAVE_ELFIO
1087static Elf64_Shdr *elf_sec_hdr_by_idx(pelfio_t elf, size_t idx, Elf64_Shdr *sheader)
1088{
1089	psection_t psection = elfio_get_section_by_index(elf, idx);
1090
1091	sheader->sh_name = elfio_section_get_name_string_offset(psection);
1092	sheader->sh_type = elfio_section_get_type(psection);
1093	sheader->sh_flags = elfio_section_get_flags(psection);
1094	sheader->sh_addr = elfio_section_get_address(psection);
1095	sheader->sh_offset = elfio_section_get_offset(psection);
1096	sheader->sh_size = elfio_section_get_size(psection);
1097	sheader->sh_link = elfio_section_get_link(psection);
1098	sheader->sh_info = elfio_section_get_info(psection);
1099	sheader->sh_addralign = elfio_section_get_addr_align(psection);
1100	sheader->sh_entsize = elfio_section_get_entry_size(psection);
1101
1102	return sheader;
1103}
1104#endif
1105
1106static struct btf *btf_parse_elf(const char *path, struct btf *base_btf,
1107				 struct btf_ext **btf_ext)
1108{
1109	Elf_Data *btf_data = NULL, *btf_ext_data = NULL;
1110	int err = 0, fd = -1, idx = 0;
1111	struct btf *btf = NULL;
1112#ifdef HAVE_LIBELF
1113	Elf_Scn *scn = NULL;
1114	Elf *elf = NULL;
1115	GElf_Ehdr ehdr;
1116#elif defined HAVE_ELFIO
1117	pelfio_t elf;
1118	Elf64_Ehdr ehdr;
1119	Elf_Data btf_data_temp, btf_ext_data_temp;
1120#endif
1121	size_t shstrndx;
1122
1123#ifdef HAVE_LIBELF
1124	if (elf_version(EV_CURRENT) == EV_NONE) {
1125		pr_warn("failed to init libelf for %s\n", path);
1126		return ERR_PTR(-LIBBPF_ERRNO__LIBELF);
1127	}
1128#endif
1129
1130	fd = open(path, O_RDONLY | O_CLOEXEC);
1131	if (fd < 0) {
1132		err = -errno;
1133		pr_warn("failed to open %s: %s\n", path, strerror(errno));
1134		return ERR_PTR(err);
1135	}
1136
1137	err = -LIBBPF_ERRNO__FORMAT;
1138
1139#ifdef HAVE_LIBELF
1140	elf = elf_begin(fd, ELF_C_READ, NULL);
1141#elif defined HAVE_ELFIO
1142	elf = elfio_new();
1143	if (!elfio_load(elf, path)) {
1144		printf( "Can't load ELF file\n" );
1145		goto done;
1146    }
1147#endif
1148	if (!elf) {
1149		pr_warn("failed to open %s as ELF file\n", path);
1150		goto done;
1151	}
1152
1153#ifdef HAVE_LIBELF
1154	if (!gelf_getehdr(elf, &ehdr)) {
1155#elif defined HAVE_ELFIO
1156	ssize_t nread = read(fd, &ehdr, sizeof(Elf64_Ehdr));
1157	if(nread != sizeof(Elf64_Ehdr)) {
1158#endif
1159		pr_warn("failed to get EHDR from %s\n", path);
1160		goto done;
1161	}
1162
1163#ifdef HAVE_LIBELF
1164	if (elf_getshdrstrndx(elf, &shstrndx)) {
1165#elif defined HAVE_ELFIO
1166	shstrndx = elfio_get_section_name_str_index(elf);
1167	if(shstrndx == 0) {
1168#endif
1169		pr_warn("failed to get section names section index for %s\n",
1170			path);
1171		goto done;
1172	}
1173
1174#ifdef HAVE_LIBELF
1175	if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) {
1176		pr_warn("failed to get e_shstrndx from %s\n", path);
1177		goto done;
1178	}
1179#endif
1180
1181#if defined HAVE_LIBELF
1182	while ((scn = elf_nextscn(elf, scn)) != NULL) {
1183		GElf_Shdr sh;
1184#elif defined HAVE_ELFIO
1185	psection_t psection = elfio_get_section_by_name(elf, ".shstrtab");
1186	if (!psection )
1187		goto done;
1188
1189	pstring_t pstring = elfio_string_section_accessor_new(psection);
1190	if (!pstring )
1191		goto done;
1192
1193	int secno = elfio_get_sections_num(elf);
1194
1195	for ( int i = 0; i < secno; i++ ) {
1196		Elf64_Shdr sh;
1197#endif
1198		char *name;
1199
1200		idx++;
1201#if defined HAVE_LIBELF
1202		if (gelf_getshdr(scn, &sh) != &sh) {
1203#elif defined HAVE_ELFIO
1204		if (!elf_sec_hdr_by_idx(elf, i, &sh)) {
1205#endif
1206			pr_warn("failed to get section(%d) header from %s\n",
1207				idx, path);
1208			goto done;
1209		}
1210#if defined HAVE_LIBELF
1211		name = elf_strptr(elf, shstrndx, sh.sh_name);
1212#elif defined HAVE_ELFIO
1213		name = elfio_string_get_string(pstring, sh.sh_name);
1214#endif
1215		if (!name) {
1216			pr_warn("failed to get section(%d) name from %s\n",
1217				idx, path);
1218			goto done;
1219		}
1220		if (strcmp(name, BTF_ELF_SEC) == 0) {
1221#if defined HAVE_LIBELF
1222			btf_data = elf_getdata(scn, 0);
1223#elif defined HAVE_ELFIO
1224			psection_t psection_index = elfio_get_section_by_index(elf, i);
1225			btf_data_temp.d_buf = (void*)elfio_section_get_data(psection_index);
1226			btf_data_temp.d_size = elfio_section_get_size(psection_index);
1227			btf_data = &btf_data_temp;
1228#endif
1229			if (!btf_data) {
1230				pr_warn("failed to get section(%d, %s) data from %s\n",
1231					idx, name, path);
1232				goto done;
1233			}
1234			continue;
1235		} else if (btf_ext && strcmp(name, BTF_EXT_ELF_SEC) == 0) {
1236#if defined HAVE_LIBELF
1237			btf_ext_data = elf_getdata(scn, 0);
1238#elif defined HAVE_ELFIO
1239			psection_t psection_index = elfio_get_section_by_index(elf, i);
1240			btf_ext_data_temp.d_buf = (void*)elfio_section_get_data(psection_index);
1241			btf_ext_data_temp.d_size = elfio_section_get_size(psection_index);
1242			btf_ext_data = &btf_ext_data_temp;
1243#endif
1244			if (!btf_ext_data) {
1245				pr_warn("failed to get section(%d, %s) data from %s\n",
1246					idx, name, path);
1247				goto done;
1248			}
1249			continue;
1250		}
1251	}
1252
1253	err = 0;
1254
1255	if (!btf_data) {
1256		pr_warn("failed to find '%s' ELF section in %s\n", BTF_ELF_SEC, path);
1257		err = -ENODATA;
1258		goto done;
1259	}
1260	btf = btf_new(btf_data->d_buf, btf_data->d_size, base_btf);
1261	err = libbpf_get_error(btf);
1262	if (err)
1263		goto done;
1264#ifdef HAVE_LIBELF
1265	switch (gelf_getclass(elf)) {
1266#elif defined HAVE_ELFIO
1267	switch (elfio_get_class(elf)) {
1268#endif
1269
1270	case ELFCLASS32:
1271		btf__set_pointer_size(btf, 4);
1272		break;
1273	case ELFCLASS64:
1274		btf__set_pointer_size(btf, 8);
1275		break;
1276	default:
1277		pr_warn("failed to get ELF class (bitness) for %s\n", path);
1278		break;
1279	}
1280
1281	if (btf_ext && btf_ext_data) {
1282		*btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size);
1283		err = libbpf_get_error(*btf_ext);
1284		if (err)
1285			goto done;
1286	} else if (btf_ext) {
1287		*btf_ext = NULL;
1288	}
1289done:
1290	if (elf)
1291#ifdef HAVE_LIBELF
1292		elf_end(elf);
1293#elif defined HAVE_ELFIO
1294		elfio_delete(elf);
1295	if(pstring)
1296		elfio_string_section_accessor_delete(pstring);
1297#endif
1298	close(fd);
1299
1300	if (!err)
1301		return btf;
1302
1303	if (btf_ext)
1304		btf_ext__free(*btf_ext);
1305	btf__free(btf);
1306
1307	return ERR_PTR(err);
1308}
1309
1310struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext)
1311{
1312	return libbpf_ptr(btf_parse_elf(path, NULL, btf_ext));
1313}
1314
1315struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf)
1316{
1317	return libbpf_ptr(btf_parse_elf(path, base_btf, NULL));
1318}
1319
1320static struct btf *btf_parse_raw(const char *path, struct btf *base_btf)
1321{
1322	struct btf *btf = NULL;
1323	void *data = NULL;
1324	FILE *f = NULL;
1325	__u16 magic;
1326	int err = 0;
1327	long sz;
1328
1329	f = fopen(path, "rbe");
1330	if (!f) {
1331		err = -errno;
1332		goto err_out;
1333	}
1334
1335	/* check BTF magic */
1336	if (fread(&magic, 1, sizeof(magic), f) < sizeof(magic)) {
1337		err = -EIO;
1338		goto err_out;
1339	}
1340	if (magic != BTF_MAGIC && magic != bswap_16(BTF_MAGIC)) {
1341		/* definitely not a raw BTF */
1342		err = -EPROTO;
1343		goto err_out;
1344	}
1345
1346	/* get file size */
1347	if (fseek(f, 0, SEEK_END)) {
1348		err = -errno;
1349		goto err_out;
1350	}
1351	sz = ftell(f);
1352	if (sz < 0) {
1353		err = -errno;
1354		goto err_out;
1355	}
1356	/* rewind to the start */
1357	if (fseek(f, 0, SEEK_SET)) {
1358		err = -errno;
1359		goto err_out;
1360	}
1361
1362	/* pre-alloc memory and read all of BTF data */
1363	data = malloc(sz);
1364	if (!data) {
1365		err = -ENOMEM;
1366		goto err_out;
1367	}
1368	if (fread(data, 1, sz, f) < sz) {
1369		err = -EIO;
1370		goto err_out;
1371	}
1372
1373	/* finally parse BTF data */
1374	btf = btf_new(data, sz, base_btf);
1375
1376err_out:
1377	free(data);
1378	if (f)
1379		fclose(f);
1380	return err ? ERR_PTR(err) : btf;
1381}
1382
1383struct btf *btf__parse_raw(const char *path)
1384{
1385	return libbpf_ptr(btf_parse_raw(path, NULL));
1386}
1387
1388struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf)
1389{
1390	return libbpf_ptr(btf_parse_raw(path, base_btf));
1391}
1392
1393static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext)
1394{
1395	struct btf *btf;
1396	int err;
1397
1398	if (btf_ext)
1399		*btf_ext = NULL;
1400
1401	btf = btf_parse_raw(path, base_btf);
1402	err = libbpf_get_error(btf);
1403	if (!err)
1404		return btf;
1405	if (err != -EPROTO)
1406		return ERR_PTR(err);
1407	return btf_parse_elf(path, base_btf, btf_ext);
1408}
1409
1410struct btf *btf__parse(const char *path, struct btf_ext **btf_ext)
1411{
1412	return libbpf_ptr(btf_parse(path, NULL, btf_ext));
1413}
1414
1415struct btf *btf__parse_split(const char *path, struct btf *base_btf)
1416{
1417	return libbpf_ptr(btf_parse(path, base_btf, NULL));
1418}
1419
1420static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1421
1422int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level)
1423{
1424	LIBBPF_OPTS(bpf_btf_load_opts, opts);
1425	__u32 buf_sz = 0, raw_size;
1426	char *buf = NULL, *tmp;
1427	void *raw_data;
1428	int err = 0;
1429
1430	if (btf->fd >= 0)
1431		return libbpf_err(-EEXIST);
1432	if (log_sz && !log_buf)
1433		return libbpf_err(-EINVAL);
1434
1435	/* cache native raw data representation */
1436	raw_data = btf_get_raw_data(btf, &raw_size, false);
1437	if (!raw_data) {
1438		err = -ENOMEM;
1439		goto done;
1440	}
1441	btf->raw_size = raw_size;
1442	btf->raw_data = raw_data;
1443
1444retry_load:
1445	/* if log_level is 0, we won't provide log_buf/log_size to the kernel,
1446	 * initially. Only if BTF loading fails, we bump log_level to 1 and
1447	 * retry, using either auto-allocated or custom log_buf. This way
1448	 * non-NULL custom log_buf provides a buffer just in case, but hopes
1449	 * for successful load and no need for log_buf.
1450	 */
1451	if (log_level) {
1452		/* if caller didn't provide custom log_buf, we'll keep
1453		 * allocating our own progressively bigger buffers for BTF
1454		 * verification log
1455		 */
1456		if (!log_buf) {
1457			buf_sz = max((__u32)BPF_LOG_BUF_SIZE, buf_sz * 2);
1458			tmp = realloc(buf, buf_sz);
1459			if (!tmp) {
1460				err = -ENOMEM;
1461				goto done;
1462			}
1463			buf = tmp;
1464			buf[0] = '\0';
1465		}
1466
1467		opts.log_buf = log_buf ? log_buf : buf;
1468		opts.log_size = log_buf ? log_sz : buf_sz;
1469		opts.log_level = log_level;
1470	}
1471
1472	btf->fd = bpf_btf_load(raw_data, raw_size, &opts);
1473	if (btf->fd < 0) {
1474		/* time to turn on verbose mode and try again */
1475		if (log_level == 0) {
1476			log_level = 1;
1477			goto retry_load;
1478		}
1479		/* only retry if caller didn't provide custom log_buf, but
1480		 * make sure we can never overflow buf_sz
1481		 */
1482		if (!log_buf && errno == ENOSPC && buf_sz <= UINT_MAX / 2)
1483			goto retry_load;
1484
1485		err = -errno;
1486		pr_warn("BTF loading error: %d\n", err);
1487		/* don't print out contents of custom log_buf */
1488		if (!log_buf && buf[0])
1489			pr_warn("-- BEGIN BTF LOAD LOG ---\n%s\n-- END BTF LOAD LOG --\n", buf);
1490	}
1491
1492done:
1493	free(buf);
1494	return libbpf_err(err);
1495}
1496
1497int btf__load_into_kernel(struct btf *btf)
1498{
1499	return btf_load_into_kernel(btf, NULL, 0, 0);
1500}
1501
1502int btf__fd(const struct btf *btf)
1503{
1504	return btf->fd;
1505}
1506
1507void btf__set_fd(struct btf *btf, int fd)
1508{
1509	btf->fd = fd;
1510}
1511
1512static const void *btf_strs_data(const struct btf *btf)
1513{
1514	return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set);
1515}
1516
1517static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian)
1518{
1519	struct btf_header *hdr = btf->hdr;
1520	struct btf_type *t;
1521	void *data, *p;
1522	__u32 data_sz;
1523	int i;
1524
1525	data = swap_endian ? btf->raw_data_swapped : btf->raw_data;
1526	if (data) {
1527		*size = btf->raw_size;
1528		return data;
1529	}
1530
1531	data_sz = hdr->hdr_len + hdr->type_len + hdr->str_len;
1532	data = calloc(1, data_sz);
1533	if (!data)
1534		return NULL;
1535	p = data;
1536
1537	memcpy(p, hdr, hdr->hdr_len);
1538	if (swap_endian)
1539		btf_bswap_hdr(p);
1540	p += hdr->hdr_len;
1541
1542	memcpy(p, btf->types_data, hdr->type_len);
1543	if (swap_endian) {
1544		for (i = 0; i < btf->nr_types; i++) {
1545			t = p + btf->type_offs[i];
1546			/* btf_bswap_type_rest() relies on native t->info, so
1547			 * we swap base type info after we swapped all the
1548			 * additional information
1549			 */
1550			if (btf_bswap_type_rest(t))
1551				goto err_out;
1552			btf_bswap_type_base(t);
1553		}
1554	}
1555	p += hdr->type_len;
1556
1557	memcpy(p, btf_strs_data(btf), hdr->str_len);
1558	p += hdr->str_len;
1559
1560	*size = data_sz;
1561	return data;
1562err_out:
1563	free(data);
1564	return NULL;
1565}
1566
1567const void *btf__raw_data(const struct btf *btf_ro, __u32 *size)
1568{
1569	struct btf *btf = (struct btf *)btf_ro;
1570	__u32 data_sz;
1571	void *data;
1572
1573	data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian);
1574	if (!data)
1575		return errno = ENOMEM, NULL;
1576
1577	btf->raw_size = data_sz;
1578	if (btf->swapped_endian)
1579		btf->raw_data_swapped = data;
1580	else
1581		btf->raw_data = data;
1582	*size = data_sz;
1583	return data;
1584}
1585
1586__attribute__((alias("btf__raw_data")))
1587const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1588
1589const char *btf__str_by_offset(const struct btf *btf, __u32 offset)
1590{
1591	if (offset < btf->start_str_off)
1592		return btf__str_by_offset(btf->base_btf, offset);
1593	else if (offset - btf->start_str_off < btf->hdr->str_len)
1594		return btf_strs_data(btf) + (offset - btf->start_str_off);
1595	else
1596		return errno = EINVAL, NULL;
1597}
1598
1599const char *btf__name_by_offset(const struct btf *btf, __u32 offset)
1600{
1601	return btf__str_by_offset(btf, offset);
1602}
1603
1604struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf)
1605{
1606	struct bpf_btf_info btf_info;
1607	__u32 len = sizeof(btf_info);
1608	__u32 last_size;
1609	struct btf *btf;
1610	void *ptr;
1611	int err;
1612
1613	/* we won't know btf_size until we call bpf_btf_get_info_by_fd(). so
1614	 * let's start with a sane default - 4KiB here - and resize it only if
1615	 * bpf_btf_get_info_by_fd() needs a bigger buffer.
1616	 */
1617	last_size = 4096;
1618	ptr = malloc(last_size);
1619	if (!ptr)
1620		return ERR_PTR(-ENOMEM);
1621
1622	memset(&btf_info, 0, sizeof(btf_info));
1623	btf_info.btf = ptr_to_u64(ptr);
1624	btf_info.btf_size = last_size;
1625	err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len);
1626
1627	if (!err && btf_info.btf_size > last_size) {
1628		void *temp_ptr;
1629
1630		last_size = btf_info.btf_size;
1631		temp_ptr = realloc(ptr, last_size);
1632		if (!temp_ptr) {
1633			btf = ERR_PTR(-ENOMEM);
1634			goto exit_free;
1635		}
1636		ptr = temp_ptr;
1637
1638		len = sizeof(btf_info);
1639		memset(&btf_info, 0, sizeof(btf_info));
1640		btf_info.btf = ptr_to_u64(ptr);
1641		btf_info.btf_size = last_size;
1642
1643		err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len);
1644	}
1645
1646	if (err || btf_info.btf_size > last_size) {
1647		btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG);
1648		goto exit_free;
1649	}
1650
1651	btf = btf_new(ptr, btf_info.btf_size, base_btf);
1652
1653exit_free:
1654	free(ptr);
1655	return btf;
1656}
1657
1658struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf)
1659{
1660	struct btf *btf;
1661	int btf_fd;
1662
1663	btf_fd = bpf_btf_get_fd_by_id(id);
1664	if (btf_fd < 0)
1665		return libbpf_err_ptr(-errno);
1666
1667	btf = btf_get_from_fd(btf_fd, base_btf);
1668	close(btf_fd);
1669
1670	return libbpf_ptr(btf);
1671}
1672
1673struct btf *btf__load_from_kernel_by_id(__u32 id)
1674{
1675	return btf__load_from_kernel_by_id_split(id, NULL);
1676}
1677
1678static void btf_invalidate_raw_data(struct btf *btf)
1679{
1680	if (btf->raw_data) {
1681		free(btf->raw_data);
1682		btf->raw_data = NULL;
1683	}
1684	if (btf->raw_data_swapped) {
1685		free(btf->raw_data_swapped);
1686		btf->raw_data_swapped = NULL;
1687	}
1688}
1689
1690/* Ensure BTF is ready to be modified (by splitting into a three memory
1691 * regions for header, types, and strings). Also invalidate cached
1692 * raw_data, if any.
1693 */
1694static int btf_ensure_modifiable(struct btf *btf)
1695{
1696	void *hdr, *types;
1697	struct strset *set = NULL;
1698	int err = -ENOMEM;
1699
1700	if (btf_is_modifiable(btf)) {
1701		/* any BTF modification invalidates raw_data */
1702		btf_invalidate_raw_data(btf);
1703		return 0;
1704	}
1705
1706	/* split raw data into three memory regions */
1707	hdr = malloc(btf->hdr->hdr_len);
1708	types = malloc(btf->hdr->type_len);
1709	if (!hdr || !types)
1710		goto err_out;
1711
1712	memcpy(hdr, btf->hdr, btf->hdr->hdr_len);
1713	memcpy(types, btf->types_data, btf->hdr->type_len);
1714
1715	/* build lookup index for all strings */
1716	set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len);
1717	if (IS_ERR(set)) {
1718		err = PTR_ERR(set);
1719		goto err_out;
1720	}
1721
1722	/* only when everything was successful, update internal state */
1723	btf->hdr = hdr;
1724	btf->types_data = types;
1725	btf->types_data_cap = btf->hdr->type_len;
1726	btf->strs_data = NULL;
1727	btf->strs_set = set;
1728	/* if BTF was created from scratch, all strings are guaranteed to be
1729	 * unique and deduplicated
1730	 */
1731	if (btf->hdr->str_len == 0)
1732		btf->strs_deduped = true;
1733	if (!btf->base_btf && btf->hdr->str_len == 1)
1734		btf->strs_deduped = true;
1735
1736	/* invalidate raw_data representation */
1737	btf_invalidate_raw_data(btf);
1738
1739	return 0;
1740
1741err_out:
1742	strset__free(set);
1743	free(hdr);
1744	free(types);
1745	return err;
1746}
1747
1748/* Find an offset in BTF string section that corresponds to a given string *s*.
1749 * Returns:
1750 *   - >0 offset into string section, if string is found;
1751 *   - -ENOENT, if string is not in the string section;
1752 *   - <0, on any other error.
1753 */
1754int btf__find_str(struct btf *btf, const char *s)
1755{
1756	int off;
1757
1758	if (btf->base_btf) {
1759		off = btf__find_str(btf->base_btf, s);
1760		if (off != -ENOENT)
1761			return off;
1762	}
1763
1764	/* BTF needs to be in a modifiable state to build string lookup index */
1765	if (btf_ensure_modifiable(btf))
1766		return libbpf_err(-ENOMEM);
1767
1768	off = strset__find_str(btf->strs_set, s);
1769	if (off < 0)
1770		return libbpf_err(off);
1771
1772	return btf->start_str_off + off;
1773}
1774
1775/* Add a string s to the BTF string section.
1776 * Returns:
1777 *   - > 0 offset into string section, on success;
1778 *   - < 0, on error.
1779 */
1780int btf__add_str(struct btf *btf, const char *s)
1781{
1782	int off;
1783
1784	if (btf->base_btf) {
1785		off = btf__find_str(btf->base_btf, s);
1786		if (off != -ENOENT)
1787			return off;
1788	}
1789
1790	if (btf_ensure_modifiable(btf))
1791		return libbpf_err(-ENOMEM);
1792
1793	off = strset__add_str(btf->strs_set, s);
1794	if (off < 0)
1795		return libbpf_err(off);
1796
1797	btf->hdr->str_len = strset__data_size(btf->strs_set);
1798
1799	return btf->start_str_off + off;
1800}
1801
1802static void *btf_add_type_mem(struct btf *btf, size_t add_sz)
1803{
1804	return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1,
1805			      btf->hdr->type_len, UINT_MAX, add_sz);
1806}
1807
1808static void btf_type_inc_vlen(struct btf_type *t)
1809{
1810	t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, btf_kflag(t));
1811}
1812
1813static int btf_commit_type(struct btf *btf, int data_sz)
1814{
1815	int err;
1816
1817	err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
1818	if (err)
1819		return libbpf_err(err);
1820
1821	btf->hdr->type_len += data_sz;
1822	btf->hdr->str_off += data_sz;
1823	btf->nr_types++;
1824	return btf->start_id + btf->nr_types - 1;
1825}
1826
1827struct btf_pipe {
1828	const struct btf *src;
1829	struct btf *dst;
1830	struct hashmap *str_off_map; /* map string offsets from src to dst */
1831};
1832
1833static int btf_rewrite_str(__u32 *str_off, void *ctx)
1834{
1835	struct btf_pipe *p = ctx;
1836	long mapped_off;
1837	int off, err;
1838
1839	if (!*str_off) /* nothing to do for empty strings */
1840		return 0;
1841
1842	if (p->str_off_map &&
1843	    hashmap__find(p->str_off_map, *str_off, &mapped_off)) {
1844		*str_off = mapped_off;
1845		return 0;
1846	}
1847
1848	off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off));
1849	if (off < 0)
1850		return off;
1851
1852	/* Remember string mapping from src to dst.  It avoids
1853	 * performing expensive string comparisons.
1854	 */
1855	if (p->str_off_map) {
1856		err = hashmap__append(p->str_off_map, *str_off, off);
1857		if (err)
1858			return err;
1859	}
1860
1861	*str_off = off;
1862	return 0;
1863}
1864
1865int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type)
1866{
1867	struct btf_pipe p = { .src = src_btf, .dst = btf };
1868	struct btf_type *t;
1869	int sz, err;
1870
1871	sz = btf_type_size(src_type);
1872	if (sz < 0)
1873		return libbpf_err(sz);
1874
1875	/* deconstruct BTF, if necessary, and invalidate raw_data */
1876	if (btf_ensure_modifiable(btf))
1877		return libbpf_err(-ENOMEM);
1878
1879	t = btf_add_type_mem(btf, sz);
1880	if (!t)
1881		return libbpf_err(-ENOMEM);
1882
1883	memcpy(t, src_type, sz);
1884
1885	err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
1886	if (err)
1887		return libbpf_err(err);
1888
1889	return btf_commit_type(btf, sz);
1890}
1891
1892static int btf_rewrite_type_ids(__u32 *type_id, void *ctx)
1893{
1894	struct btf *btf = ctx;
1895
1896	if (!*type_id) /* nothing to do for VOID references */
1897		return 0;
1898
1899	/* we haven't updated btf's type count yet, so
1900	 * btf->start_id + btf->nr_types - 1 is the type ID offset we should
1901	 * add to all newly added BTF types
1902	 */
1903	*type_id += btf->start_id + btf->nr_types - 1;
1904	return 0;
1905}
1906
1907static size_t btf_dedup_identity_hash_fn(long key, void *ctx);
1908static bool btf_dedup_equal_fn(long k1, long k2, void *ctx);
1909
1910int btf__add_btf(struct btf *btf, const struct btf *src_btf)
1911{
1912	struct btf_pipe p = { .src = src_btf, .dst = btf };
1913	int data_sz, sz, cnt, i, err, old_strs_len;
1914	__u32 *off;
1915	void *t;
1916
1917	/* appending split BTF isn't supported yet */
1918	if (src_btf->base_btf)
1919		return libbpf_err(-ENOTSUP);
1920
1921	/* deconstruct BTF, if necessary, and invalidate raw_data */
1922	if (btf_ensure_modifiable(btf))
1923		return libbpf_err(-ENOMEM);
1924
1925	/* remember original strings section size if we have to roll back
1926	 * partial strings section changes
1927	 */
1928	old_strs_len = btf->hdr->str_len;
1929
1930	data_sz = src_btf->hdr->type_len;
1931	cnt = btf__type_cnt(src_btf) - 1;
1932
1933	/* pre-allocate enough memory for new types */
1934	t = btf_add_type_mem(btf, data_sz);
1935	if (!t)
1936		return libbpf_err(-ENOMEM);
1937
1938	/* pre-allocate enough memory for type offset index for new types */
1939	off = btf_add_type_offs_mem(btf, cnt);
1940	if (!off)
1941		return libbpf_err(-ENOMEM);
1942
1943	/* Map the string offsets from src_btf to the offsets from btf to improve performance */
1944	p.str_off_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL);
1945	if (IS_ERR(p.str_off_map))
1946		return libbpf_err(-ENOMEM);
1947
1948	/* bulk copy types data for all types from src_btf */
1949	memcpy(t, src_btf->types_data, data_sz);
1950
1951	for (i = 0; i < cnt; i++) {
1952		sz = btf_type_size(t);
1953		if (sz < 0) {
1954			/* unlikely, has to be corrupted src_btf */
1955			err = sz;
1956			goto err_out;
1957		}
1958
1959		/* fill out type ID to type offset mapping for lookups by type ID */
1960		*off = t - btf->types_data;
1961
1962		/* add, dedup, and remap strings referenced by this BTF type */
1963		err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
1964		if (err)
1965			goto err_out;
1966
1967		/* remap all type IDs referenced from this BTF type */
1968		err = btf_type_visit_type_ids(t, btf_rewrite_type_ids, btf);
1969		if (err)
1970			goto err_out;
1971
1972		/* go to next type data and type offset index entry */
1973		t += sz;
1974		off++;
1975	}
1976
1977	/* Up until now any of the copied type data was effectively invisible,
1978	 * so if we exited early before this point due to error, BTF would be
1979	 * effectively unmodified. There would be extra internal memory
1980	 * pre-allocated, but it would not be available for querying.  But now
1981	 * that we've copied and rewritten all the data successfully, we can
1982	 * update type count and various internal offsets and sizes to
1983	 * "commit" the changes and made them visible to the outside world.
1984	 */
1985	btf->hdr->type_len += data_sz;
1986	btf->hdr->str_off += data_sz;
1987	btf->nr_types += cnt;
1988
1989	hashmap__free(p.str_off_map);
1990
1991	/* return type ID of the first added BTF type */
1992	return btf->start_id + btf->nr_types - cnt;
1993err_out:
1994	/* zero out preallocated memory as if it was just allocated with
1995	 * libbpf_add_mem()
1996	 */
1997	memset(btf->types_data + btf->hdr->type_len, 0, data_sz);
1998	memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len);
1999
2000	/* and now restore original strings section size; types data size
2001	 * wasn't modified, so doesn't need restoring, see big comment above
2002	 */
2003	btf->hdr->str_len = old_strs_len;
2004
2005	hashmap__free(p.str_off_map);
2006
2007	return libbpf_err(err);
2008}
2009
2010/*
2011 * Append new BTF_KIND_INT type with:
2012 *   - *name* - non-empty, non-NULL type name;
2013 *   - *sz* - power-of-2 (1, 2, 4, ..) size of the type, in bytes;
2014 *   - encoding is a combination of BTF_INT_SIGNED, BTF_INT_CHAR, BTF_INT_BOOL.
2015 * Returns:
2016 *   - >0, type ID of newly added BTF type;
2017 *   - <0, on error.
2018 */
2019int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding)
2020{
2021	struct btf_type *t;
2022	int sz, name_off;
2023
2024	/* non-empty name */
2025	if (!name || !name[0])
2026		return libbpf_err(-EINVAL);
2027	/* byte_sz must be power of 2 */
2028	if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 16)
2029		return libbpf_err(-EINVAL);
2030	if (encoding & ~(BTF_INT_SIGNED | BTF_INT_CHAR | BTF_INT_BOOL))
2031		return libbpf_err(-EINVAL);
2032
2033	/* deconstruct BTF, if necessary, and invalidate raw_data */
2034	if (btf_ensure_modifiable(btf))
2035		return libbpf_err(-ENOMEM);
2036
2037	sz = sizeof(struct btf_type) + sizeof(int);
2038	t = btf_add_type_mem(btf, sz);
2039	if (!t)
2040		return libbpf_err(-ENOMEM);
2041
2042	/* if something goes wrong later, we might end up with an extra string,
2043	 * but that shouldn't be a problem, because BTF can't be constructed
2044	 * completely anyway and will most probably be just discarded
2045	 */
2046	name_off = btf__add_str(btf, name);
2047	if (name_off < 0)
2048		return name_off;
2049
2050	t->name_off = name_off;
2051	t->info = btf_type_info(BTF_KIND_INT, 0, 0);
2052	t->size = byte_sz;
2053	/* set INT info, we don't allow setting legacy bit offset/size */
2054	*(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8);
2055
2056	return btf_commit_type(btf, sz);
2057}
2058
2059/*
2060 * Append new BTF_KIND_FLOAT type with:
2061 *   - *name* - non-empty, non-NULL type name;
2062 *   - *sz* - size of the type, in bytes;
2063 * Returns:
2064 *   - >0, type ID of newly added BTF type;
2065 *   - <0, on error.
2066 */
2067int btf__add_float(struct btf *btf, const char *name, size_t byte_sz)
2068{
2069	struct btf_type *t;
2070	int sz, name_off;
2071
2072	/* non-empty name */
2073	if (!name || !name[0])
2074		return libbpf_err(-EINVAL);
2075
2076	/* byte_sz must be one of the explicitly allowed values */
2077	if (byte_sz != 2 && byte_sz != 4 && byte_sz != 8 && byte_sz != 12 &&
2078	    byte_sz != 16)
2079		return libbpf_err(-EINVAL);
2080
2081	if (btf_ensure_modifiable(btf))
2082		return libbpf_err(-ENOMEM);
2083
2084	sz = sizeof(struct btf_type);
2085	t = btf_add_type_mem(btf, sz);
2086	if (!t)
2087		return libbpf_err(-ENOMEM);
2088
2089	name_off = btf__add_str(btf, name);
2090	if (name_off < 0)
2091		return name_off;
2092
2093	t->name_off = name_off;
2094	t->info = btf_type_info(BTF_KIND_FLOAT, 0, 0);
2095	t->size = byte_sz;
2096
2097	return btf_commit_type(btf, sz);
2098}
2099
2100/* it's completely legal to append BTF types with type IDs pointing forward to
2101 * types that haven't been appended yet, so we only make sure that id looks
2102 * sane, we can't guarantee that ID will always be valid
2103 */
2104static int validate_type_id(int id)
2105{
2106	if (id < 0 || id > BTF_MAX_NR_TYPES)
2107		return -EINVAL;
2108	return 0;
2109}
2110
2111/* generic append function for PTR, TYPEDEF, CONST/VOLATILE/RESTRICT */
2112static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id)
2113{
2114	struct btf_type *t;
2115	int sz, name_off = 0;
2116
2117	if (validate_type_id(ref_type_id))
2118		return libbpf_err(-EINVAL);
2119
2120	if (btf_ensure_modifiable(btf))
2121		return libbpf_err(-ENOMEM);
2122
2123	sz = sizeof(struct btf_type);
2124	t = btf_add_type_mem(btf, sz);
2125	if (!t)
2126		return libbpf_err(-ENOMEM);
2127
2128	if (name && name[0]) {
2129		name_off = btf__add_str(btf, name);
2130		if (name_off < 0)
2131			return name_off;
2132	}
2133
2134	t->name_off = name_off;
2135	t->info = btf_type_info(kind, 0, 0);
2136	t->type = ref_type_id;
2137
2138	return btf_commit_type(btf, sz);
2139}
2140
2141/*
2142 * Append new BTF_KIND_PTR type with:
2143 *   - *ref_type_id* - referenced type ID, it might not exist yet;
2144 * Returns:
2145 *   - >0, type ID of newly added BTF type;
2146 *   - <0, on error.
2147 */
2148int btf__add_ptr(struct btf *btf, int ref_type_id)
2149{
2150	return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id);
2151}
2152
2153/*
2154 * Append new BTF_KIND_ARRAY type with:
2155 *   - *index_type_id* - type ID of the type describing array index;
2156 *   - *elem_type_id* - type ID of the type describing array element;
2157 *   - *nr_elems* - the size of the array;
2158 * Returns:
2159 *   - >0, type ID of newly added BTF type;
2160 *   - <0, on error.
2161 */
2162int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems)
2163{
2164	struct btf_type *t;
2165	struct btf_array *a;
2166	int sz;
2167
2168	if (validate_type_id(index_type_id) || validate_type_id(elem_type_id))
2169		return libbpf_err(-EINVAL);
2170
2171	if (btf_ensure_modifiable(btf))
2172		return libbpf_err(-ENOMEM);
2173
2174	sz = sizeof(struct btf_type) + sizeof(struct btf_array);
2175	t = btf_add_type_mem(btf, sz);
2176	if (!t)
2177		return libbpf_err(-ENOMEM);
2178
2179	t->name_off = 0;
2180	t->info = btf_type_info(BTF_KIND_ARRAY, 0, 0);
2181	t->size = 0;
2182
2183	a = btf_array(t);
2184	a->type = elem_type_id;
2185	a->index_type = index_type_id;
2186	a->nelems = nr_elems;
2187
2188	return btf_commit_type(btf, sz);
2189}
2190
2191/* generic STRUCT/UNION append function */
2192static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz)
2193{
2194	struct btf_type *t;
2195	int sz, name_off = 0;
2196
2197	if (btf_ensure_modifiable(btf))
2198		return libbpf_err(-ENOMEM);
2199
2200	sz = sizeof(struct btf_type);
2201	t = btf_add_type_mem(btf, sz);
2202	if (!t)
2203		return libbpf_err(-ENOMEM);
2204
2205	if (name && name[0]) {
2206		name_off = btf__add_str(btf, name);
2207		if (name_off < 0)
2208			return name_off;
2209	}
2210
2211	/* start out with vlen=0 and no kflag; this will be adjusted when
2212	 * adding each member
2213	 */
2214	t->name_off = name_off;
2215	t->info = btf_type_info(kind, 0, 0);
2216	t->size = bytes_sz;
2217
2218	return btf_commit_type(btf, sz);
2219}
2220
2221/*
2222 * Append new BTF_KIND_STRUCT type with:
2223 *   - *name* - name of the struct, can be NULL or empty for anonymous structs;
2224 *   - *byte_sz* - size of the struct, in bytes;
2225 *
2226 * Struct initially has no fields in it. Fields can be added by
2227 * btf__add_field() right after btf__add_struct() succeeds.
2228 *
2229 * Returns:
2230 *   - >0, type ID of newly added BTF type;
2231 *   - <0, on error.
2232 */
2233int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz)
2234{
2235	return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz);
2236}
2237
2238/*
2239 * Append new BTF_KIND_UNION type with:
2240 *   - *name* - name of the union, can be NULL or empty for anonymous union;
2241 *   - *byte_sz* - size of the union, in bytes;
2242 *
2243 * Union initially has no fields in it. Fields can be added by
2244 * btf__add_field() right after btf__add_union() succeeds. All fields
2245 * should have *bit_offset* of 0.
2246 *
2247 * Returns:
2248 *   - >0, type ID of newly added BTF type;
2249 *   - <0, on error.
2250 */
2251int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz)
2252{
2253	return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz);
2254}
2255
2256static struct btf_type *btf_last_type(struct btf *btf)
2257{
2258	return btf_type_by_id(btf, btf__type_cnt(btf) - 1);
2259}
2260
2261/*
2262 * Append new field for the current STRUCT/UNION type with:
2263 *   - *name* - name of the field, can be NULL or empty for anonymous field;
2264 *   - *type_id* - type ID for the type describing field type;
2265 *   - *bit_offset* - bit offset of the start of the field within struct/union;
2266 *   - *bit_size* - bit size of a bitfield, 0 for non-bitfield fields;
2267 * Returns:
2268 *   -  0, on success;
2269 *   - <0, on error.
2270 */
2271int btf__add_field(struct btf *btf, const char *name, int type_id,
2272		   __u32 bit_offset, __u32 bit_size)
2273{
2274	struct btf_type *t;
2275	struct btf_member *m;
2276	bool is_bitfield;
2277	int sz, name_off = 0;
2278
2279	/* last type should be union/struct */
2280	if (btf->nr_types == 0)
2281		return libbpf_err(-EINVAL);
2282	t = btf_last_type(btf);
2283	if (!btf_is_composite(t))
2284		return libbpf_err(-EINVAL);
2285
2286	if (validate_type_id(type_id))
2287		return libbpf_err(-EINVAL);
2288	/* best-effort bit field offset/size enforcement */
2289	is_bitfield = bit_size || (bit_offset % 8 != 0);
2290	if (is_bitfield && (bit_size == 0 || bit_size > 255 || bit_offset > 0xffffff))
2291		return libbpf_err(-EINVAL);
2292
2293	/* only offset 0 is allowed for unions */
2294	if (btf_is_union(t) && bit_offset)
2295		return libbpf_err(-EINVAL);
2296
2297	/* decompose and invalidate raw data */
2298	if (btf_ensure_modifiable(btf))
2299		return libbpf_err(-ENOMEM);
2300
2301	sz = sizeof(struct btf_member);
2302	m = btf_add_type_mem(btf, sz);
2303	if (!m)
2304		return libbpf_err(-ENOMEM);
2305
2306	if (name && name[0]) {
2307		name_off = btf__add_str(btf, name);
2308		if (name_off < 0)
2309			return name_off;
2310	}
2311
2312	m->name_off = name_off;
2313	m->type = type_id;
2314	m->offset = bit_offset | (bit_size << 24);
2315
2316	/* btf_add_type_mem can invalidate t pointer */
2317	t = btf_last_type(btf);
2318	/* update parent type's vlen and kflag */
2319	t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, is_bitfield || btf_kflag(t));
2320
2321	btf->hdr->type_len += sz;
2322	btf->hdr->str_off += sz;
2323	return 0;
2324}
2325
2326static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz,
2327			       bool is_signed, __u8 kind)
2328{
2329	struct btf_type *t;
2330	int sz, name_off = 0;
2331
2332	/* byte_sz must be power of 2 */
2333	if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 8)
2334		return libbpf_err(-EINVAL);
2335
2336	if (btf_ensure_modifiable(btf))
2337		return libbpf_err(-ENOMEM);
2338
2339	sz = sizeof(struct btf_type);
2340	t = btf_add_type_mem(btf, sz);
2341	if (!t)
2342		return libbpf_err(-ENOMEM);
2343
2344	if (name && name[0]) {
2345		name_off = btf__add_str(btf, name);
2346		if (name_off < 0)
2347			return name_off;
2348	}
2349
2350	/* start out with vlen=0; it will be adjusted when adding enum values */
2351	t->name_off = name_off;
2352	t->info = btf_type_info(kind, 0, is_signed);
2353	t->size = byte_sz;
2354
2355	return btf_commit_type(btf, sz);
2356}
2357
2358/*
2359 * Append new BTF_KIND_ENUM type with:
2360 *   - *name* - name of the enum, can be NULL or empty for anonymous enums;
2361 *   - *byte_sz* - size of the enum, in bytes.
2362 *
2363 * Enum initially has no enum values in it (and corresponds to enum forward
2364 * declaration). Enumerator values can be added by btf__add_enum_value()
2365 * immediately after btf__add_enum() succeeds.
2366 *
2367 * Returns:
2368 *   - >0, type ID of newly added BTF type;
2369 *   - <0, on error.
2370 */
2371int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz)
2372{
2373	/*
2374	 * set the signedness to be unsigned, it will change to signed
2375	 * if any later enumerator is negative.
2376	 */
2377	return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM);
2378}
2379
2380/*
2381 * Append new enum value for the current ENUM type with:
2382 *   - *name* - name of the enumerator value, can't be NULL or empty;
2383 *   - *value* - integer value corresponding to enum value *name*;
2384 * Returns:
2385 *   -  0, on success;
2386 *   - <0, on error.
2387 */
2388int btf__add_enum_value(struct btf *btf, const char *name, __s64 value)
2389{
2390	struct btf_type *t;
2391	struct btf_enum *v;
2392	int sz, name_off;
2393
2394	/* last type should be BTF_KIND_ENUM */
2395	if (btf->nr_types == 0)
2396		return libbpf_err(-EINVAL);
2397	t = btf_last_type(btf);
2398	if (!btf_is_enum(t))
2399		return libbpf_err(-EINVAL);
2400
2401	/* non-empty name */
2402	if (!name || !name[0])
2403		return libbpf_err(-EINVAL);
2404	if (value < INT_MIN || value > UINT_MAX)
2405		return libbpf_err(-E2BIG);
2406
2407	/* decompose and invalidate raw data */
2408	if (btf_ensure_modifiable(btf))
2409		return libbpf_err(-ENOMEM);
2410
2411	sz = sizeof(struct btf_enum);
2412	v = btf_add_type_mem(btf, sz);
2413	if (!v)
2414		return libbpf_err(-ENOMEM);
2415
2416	name_off = btf__add_str(btf, name);
2417	if (name_off < 0)
2418		return name_off;
2419
2420	v->name_off = name_off;
2421	v->val = value;
2422
2423	/* update parent type's vlen */
2424	t = btf_last_type(btf);
2425	btf_type_inc_vlen(t);
2426
2427	/* if negative value, set signedness to signed */
2428	if (value < 0)
2429		t->info = btf_type_info(btf_kind(t), btf_vlen(t), true);
2430
2431	btf->hdr->type_len += sz;
2432	btf->hdr->str_off += sz;
2433	return 0;
2434}
2435
2436/*
2437 * Append new BTF_KIND_ENUM64 type with:
2438 *   - *name* - name of the enum, can be NULL or empty for anonymous enums;
2439 *   - *byte_sz* - size of the enum, in bytes.
2440 *   - *is_signed* - whether the enum values are signed or not;
2441 *
2442 * Enum initially has no enum values in it (and corresponds to enum forward
2443 * declaration). Enumerator values can be added by btf__add_enum64_value()
2444 * immediately after btf__add_enum64() succeeds.
2445 *
2446 * Returns:
2447 *   - >0, type ID of newly added BTF type;
2448 *   - <0, on error.
2449 */
2450int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz,
2451		    bool is_signed)
2452{
2453	return btf_add_enum_common(btf, name, byte_sz, is_signed,
2454				   BTF_KIND_ENUM64);
2455}
2456
2457/*
2458 * Append new enum value for the current ENUM64 type with:
2459 *   - *name* - name of the enumerator value, can't be NULL or empty;
2460 *   - *value* - integer value corresponding to enum value *name*;
2461 * Returns:
2462 *   -  0, on success;
2463 *   - <0, on error.
2464 */
2465int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value)
2466{
2467	struct btf_enum64 *v;
2468	struct btf_type *t;
2469	int sz, name_off;
2470
2471	/* last type should be BTF_KIND_ENUM64 */
2472	if (btf->nr_types == 0)
2473		return libbpf_err(-EINVAL);
2474	t = btf_last_type(btf);
2475	if (!btf_is_enum64(t))
2476		return libbpf_err(-EINVAL);
2477
2478	/* non-empty name */
2479	if (!name || !name[0])
2480		return libbpf_err(-EINVAL);
2481
2482	/* decompose and invalidate raw data */
2483	if (btf_ensure_modifiable(btf))
2484		return libbpf_err(-ENOMEM);
2485
2486	sz = sizeof(struct btf_enum64);
2487	v = btf_add_type_mem(btf, sz);
2488	if (!v)
2489		return libbpf_err(-ENOMEM);
2490
2491	name_off = btf__add_str(btf, name);
2492	if (name_off < 0)
2493		return name_off;
2494
2495	v->name_off = name_off;
2496	v->val_lo32 = (__u32)value;
2497	v->val_hi32 = value >> 32;
2498
2499	/* update parent type's vlen */
2500	t = btf_last_type(btf);
2501	btf_type_inc_vlen(t);
2502
2503	btf->hdr->type_len += sz;
2504	btf->hdr->str_off += sz;
2505	return 0;
2506}
2507
2508/*
2509 * Append new BTF_KIND_FWD type with:
2510 *   - *name*, non-empty/non-NULL name;
2511 *   - *fwd_kind*, kind of forward declaration, one of BTF_FWD_STRUCT,
2512 *     BTF_FWD_UNION, or BTF_FWD_ENUM;
2513 * Returns:
2514 *   - >0, type ID of newly added BTF type;
2515 *   - <0, on error.
2516 */
2517int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind)
2518{
2519	if (!name || !name[0])
2520		return libbpf_err(-EINVAL);
2521
2522	switch (fwd_kind) {
2523	case BTF_FWD_STRUCT:
2524	case BTF_FWD_UNION: {
2525		struct btf_type *t;
2526		int id;
2527
2528		id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0);
2529		if (id <= 0)
2530			return id;
2531		t = btf_type_by_id(btf, id);
2532		t->info = btf_type_info(BTF_KIND_FWD, 0, fwd_kind == BTF_FWD_UNION);
2533		return id;
2534	}
2535	case BTF_FWD_ENUM:
2536		/* enum forward in BTF currently is just an enum with no enum
2537		 * values; we also assume a standard 4-byte size for it
2538		 */
2539		return btf__add_enum(btf, name, sizeof(int));
2540	default:
2541		return libbpf_err(-EINVAL);
2542	}
2543}
2544
2545/*
2546 * Append new BTF_KING_TYPEDEF type with:
2547 *   - *name*, non-empty/non-NULL name;
2548 *   - *ref_type_id* - referenced type ID, it might not exist yet;
2549 * Returns:
2550 *   - >0, type ID of newly added BTF type;
2551 *   - <0, on error.
2552 */
2553int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id)
2554{
2555	if (!name || !name[0])
2556		return libbpf_err(-EINVAL);
2557
2558	return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id);
2559}
2560
2561/*
2562 * Append new BTF_KIND_VOLATILE type with:
2563 *   - *ref_type_id* - referenced type ID, it might not exist yet;
2564 * Returns:
2565 *   - >0, type ID of newly added BTF type;
2566 *   - <0, on error.
2567 */
2568int btf__add_volatile(struct btf *btf, int ref_type_id)
2569{
2570	return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id);
2571}
2572
2573/*
2574 * Append new BTF_KIND_CONST type with:
2575 *   - *ref_type_id* - referenced type ID, it might not exist yet;
2576 * Returns:
2577 *   - >0, type ID of newly added BTF type;
2578 *   - <0, on error.
2579 */
2580int btf__add_const(struct btf *btf, int ref_type_id)
2581{
2582	return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id);
2583}
2584
2585/*
2586 * Append new BTF_KIND_RESTRICT type with:
2587 *   - *ref_type_id* - referenced type ID, it might not exist yet;
2588 * Returns:
2589 *   - >0, type ID of newly added BTF type;
2590 *   - <0, on error.
2591 */
2592int btf__add_restrict(struct btf *btf, int ref_type_id)
2593{
2594	return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id);
2595}
2596
2597/*
2598 * Append new BTF_KIND_TYPE_TAG type with:
2599 *   - *value*, non-empty/non-NULL tag value;
2600 *   - *ref_type_id* - referenced type ID, it might not exist yet;
2601 * Returns:
2602 *   - >0, type ID of newly added BTF type;
2603 *   - <0, on error.
2604 */
2605int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id)
2606{
2607	if (!value || !value[0])
2608		return libbpf_err(-EINVAL);
2609
2610	return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id);
2611}
2612
2613/*
2614 * Append new BTF_KIND_FUNC type with:
2615 *   - *name*, non-empty/non-NULL name;
2616 *   - *proto_type_id* - FUNC_PROTO's type ID, it might not exist yet;
2617 * Returns:
2618 *   - >0, type ID of newly added BTF type;
2619 *   - <0, on error.
2620 */
2621int btf__add_func(struct btf *btf, const char *name,
2622		  enum btf_func_linkage linkage, int proto_type_id)
2623{
2624	int id;
2625
2626	if (!name || !name[0])
2627		return libbpf_err(-EINVAL);
2628	if (linkage != BTF_FUNC_STATIC && linkage != BTF_FUNC_GLOBAL &&
2629	    linkage != BTF_FUNC_EXTERN)
2630		return libbpf_err(-EINVAL);
2631
2632	id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id);
2633	if (id > 0) {
2634		struct btf_type *t = btf_type_by_id(btf, id);
2635
2636		t->info = btf_type_info(BTF_KIND_FUNC, linkage, 0);
2637	}
2638	return libbpf_err(id);
2639}
2640
2641/*
2642 * Append new BTF_KIND_FUNC_PROTO with:
2643 *   - *ret_type_id* - type ID for return result of a function.
2644 *
2645 * Function prototype initially has no arguments, but they can be added by
2646 * btf__add_func_param() one by one, immediately after
2647 * btf__add_func_proto() succeeded.
2648 *
2649 * Returns:
2650 *   - >0, type ID of newly added BTF type;
2651 *   - <0, on error.
2652 */
2653int btf__add_func_proto(struct btf *btf, int ret_type_id)
2654{
2655	struct btf_type *t;
2656	int sz;
2657
2658	if (validate_type_id(ret_type_id))
2659		return libbpf_err(-EINVAL);
2660
2661	if (btf_ensure_modifiable(btf))
2662		return libbpf_err(-ENOMEM);
2663
2664	sz = sizeof(struct btf_type);
2665	t = btf_add_type_mem(btf, sz);
2666	if (!t)
2667		return libbpf_err(-ENOMEM);
2668
2669	/* start out with vlen=0; this will be adjusted when adding enum
2670	 * values, if necessary
2671	 */
2672	t->name_off = 0;
2673	t->info = btf_type_info(BTF_KIND_FUNC_PROTO, 0, 0);
2674	t->type = ret_type_id;
2675
2676	return btf_commit_type(btf, sz);
2677}
2678
2679/*
2680 * Append new function parameter for current FUNC_PROTO type with:
2681 *   - *name* - parameter name, can be NULL or empty;
2682 *   - *type_id* - type ID describing the type of the parameter.
2683 * Returns:
2684 *   -  0, on success;
2685 *   - <0, on error.
2686 */
2687int btf__add_func_param(struct btf *btf, const char *name, int type_id)
2688{
2689	struct btf_type *t;
2690	struct btf_param *p;
2691	int sz, name_off = 0;
2692
2693	if (validate_type_id(type_id))
2694		return libbpf_err(-EINVAL);
2695
2696	/* last type should be BTF_KIND_FUNC_PROTO */
2697	if (btf->nr_types == 0)
2698		return libbpf_err(-EINVAL);
2699	t = btf_last_type(btf);
2700	if (!btf_is_func_proto(t))
2701		return libbpf_err(-EINVAL);
2702
2703	/* decompose and invalidate raw data */
2704	if (btf_ensure_modifiable(btf))
2705		return libbpf_err(-ENOMEM);
2706
2707	sz = sizeof(struct btf_param);
2708	p = btf_add_type_mem(btf, sz);
2709	if (!p)
2710		return libbpf_err(-ENOMEM);
2711
2712	if (name && name[0]) {
2713		name_off = btf__add_str(btf, name);
2714		if (name_off < 0)
2715			return name_off;
2716	}
2717
2718	p->name_off = name_off;
2719	p->type = type_id;
2720
2721	/* update parent type's vlen */
2722	t = btf_last_type(btf);
2723	btf_type_inc_vlen(t);
2724
2725	btf->hdr->type_len += sz;
2726	btf->hdr->str_off += sz;
2727	return 0;
2728}
2729
2730/*
2731 * Append new BTF_KIND_VAR type with:
2732 *   - *name* - non-empty/non-NULL name;
2733 *   - *linkage* - variable linkage, one of BTF_VAR_STATIC,
2734 *     BTF_VAR_GLOBAL_ALLOCATED, or BTF_VAR_GLOBAL_EXTERN;
2735 *   - *type_id* - type ID of the type describing the type of the variable.
2736 * Returns:
2737 *   - >0, type ID of newly added BTF type;
2738 *   - <0, on error.
2739 */
2740int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id)
2741{
2742	struct btf_type *t;
2743	struct btf_var *v;
2744	int sz, name_off;
2745
2746	/* non-empty name */
2747	if (!name || !name[0])
2748		return libbpf_err(-EINVAL);
2749	if (linkage != BTF_VAR_STATIC && linkage != BTF_VAR_GLOBAL_ALLOCATED &&
2750	    linkage != BTF_VAR_GLOBAL_EXTERN)
2751		return libbpf_err(-EINVAL);
2752	if (validate_type_id(type_id))
2753		return libbpf_err(-EINVAL);
2754
2755	/* deconstruct BTF, if necessary, and invalidate raw_data */
2756	if (btf_ensure_modifiable(btf))
2757		return libbpf_err(-ENOMEM);
2758
2759	sz = sizeof(struct btf_type) + sizeof(struct btf_var);
2760	t = btf_add_type_mem(btf, sz);
2761	if (!t)
2762		return libbpf_err(-ENOMEM);
2763
2764	name_off = btf__add_str(btf, name);
2765	if (name_off < 0)
2766		return name_off;
2767
2768	t->name_off = name_off;
2769	t->info = btf_type_info(BTF_KIND_VAR, 0, 0);
2770	t->type = type_id;
2771
2772	v = btf_var(t);
2773	v->linkage = linkage;
2774
2775	return btf_commit_type(btf, sz);
2776}
2777
2778/*
2779 * Append new BTF_KIND_DATASEC type with:
2780 *   - *name* - non-empty/non-NULL name;
2781 *   - *byte_sz* - data section size, in bytes.
2782 *
2783 * Data section is initially empty. Variables info can be added with
2784 * btf__add_datasec_var_info() calls, after btf__add_datasec() succeeds.
2785 *
2786 * Returns:
2787 *   - >0, type ID of newly added BTF type;
2788 *   - <0, on error.
2789 */
2790int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz)
2791{
2792	struct btf_type *t;
2793	int sz, name_off;
2794
2795	/* non-empty name */
2796	if (!name || !name[0])
2797		return libbpf_err(-EINVAL);
2798
2799	if (btf_ensure_modifiable(btf))
2800		return libbpf_err(-ENOMEM);
2801
2802	sz = sizeof(struct btf_type);
2803	t = btf_add_type_mem(btf, sz);
2804	if (!t)
2805		return libbpf_err(-ENOMEM);
2806
2807	name_off = btf__add_str(btf, name);
2808	if (name_off < 0)
2809		return name_off;
2810
2811	/* start with vlen=0, which will be update as var_secinfos are added */
2812	t->name_off = name_off;
2813	t->info = btf_type_info(BTF_KIND_DATASEC, 0, 0);
2814	t->size = byte_sz;
2815
2816	return btf_commit_type(btf, sz);
2817}
2818
2819/*
2820 * Append new data section variable information entry for current DATASEC type:
2821 *   - *var_type_id* - type ID, describing type of the variable;
2822 *   - *offset* - variable offset within data section, in bytes;
2823 *   - *byte_sz* - variable size, in bytes.
2824 *
2825 * Returns:
2826 *   -  0, on success;
2827 *   - <0, on error.
2828 */
2829int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz)
2830{
2831	struct btf_type *t;
2832	struct btf_var_secinfo *v;
2833	int sz;
2834
2835	/* last type should be BTF_KIND_DATASEC */
2836	if (btf->nr_types == 0)
2837		return libbpf_err(-EINVAL);
2838	t = btf_last_type(btf);
2839	if (!btf_is_datasec(t))
2840		return libbpf_err(-EINVAL);
2841
2842	if (validate_type_id(var_type_id))
2843		return libbpf_err(-EINVAL);
2844
2845	/* decompose and invalidate raw data */
2846	if (btf_ensure_modifiable(btf))
2847		return libbpf_err(-ENOMEM);
2848
2849	sz = sizeof(struct btf_var_secinfo);
2850	v = btf_add_type_mem(btf, sz);
2851	if (!v)
2852		return libbpf_err(-ENOMEM);
2853
2854	v->type = var_type_id;
2855	v->offset = offset;
2856	v->size = byte_sz;
2857
2858	/* update parent type's vlen */
2859	t = btf_last_type(btf);
2860	btf_type_inc_vlen(t);
2861
2862	btf->hdr->type_len += sz;
2863	btf->hdr->str_off += sz;
2864	return 0;
2865}
2866
2867/*
2868 * Append new BTF_KIND_DECL_TAG type with:
2869 *   - *value* - non-empty/non-NULL string;
2870 *   - *ref_type_id* - referenced type ID, it might not exist yet;
2871 *   - *component_idx* - -1 for tagging reference type, otherwise struct/union
2872 *     member or function argument index;
2873 * Returns:
2874 *   - >0, type ID of newly added BTF type;
2875 *   - <0, on error.
2876 */
2877int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
2878		 int component_idx)
2879{
2880	struct btf_type *t;
2881	int sz, value_off;
2882
2883	if (!value || !value[0] || component_idx < -1)
2884		return libbpf_err(-EINVAL);
2885
2886	if (validate_type_id(ref_type_id))
2887		return libbpf_err(-EINVAL);
2888
2889	if (btf_ensure_modifiable(btf))
2890		return libbpf_err(-ENOMEM);
2891
2892	sz = sizeof(struct btf_type) + sizeof(struct btf_decl_tag);
2893	t = btf_add_type_mem(btf, sz);
2894	if (!t)
2895		return libbpf_err(-ENOMEM);
2896
2897	value_off = btf__add_str(btf, value);
2898	if (value_off < 0)
2899		return value_off;
2900
2901	t->name_off = value_off;
2902	t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, false);
2903	t->type = ref_type_id;
2904	btf_decl_tag(t)->component_idx = component_idx;
2905
2906	return btf_commit_type(btf, sz);
2907}
2908
2909struct btf_ext_sec_setup_param {
2910	__u32 off;
2911	__u32 len;
2912	__u32 min_rec_size;
2913	struct btf_ext_info *ext_info;
2914	const char *desc;
2915};
2916
2917static int btf_ext_setup_info(struct btf_ext *btf_ext,
2918			      struct btf_ext_sec_setup_param *ext_sec)
2919{
2920	const struct btf_ext_info_sec *sinfo;
2921	struct btf_ext_info *ext_info;
2922	__u32 info_left, record_size;
2923	size_t sec_cnt = 0;
2924	/* The start of the info sec (including the __u32 record_size). */
2925	void *info;
2926
2927	if (ext_sec->len == 0)
2928		return 0;
2929
2930	if (ext_sec->off & 0x03) {
2931		pr_debug(".BTF.ext %s section is not aligned to 4 bytes\n",
2932		     ext_sec->desc);
2933		return -EINVAL;
2934	}
2935
2936	info = btf_ext->data + btf_ext->hdr->hdr_len + ext_sec->off;
2937	info_left = ext_sec->len;
2938
2939	if (btf_ext->data + btf_ext->data_size < info + ext_sec->len) {
2940		pr_debug("%s section (off:%u len:%u) is beyond the end of the ELF section .BTF.ext\n",
2941			 ext_sec->desc, ext_sec->off, ext_sec->len);
2942		return -EINVAL;
2943	}
2944
2945	/* At least a record size */
2946	if (info_left < sizeof(__u32)) {
2947		pr_debug(".BTF.ext %s record size not found\n", ext_sec->desc);
2948		return -EINVAL;
2949	}
2950
2951	/* The record size needs to meet the minimum standard */
2952	record_size = *(__u32 *)info;
2953	if (record_size < ext_sec->min_rec_size ||
2954	    record_size & 0x03) {
2955		pr_debug("%s section in .BTF.ext has invalid record size %u\n",
2956			 ext_sec->desc, record_size);
2957		return -EINVAL;
2958	}
2959
2960	sinfo = info + sizeof(__u32);
2961	info_left -= sizeof(__u32);
2962
2963	/* If no records, return failure now so .BTF.ext won't be used. */
2964	if (!info_left) {
2965		pr_debug("%s section in .BTF.ext has no records", ext_sec->desc);
2966		return -EINVAL;
2967	}
2968
2969	while (info_left) {
2970		unsigned int sec_hdrlen = sizeof(struct btf_ext_info_sec);
2971		__u64 total_record_size;
2972		__u32 num_records;
2973
2974		if (info_left < sec_hdrlen) {
2975			pr_debug("%s section header is not found in .BTF.ext\n",
2976			     ext_sec->desc);
2977			return -EINVAL;
2978		}
2979
2980		num_records = sinfo->num_info;
2981		if (num_records == 0) {
2982			pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2983			     ext_sec->desc);
2984			return -EINVAL;
2985		}
2986
2987		total_record_size = sec_hdrlen + (__u64)num_records * record_size;
2988		if (info_left < total_record_size) {
2989			pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2990			     ext_sec->desc);
2991			return -EINVAL;
2992		}
2993
2994		info_left -= total_record_size;
2995		sinfo = (void *)sinfo + total_record_size;
2996		sec_cnt++;
2997	}
2998
2999	ext_info = ext_sec->ext_info;
3000	ext_info->len = ext_sec->len - sizeof(__u32);
3001	ext_info->rec_size = record_size;
3002	ext_info->info = info + sizeof(__u32);
3003	ext_info->sec_cnt = sec_cnt;
3004
3005	return 0;
3006}
3007
3008static int btf_ext_setup_func_info(struct btf_ext *btf_ext)
3009{
3010	struct btf_ext_sec_setup_param param = {
3011		.off = btf_ext->hdr->func_info_off,
3012		.len = btf_ext->hdr->func_info_len,
3013		.min_rec_size = sizeof(struct bpf_func_info_min),
3014		.ext_info = &btf_ext->func_info,
3015		.desc = "func_info"
3016	};
3017
3018	return btf_ext_setup_info(btf_ext, &param);
3019}
3020
3021static int btf_ext_setup_line_info(struct btf_ext *btf_ext)
3022{
3023	struct btf_ext_sec_setup_param param = {
3024		.off = btf_ext->hdr->line_info_off,
3025		.len = btf_ext->hdr->line_info_len,
3026		.min_rec_size = sizeof(struct bpf_line_info_min),
3027		.ext_info = &btf_ext->line_info,
3028		.desc = "line_info",
3029	};
3030
3031	return btf_ext_setup_info(btf_ext, &param);
3032}
3033
3034static int btf_ext_setup_core_relos(struct btf_ext *btf_ext)
3035{
3036	struct btf_ext_sec_setup_param param = {
3037		.off = btf_ext->hdr->core_relo_off,
3038		.len = btf_ext->hdr->core_relo_len,
3039		.min_rec_size = sizeof(struct bpf_core_relo),
3040		.ext_info = &btf_ext->core_relo_info,
3041		.desc = "core_relo",
3042	};
3043
3044	return btf_ext_setup_info(btf_ext, &param);
3045}
3046
3047static int btf_ext_parse_hdr(__u8 *data, __u32 data_size)
3048{
3049	const struct btf_ext_header *hdr = (struct btf_ext_header *)data;
3050
3051	if (data_size < offsetofend(struct btf_ext_header, hdr_len) ||
3052	    data_size < hdr->hdr_len) {
3053		pr_debug("BTF.ext header not found");
3054		return -EINVAL;
3055	}
3056
3057	if (hdr->magic == bswap_16(BTF_MAGIC)) {
3058		pr_warn("BTF.ext in non-native endianness is not supported\n");
3059		return -ENOTSUP;
3060	} else if (hdr->magic != BTF_MAGIC) {
3061		pr_debug("Invalid BTF.ext magic:%x\n", hdr->magic);
3062		return -EINVAL;
3063	}
3064
3065	if (hdr->version != BTF_VERSION) {
3066		pr_debug("Unsupported BTF.ext version:%u\n", hdr->version);
3067		return -ENOTSUP;
3068	}
3069
3070	if (hdr->flags) {
3071		pr_debug("Unsupported BTF.ext flags:%x\n", hdr->flags);
3072		return -ENOTSUP;
3073	}
3074
3075	if (data_size == hdr->hdr_len) {
3076		pr_debug("BTF.ext has no data\n");
3077		return -EINVAL;
3078	}
3079
3080	return 0;
3081}
3082
3083void btf_ext__free(struct btf_ext *btf_ext)
3084{
3085	if (IS_ERR_OR_NULL(btf_ext))
3086		return;
3087	free(btf_ext->func_info.sec_idxs);
3088	free(btf_ext->line_info.sec_idxs);
3089	free(btf_ext->core_relo_info.sec_idxs);
3090	free(btf_ext->data);
3091	free(btf_ext);
3092}
3093
3094struct btf_ext *btf_ext__new(const __u8 *data, __u32 size)
3095{
3096	struct btf_ext *btf_ext;
3097	int err;
3098
3099	btf_ext = calloc(1, sizeof(struct btf_ext));
3100	if (!btf_ext)
3101		return libbpf_err_ptr(-ENOMEM);
3102
3103	btf_ext->data_size = size;
3104	btf_ext->data = malloc(size);
3105	if (!btf_ext->data) {
3106		err = -ENOMEM;
3107		goto done;
3108	}
3109	memcpy(btf_ext->data, data, size);
3110
3111	err = btf_ext_parse_hdr(btf_ext->data, size);
3112	if (err)
3113		goto done;
3114
3115	if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, line_info_len)) {
3116		err = -EINVAL;
3117		goto done;
3118	}
3119
3120	err = btf_ext_setup_func_info(btf_ext);
3121	if (err)
3122		goto done;
3123
3124	err = btf_ext_setup_line_info(btf_ext);
3125	if (err)
3126		goto done;
3127
3128	if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, core_relo_len))
3129		goto done; /* skip core relos parsing */
3130
3131	err = btf_ext_setup_core_relos(btf_ext);
3132	if (err)
3133		goto done;
3134
3135done:
3136	if (err) {
3137		btf_ext__free(btf_ext);
3138		return libbpf_err_ptr(err);
3139	}
3140
3141	return btf_ext;
3142}
3143
3144const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size)
3145{
3146	*size = btf_ext->data_size;
3147	return btf_ext->data;
3148}
3149
3150struct btf_dedup;
3151
3152static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
3153static void btf_dedup_free(struct btf_dedup *d);
3154static int btf_dedup_prep(struct btf_dedup *d);
3155static int btf_dedup_strings(struct btf_dedup *d);
3156static int btf_dedup_prim_types(struct btf_dedup *d);
3157static int btf_dedup_struct_types(struct btf_dedup *d);
3158static int btf_dedup_ref_types(struct btf_dedup *d);
3159static int btf_dedup_resolve_fwds(struct btf_dedup *d);
3160static int btf_dedup_compact_types(struct btf_dedup *d);
3161static int btf_dedup_remap_types(struct btf_dedup *d);
3162
3163/*
3164 * Deduplicate BTF types and strings.
3165 *
3166 * BTF dedup algorithm takes as an input `struct btf` representing `.BTF` ELF
3167 * section with all BTF type descriptors and string data. It overwrites that
3168 * memory in-place with deduplicated types and strings without any loss of
3169 * information. If optional `struct btf_ext` representing '.BTF.ext' ELF section
3170 * is provided, all the strings referenced from .BTF.ext section are honored
3171 * and updated to point to the right offsets after deduplication.
3172 *
3173 * If function returns with error, type/string data might be garbled and should
3174 * be discarded.
3175 *
3176 * More verbose and detailed description of both problem btf_dedup is solving,
3177 * as well as solution could be found at:
3178 * https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html
3179 *
3180 * Problem description and justification
3181 * =====================================
3182 *
3183 * BTF type information is typically emitted either as a result of conversion
3184 * from DWARF to BTF or directly by compiler. In both cases, each compilation
3185 * unit contains information about a subset of all the types that are used
3186 * in an application. These subsets are frequently overlapping and contain a lot
3187 * of duplicated information when later concatenated together into a single
3188 * binary. This algorithm ensures that each unique type is represented by single
3189 * BTF type descriptor, greatly reducing resulting size of BTF data.
3190 *
3191 * Compilation unit isolation and subsequent duplication of data is not the only
3192 * problem. The same type hierarchy (e.g., struct and all the type that struct
3193 * references) in different compilation units can be represented in BTF to
3194 * various degrees of completeness (or, rather, incompleteness) due to
3195 * struct/union forward declarations.
3196 *
3197 * Let's take a look at an example, that we'll use to better understand the
3198 * problem (and solution). Suppose we have two compilation units, each using
3199 * same `struct S`, but each of them having incomplete type information about
3200 * struct's fields:
3201 *
3202 * // CU #1:
3203 * struct S;
3204 * struct A {
3205 *	int a;
3206 *	struct A* self;
3207 *	struct S* parent;
3208 * };
3209 * struct B;
3210 * struct S {
3211 *	struct A* a_ptr;
3212 *	struct B* b_ptr;
3213 * };
3214 *
3215 * // CU #2:
3216 * struct S;
3217 * struct A;
3218 * struct B {
3219 *	int b;
3220 *	struct B* self;
3221 *	struct S* parent;
3222 * };
3223 * struct S {
3224 *	struct A* a_ptr;
3225 *	struct B* b_ptr;
3226 * };
3227 *
3228 * In case of CU #1, BTF data will know only that `struct B` exist (but no
3229 * more), but will know the complete type information about `struct A`. While
3230 * for CU #2, it will know full type information about `struct B`, but will
3231 * only know about forward declaration of `struct A` (in BTF terms, it will
3232 * have `BTF_KIND_FWD` type descriptor with name `B`).
3233 *
3234 * This compilation unit isolation means that it's possible that there is no
3235 * single CU with complete type information describing structs `S`, `A`, and
3236 * `B`. Also, we might get tons of duplicated and redundant type information.
3237 *
3238 * Additional complication we need to keep in mind comes from the fact that
3239 * types, in general, can form graphs containing cycles, not just DAGs.
3240 *
3241 * While algorithm does deduplication, it also merges and resolves type
3242 * information (unless disabled throught `struct btf_opts`), whenever possible.
3243 * E.g., in the example above with two compilation units having partial type
3244 * information for structs `A` and `B`, the output of algorithm will emit
3245 * a single copy of each BTF type that describes structs `A`, `B`, and `S`
3246 * (as well as type information for `int` and pointers), as if they were defined
3247 * in a single compilation unit as:
3248 *
3249 * struct A {
3250 *	int a;
3251 *	struct A* self;
3252 *	struct S* parent;
3253 * };
3254 * struct B {
3255 *	int b;
3256 *	struct B* self;
3257 *	struct S* parent;
3258 * };
3259 * struct S {
3260 *	struct A* a_ptr;
3261 *	struct B* b_ptr;
3262 * };
3263 *
3264 * Algorithm summary
3265 * =================
3266 *
3267 * Algorithm completes its work in 7 separate passes:
3268 *
3269 * 1. Strings deduplication.
3270 * 2. Primitive types deduplication (int, enum, fwd).
3271 * 3. Struct/union types deduplication.
3272 * 4. Resolve unambiguous forward declarations.
3273 * 5. Reference types deduplication (pointers, typedefs, arrays, funcs, func
3274 *    protos, and const/volatile/restrict modifiers).
3275 * 6. Types compaction.
3276 * 7. Types remapping.
3277 *
3278 * Algorithm determines canonical type descriptor, which is a single
3279 * representative type for each truly unique type. This canonical type is the
3280 * one that will go into final deduplicated BTF type information. For
3281 * struct/unions, it is also the type that algorithm will merge additional type
3282 * information into (while resolving FWDs), as it discovers it from data in
3283 * other CUs. Each input BTF type eventually gets either mapped to itself, if
3284 * that type is canonical, or to some other type, if that type is equivalent
3285 * and was chosen as canonical representative. This mapping is stored in
3286 * `btf_dedup->map` array. This map is also used to record STRUCT/UNION that
3287 * FWD type got resolved to.
3288 *
3289 * To facilitate fast discovery of canonical types, we also maintain canonical
3290 * index (`btf_dedup->dedup_table`), which maps type descriptor's signature hash
3291 * (i.e., hashed kind, name, size, fields, etc) into a list of canonical types
3292 * that match that signature. With sufficiently good choice of type signature
3293 * hashing function, we can limit number of canonical types for each unique type
3294 * signature to a very small number, allowing to find canonical type for any
3295 * duplicated type very quickly.
3296 *
3297 * Struct/union deduplication is the most critical part and algorithm for
3298 * deduplicating structs/unions is described in greater details in comments for
3299 * `btf_dedup_is_equiv` function.
3300 */
3301int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts)
3302{
3303	struct btf_dedup *d;
3304	int err;
3305
3306	if (!OPTS_VALID(opts, btf_dedup_opts))
3307		return libbpf_err(-EINVAL);
3308
3309	d = btf_dedup_new(btf, opts);
3310	if (IS_ERR(d)) {
3311		pr_debug("btf_dedup_new failed: %ld", PTR_ERR(d));
3312		return libbpf_err(-EINVAL);
3313	}
3314
3315	if (btf_ensure_modifiable(btf)) {
3316		err = -ENOMEM;
3317		goto done;
3318	}
3319
3320	err = btf_dedup_prep(d);
3321	if (err) {
3322		pr_debug("btf_dedup_prep failed:%d\n", err);
3323		goto done;
3324	}
3325	err = btf_dedup_strings(d);
3326	if (err < 0) {
3327		pr_debug("btf_dedup_strings failed:%d\n", err);
3328		goto done;
3329	}
3330	err = btf_dedup_prim_types(d);
3331	if (err < 0) {
3332		pr_debug("btf_dedup_prim_types failed:%d\n", err);
3333		goto done;
3334	}
3335	err = btf_dedup_struct_types(d);
3336	if (err < 0) {
3337		pr_debug("btf_dedup_struct_types failed:%d\n", err);
3338		goto done;
3339	}
3340	err = btf_dedup_resolve_fwds(d);
3341	if (err < 0) {
3342		pr_debug("btf_dedup_resolve_fwds failed:%d\n", err);
3343		goto done;
3344	}
3345	err = btf_dedup_ref_types(d);
3346	if (err < 0) {
3347		pr_debug("btf_dedup_ref_types failed:%d\n", err);
3348		goto done;
3349	}
3350	err = btf_dedup_compact_types(d);
3351	if (err < 0) {
3352		pr_debug("btf_dedup_compact_types failed:%d\n", err);
3353		goto done;
3354	}
3355	err = btf_dedup_remap_types(d);
3356	if (err < 0) {
3357		pr_debug("btf_dedup_remap_types failed:%d\n", err);
3358		goto done;
3359	}
3360
3361done:
3362	btf_dedup_free(d);
3363	return libbpf_err(err);
3364}
3365
3366#define BTF_UNPROCESSED_ID ((__u32)-1)
3367#define BTF_IN_PROGRESS_ID ((__u32)-2)
3368
3369struct btf_dedup {
3370	/* .BTF section to be deduped in-place */
3371	struct btf *btf;
3372	/*
3373	 * Optional .BTF.ext section. When provided, any strings referenced
3374	 * from it will be taken into account when deduping strings
3375	 */
3376	struct btf_ext *btf_ext;
3377	/*
3378	 * This is a map from any type's signature hash to a list of possible
3379	 * canonical representative type candidates. Hash collisions are
3380	 * ignored, so even types of various kinds can share same list of
3381	 * candidates, which is fine because we rely on subsequent
3382	 * btf_xxx_equal() checks to authoritatively verify type equality.
3383	 */
3384	struct hashmap *dedup_table;
3385	/* Canonical types map */
3386	__u32 *map;
3387	/* Hypothetical mapping, used during type graph equivalence checks */
3388	__u32 *hypot_map;
3389	__u32 *hypot_list;
3390	size_t hypot_cnt;
3391	size_t hypot_cap;
3392	/* Whether hypothetical mapping, if successful, would need to adjust
3393	 * already canonicalized types (due to a new forward declaration to
3394	 * concrete type resolution). In such case, during split BTF dedup
3395	 * candidate type would still be considered as different, because base
3396	 * BTF is considered to be immutable.
3397	 */
3398	bool hypot_adjust_canon;
3399	/* Various option modifying behavior of algorithm */
3400	struct btf_dedup_opts opts;
3401	/* temporary strings deduplication state */
3402	struct strset *strs_set;
3403};
3404
3405static long hash_combine(long h, long value)
3406{
3407	return h * 31 + value;
3408}
3409
3410#define for_each_dedup_cand(d, node, hash) \
3411	hashmap__for_each_key_entry(d->dedup_table, node, hash)
3412
3413static int btf_dedup_table_add(struct btf_dedup *d, long hash, __u32 type_id)
3414{
3415	return hashmap__append(d->dedup_table, hash, type_id);
3416}
3417
3418static int btf_dedup_hypot_map_add(struct btf_dedup *d,
3419				   __u32 from_id, __u32 to_id)
3420{
3421	if (d->hypot_cnt == d->hypot_cap) {
3422		__u32 *new_list;
3423
3424		d->hypot_cap += max((size_t)16, d->hypot_cap / 2);
3425		new_list = libbpf_reallocarray(d->hypot_list, d->hypot_cap, sizeof(__u32));
3426		if (!new_list)
3427			return -ENOMEM;
3428		d->hypot_list = new_list;
3429	}
3430	d->hypot_list[d->hypot_cnt++] = from_id;
3431	d->hypot_map[from_id] = to_id;
3432	return 0;
3433}
3434
3435static void btf_dedup_clear_hypot_map(struct btf_dedup *d)
3436{
3437	int i;
3438
3439	for (i = 0; i < d->hypot_cnt; i++)
3440		d->hypot_map[d->hypot_list[i]] = BTF_UNPROCESSED_ID;
3441	d->hypot_cnt = 0;
3442	d->hypot_adjust_canon = false;
3443}
3444
3445static void btf_dedup_free(struct btf_dedup *d)
3446{
3447	hashmap__free(d->dedup_table);
3448	d->dedup_table = NULL;
3449
3450	free(d->map);
3451	d->map = NULL;
3452
3453	free(d->hypot_map);
3454	d->hypot_map = NULL;
3455
3456	free(d->hypot_list);
3457	d->hypot_list = NULL;
3458
3459	free(d);
3460}
3461
3462static size_t btf_dedup_identity_hash_fn(long key, void *ctx)
3463{
3464	return key;
3465}
3466
3467static size_t btf_dedup_collision_hash_fn(long key, void *ctx)
3468{
3469	return 0;
3470}
3471
3472static bool btf_dedup_equal_fn(long k1, long k2, void *ctx)
3473{
3474	return k1 == k2;
3475}
3476
3477static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts)
3478{
3479	struct btf_dedup *d = calloc(1, sizeof(struct btf_dedup));
3480	hashmap_hash_fn hash_fn = btf_dedup_identity_hash_fn;
3481	int i, err = 0, type_cnt;
3482
3483	if (!d)
3484		return ERR_PTR(-ENOMEM);
3485
3486	if (OPTS_GET(opts, force_collisions, false))
3487		hash_fn = btf_dedup_collision_hash_fn;
3488
3489	d->btf = btf;
3490	d->btf_ext = OPTS_GET(opts, btf_ext, NULL);
3491
3492	d->dedup_table = hashmap__new(hash_fn, btf_dedup_equal_fn, NULL);
3493	if (IS_ERR(d->dedup_table)) {
3494		err = PTR_ERR(d->dedup_table);
3495		d->dedup_table = NULL;
3496		goto done;
3497	}
3498
3499	type_cnt = btf__type_cnt(btf);
3500	d->map = malloc(sizeof(__u32) * type_cnt);
3501	if (!d->map) {
3502		err = -ENOMEM;
3503		goto done;
3504	}
3505	/* special BTF "void" type is made canonical immediately */
3506	d->map[0] = 0;
3507	for (i = 1; i < type_cnt; i++) {
3508		struct btf_type *t = btf_type_by_id(d->btf, i);
3509
3510		/* VAR and DATASEC are never deduped and are self-canonical */
3511		if (btf_is_var(t) || btf_is_datasec(t))
3512			d->map[i] = i;
3513		else
3514			d->map[i] = BTF_UNPROCESSED_ID;
3515	}
3516
3517	d->hypot_map = malloc(sizeof(__u32) * type_cnt);
3518	if (!d->hypot_map) {
3519		err = -ENOMEM;
3520		goto done;
3521	}
3522	for (i = 0; i < type_cnt; i++)
3523		d->hypot_map[i] = BTF_UNPROCESSED_ID;
3524
3525done:
3526	if (err) {
3527		btf_dedup_free(d);
3528		return ERR_PTR(err);
3529	}
3530
3531	return d;
3532}
3533
3534/*
3535 * Iterate over all possible places in .BTF and .BTF.ext that can reference
3536 * string and pass pointer to it to a provided callback `fn`.
3537 */
3538static int btf_for_each_str_off(struct btf_dedup *d, str_off_visit_fn fn, void *ctx)
3539{
3540	int i, r;
3541
3542	for (i = 0; i < d->btf->nr_types; i++) {
3543		struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
3544
3545		r = btf_type_visit_str_offs(t, fn, ctx);
3546		if (r)
3547			return r;
3548	}
3549
3550	if (!d->btf_ext)
3551		return 0;
3552
3553	r = btf_ext_visit_str_offs(d->btf_ext, fn, ctx);
3554	if (r)
3555		return r;
3556
3557	return 0;
3558}
3559
3560static int strs_dedup_remap_str_off(__u32 *str_off_ptr, void *ctx)
3561{
3562	struct btf_dedup *d = ctx;
3563	__u32 str_off = *str_off_ptr;
3564	const char *s;
3565	int off, err;
3566
3567	/* don't touch empty string or string in main BTF */
3568	if (str_off == 0 || str_off < d->btf->start_str_off)
3569		return 0;
3570
3571	s = btf__str_by_offset(d->btf, str_off);
3572	if (d->btf->base_btf) {
3573		err = btf__find_str(d->btf->base_btf, s);
3574		if (err >= 0) {
3575			*str_off_ptr = err;
3576			return 0;
3577		}
3578		if (err != -ENOENT)
3579			return err;
3580	}
3581
3582	off = strset__add_str(d->strs_set, s);
3583	if (off < 0)
3584		return off;
3585
3586	*str_off_ptr = d->btf->start_str_off + off;
3587	return 0;
3588}
3589
3590/*
3591 * Dedup string and filter out those that are not referenced from either .BTF
3592 * or .BTF.ext (if provided) sections.
3593 *
3594 * This is done by building index of all strings in BTF's string section,
3595 * then iterating over all entities that can reference strings (e.g., type
3596 * names, struct field names, .BTF.ext line info, etc) and marking corresponding
3597 * strings as used. After that all used strings are deduped and compacted into
3598 * sequential blob of memory and new offsets are calculated. Then all the string
3599 * references are iterated again and rewritten using new offsets.
3600 */
3601static int btf_dedup_strings(struct btf_dedup *d)
3602{
3603	int err;
3604
3605	if (d->btf->strs_deduped)
3606		return 0;
3607
3608	d->strs_set = strset__new(BTF_MAX_STR_OFFSET, NULL, 0);
3609	if (IS_ERR(d->strs_set)) {
3610		err = PTR_ERR(d->strs_set);
3611		goto err_out;
3612	}
3613
3614	if (!d->btf->base_btf) {
3615		/* insert empty string; we won't be looking it up during strings
3616		 * dedup, but it's good to have it for generic BTF string lookups
3617		 */
3618		err = strset__add_str(d->strs_set, "");
3619		if (err < 0)
3620			goto err_out;
3621	}
3622
3623	/* remap string offsets */
3624	err = btf_for_each_str_off(d, strs_dedup_remap_str_off, d);
3625	if (err)
3626		goto err_out;
3627
3628	/* replace BTF string data and hash with deduped ones */
3629	strset__free(d->btf->strs_set);
3630	d->btf->hdr->str_len = strset__data_size(d->strs_set);
3631	d->btf->strs_set = d->strs_set;
3632	d->strs_set = NULL;
3633	d->btf->strs_deduped = true;
3634	return 0;
3635
3636err_out:
3637	strset__free(d->strs_set);
3638	d->strs_set = NULL;
3639
3640	return err;
3641}
3642
3643static long btf_hash_common(struct btf_type *t)
3644{
3645	long h;
3646
3647	h = hash_combine(0, t->name_off);
3648	h = hash_combine(h, t->info);
3649	h = hash_combine(h, t->size);
3650	return h;
3651}
3652
3653static bool btf_equal_common(struct btf_type *t1, struct btf_type *t2)
3654{
3655	return t1->name_off == t2->name_off &&
3656	       t1->info == t2->info &&
3657	       t1->size == t2->size;
3658}
3659
3660/* Calculate type signature hash of INT or TAG. */
3661static long btf_hash_int_decl_tag(struct btf_type *t)
3662{
3663	__u32 info = *(__u32 *)(t + 1);
3664	long h;
3665
3666	h = btf_hash_common(t);
3667	h = hash_combine(h, info);
3668	return h;
3669}
3670
3671/* Check structural equality of two INTs or TAGs. */
3672static bool btf_equal_int_tag(struct btf_type *t1, struct btf_type *t2)
3673{
3674	__u32 info1, info2;
3675
3676	if (!btf_equal_common(t1, t2))
3677		return false;
3678	info1 = *(__u32 *)(t1 + 1);
3679	info2 = *(__u32 *)(t2 + 1);
3680	return info1 == info2;
3681}
3682
3683/* Calculate type signature hash of ENUM/ENUM64. */
3684static long btf_hash_enum(struct btf_type *t)
3685{
3686	long h;
3687
3688	/* don't hash vlen, enum members and size to support enum fwd resolving */
3689	h = hash_combine(0, t->name_off);
3690	return h;
3691}
3692
3693static bool btf_equal_enum_members(struct btf_type *t1, struct btf_type *t2)
3694{
3695	const struct btf_enum *m1, *m2;
3696	__u16 vlen;
3697	int i;
3698
3699	vlen = btf_vlen(t1);
3700	m1 = btf_enum(t1);
3701	m2 = btf_enum(t2);
3702	for (i = 0; i < vlen; i++) {
3703		if (m1->name_off != m2->name_off || m1->val != m2->val)
3704			return false;
3705		m1++;
3706		m2++;
3707	}
3708	return true;
3709}
3710
3711static bool btf_equal_enum64_members(struct btf_type *t1, struct btf_type *t2)
3712{
3713	const struct btf_enum64 *m1, *m2;
3714	__u16 vlen;
3715	int i;
3716
3717	vlen = btf_vlen(t1);
3718	m1 = btf_enum64(t1);
3719	m2 = btf_enum64(t2);
3720	for (i = 0; i < vlen; i++) {
3721		if (m1->name_off != m2->name_off || m1->val_lo32 != m2->val_lo32 ||
3722		    m1->val_hi32 != m2->val_hi32)
3723			return false;
3724		m1++;
3725		m2++;
3726	}
3727	return true;
3728}
3729
3730/* Check structural equality of two ENUMs or ENUM64s. */
3731static bool btf_equal_enum(struct btf_type *t1, struct btf_type *t2)
3732{
3733	if (!btf_equal_common(t1, t2))
3734		return false;
3735
3736	/* t1 & t2 kinds are identical because of btf_equal_common */
3737	if (btf_kind(t1) == BTF_KIND_ENUM)
3738		return btf_equal_enum_members(t1, t2);
3739	else
3740		return btf_equal_enum64_members(t1, t2);
3741}
3742
3743static inline bool btf_is_enum_fwd(struct btf_type *t)
3744{
3745	return btf_is_any_enum(t) && btf_vlen(t) == 0;
3746}
3747
3748static bool btf_compat_enum(struct btf_type *t1, struct btf_type *t2)
3749{
3750	if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2))
3751		return btf_equal_enum(t1, t2);
3752	/* At this point either t1 or t2 or both are forward declarations, thus:
3753	 * - skip comparing vlen because it is zero for forward declarations;
3754	 * - skip comparing size to allow enum forward declarations
3755	 *   to be compatible with enum64 full declarations;
3756	 * - skip comparing kind for the same reason.
3757	 */
3758	return t1->name_off == t2->name_off &&
3759	       btf_is_any_enum(t1) && btf_is_any_enum(t2);
3760}
3761
3762/*
3763 * Calculate type signature hash of STRUCT/UNION, ignoring referenced type IDs,
3764 * as referenced type IDs equivalence is established separately during type
3765 * graph equivalence check algorithm.
3766 */
3767static long btf_hash_struct(struct btf_type *t)
3768{
3769	const struct btf_member *member = btf_members(t);
3770	__u32 vlen = btf_vlen(t);
3771	long h = btf_hash_common(t);
3772	int i;
3773
3774	for (i = 0; i < vlen; i++) {
3775		h = hash_combine(h, member->name_off);
3776		h = hash_combine(h, member->offset);
3777		/* no hashing of referenced type ID, it can be unresolved yet */
3778		member++;
3779	}
3780	return h;
3781}
3782
3783/*
3784 * Check structural compatibility of two STRUCTs/UNIONs, ignoring referenced
3785 * type IDs. This check is performed during type graph equivalence check and
3786 * referenced types equivalence is checked separately.
3787 */
3788static bool btf_shallow_equal_struct(struct btf_type *t1, struct btf_type *t2)
3789{
3790	const struct btf_member *m1, *m2;
3791	__u16 vlen;
3792	int i;
3793
3794	if (!btf_equal_common(t1, t2))
3795		return false;
3796
3797	vlen = btf_vlen(t1);
3798	m1 = btf_members(t1);
3799	m2 = btf_members(t2);
3800	for (i = 0; i < vlen; i++) {
3801		if (m1->name_off != m2->name_off || m1->offset != m2->offset)
3802			return false;
3803		m1++;
3804		m2++;
3805	}
3806	return true;
3807}
3808
3809/*
3810 * Calculate type signature hash of ARRAY, including referenced type IDs,
3811 * under assumption that they were already resolved to canonical type IDs and
3812 * are not going to change.
3813 */
3814static long btf_hash_array(struct btf_type *t)
3815{
3816	const struct btf_array *info = btf_array(t);
3817	long h = btf_hash_common(t);
3818
3819	h = hash_combine(h, info->type);
3820	h = hash_combine(h, info->index_type);
3821	h = hash_combine(h, info->nelems);
3822	return h;
3823}
3824
3825/*
3826 * Check exact equality of two ARRAYs, taking into account referenced
3827 * type IDs, under assumption that they were already resolved to canonical
3828 * type IDs and are not going to change.
3829 * This function is called during reference types deduplication to compare
3830 * ARRAY to potential canonical representative.
3831 */
3832static bool btf_equal_array(struct btf_type *t1, struct btf_type *t2)
3833{
3834	const struct btf_array *info1, *info2;
3835
3836	if (!btf_equal_common(t1, t2))
3837		return false;
3838
3839	info1 = btf_array(t1);
3840	info2 = btf_array(t2);
3841	return info1->type == info2->type &&
3842	       info1->index_type == info2->index_type &&
3843	       info1->nelems == info2->nelems;
3844}
3845
3846/*
3847 * Check structural compatibility of two ARRAYs, ignoring referenced type
3848 * IDs. This check is performed during type graph equivalence check and
3849 * referenced types equivalence is checked separately.
3850 */
3851static bool btf_compat_array(struct btf_type *t1, struct btf_type *t2)
3852{
3853	if (!btf_equal_common(t1, t2))
3854		return false;
3855
3856	return btf_array(t1)->nelems == btf_array(t2)->nelems;
3857}
3858
3859/*
3860 * Calculate type signature hash of FUNC_PROTO, including referenced type IDs,
3861 * under assumption that they were already resolved to canonical type IDs and
3862 * are not going to change.
3863 */
3864static long btf_hash_fnproto(struct btf_type *t)
3865{
3866	const struct btf_param *member = btf_params(t);
3867	__u16 vlen = btf_vlen(t);
3868	long h = btf_hash_common(t);
3869	int i;
3870
3871	for (i = 0; i < vlen; i++) {
3872		h = hash_combine(h, member->name_off);
3873		h = hash_combine(h, member->type);
3874		member++;
3875	}
3876	return h;
3877}
3878
3879/*
3880 * Check exact equality of two FUNC_PROTOs, taking into account referenced
3881 * type IDs, under assumption that they were already resolved to canonical
3882 * type IDs and are not going to change.
3883 * This function is called during reference types deduplication to compare
3884 * FUNC_PROTO to potential canonical representative.
3885 */
3886static bool btf_equal_fnproto(struct btf_type *t1, struct btf_type *t2)
3887{
3888	const struct btf_param *m1, *m2;
3889	__u16 vlen;
3890	int i;
3891
3892	if (!btf_equal_common(t1, t2))
3893		return false;
3894
3895	vlen = btf_vlen(t1);
3896	m1 = btf_params(t1);
3897	m2 = btf_params(t2);
3898	for (i = 0; i < vlen; i++) {
3899		if (m1->name_off != m2->name_off || m1->type != m2->type)
3900			return false;
3901		m1++;
3902		m2++;
3903	}
3904	return true;
3905}
3906
3907/*
3908 * Check structural compatibility of two FUNC_PROTOs, ignoring referenced type
3909 * IDs. This check is performed during type graph equivalence check and
3910 * referenced types equivalence is checked separately.
3911 */
3912static bool btf_compat_fnproto(struct btf_type *t1, struct btf_type *t2)
3913{
3914	const struct btf_param *m1, *m2;
3915	__u16 vlen;
3916	int i;
3917
3918	/* skip return type ID */
3919	if (t1->name_off != t2->name_off || t1->info != t2->info)
3920		return false;
3921
3922	vlen = btf_vlen(t1);
3923	m1 = btf_params(t1);
3924	m2 = btf_params(t2);
3925	for (i = 0; i < vlen; i++) {
3926		if (m1->name_off != m2->name_off)
3927			return false;
3928		m1++;
3929		m2++;
3930	}
3931	return true;
3932}
3933
3934/* Prepare split BTF for deduplication by calculating hashes of base BTF's
3935 * types and initializing the rest of the state (canonical type mapping) for
3936 * the fixed base BTF part.
3937 */
3938static int btf_dedup_prep(struct btf_dedup *d)
3939{
3940	struct btf_type *t;
3941	int type_id;
3942	long h;
3943
3944	if (!d->btf->base_btf)
3945		return 0;
3946
3947	for (type_id = 1; type_id < d->btf->start_id; type_id++) {
3948		t = btf_type_by_id(d->btf, type_id);
3949
3950		/* all base BTF types are self-canonical by definition */
3951		d->map[type_id] = type_id;
3952
3953		switch (btf_kind(t)) {
3954		case BTF_KIND_VAR:
3955		case BTF_KIND_DATASEC:
3956			/* VAR and DATASEC are never hash/deduplicated */
3957			continue;
3958		case BTF_KIND_CONST:
3959		case BTF_KIND_VOLATILE:
3960		case BTF_KIND_RESTRICT:
3961		case BTF_KIND_PTR:
3962		case BTF_KIND_FWD:
3963		case BTF_KIND_TYPEDEF:
3964		case BTF_KIND_FUNC:
3965		case BTF_KIND_FLOAT:
3966		case BTF_KIND_TYPE_TAG:
3967			h = btf_hash_common(t);
3968			break;
3969		case BTF_KIND_INT:
3970		case BTF_KIND_DECL_TAG:
3971			h = btf_hash_int_decl_tag(t);
3972			break;
3973		case BTF_KIND_ENUM:
3974		case BTF_KIND_ENUM64:
3975			h = btf_hash_enum(t);
3976			break;
3977		case BTF_KIND_STRUCT:
3978		case BTF_KIND_UNION:
3979			h = btf_hash_struct(t);
3980			break;
3981		case BTF_KIND_ARRAY:
3982			h = btf_hash_array(t);
3983			break;
3984		case BTF_KIND_FUNC_PROTO:
3985			h = btf_hash_fnproto(t);
3986			break;
3987		default:
3988			pr_debug("unknown kind %d for type [%d]\n", btf_kind(t), type_id);
3989			return -EINVAL;
3990		}
3991		if (btf_dedup_table_add(d, h, type_id))
3992			return -ENOMEM;
3993	}
3994
3995	return 0;
3996}
3997
3998/*
3999 * Deduplicate primitive types, that can't reference other types, by calculating
4000 * their type signature hash and comparing them with any possible canonical
4001 * candidate. If no canonical candidate matches, type itself is marked as
4002 * canonical and is added into `btf_dedup->dedup_table` as another candidate.
4003 */
4004static int btf_dedup_prim_type(struct btf_dedup *d, __u32 type_id)
4005{
4006	struct btf_type *t = btf_type_by_id(d->btf, type_id);
4007	struct hashmap_entry *hash_entry;
4008	struct btf_type *cand;
4009	/* if we don't find equivalent type, then we are canonical */
4010	__u32 new_id = type_id;
4011	__u32 cand_id;
4012	long h;
4013
4014	switch (btf_kind(t)) {
4015	case BTF_KIND_CONST:
4016	case BTF_KIND_VOLATILE:
4017	case BTF_KIND_RESTRICT:
4018	case BTF_KIND_PTR:
4019	case BTF_KIND_TYPEDEF:
4020	case BTF_KIND_ARRAY:
4021	case BTF_KIND_STRUCT:
4022	case BTF_KIND_UNION:
4023	case BTF_KIND_FUNC:
4024	case BTF_KIND_FUNC_PROTO:
4025	case BTF_KIND_VAR:
4026	case BTF_KIND_DATASEC:
4027	case BTF_KIND_DECL_TAG:
4028	case BTF_KIND_TYPE_TAG:
4029		return 0;
4030
4031	case BTF_KIND_INT:
4032		h = btf_hash_int_decl_tag(t);
4033		for_each_dedup_cand(d, hash_entry, h) {
4034			cand_id = hash_entry->value;
4035			cand = btf_type_by_id(d->btf, cand_id);
4036			if (btf_equal_int_tag(t, cand)) {
4037				new_id = cand_id;
4038				break;
4039			}
4040		}
4041		break;
4042
4043	case BTF_KIND_ENUM:
4044	case BTF_KIND_ENUM64:
4045		h = btf_hash_enum(t);
4046		for_each_dedup_cand(d, hash_entry, h) {
4047			cand_id = hash_entry->value;
4048			cand = btf_type_by_id(d->btf, cand_id);
4049			if (btf_equal_enum(t, cand)) {
4050				new_id = cand_id;
4051				break;
4052			}
4053			if (btf_compat_enum(t, cand)) {
4054				if (btf_is_enum_fwd(t)) {
4055					/* resolve fwd to full enum */
4056					new_id = cand_id;
4057					break;
4058				}
4059				/* resolve canonical enum fwd to full enum */
4060				d->map[cand_id] = type_id;
4061			}
4062		}
4063		break;
4064
4065	case BTF_KIND_FWD:
4066	case BTF_KIND_FLOAT:
4067		h = btf_hash_common(t);
4068		for_each_dedup_cand(d, hash_entry, h) {
4069			cand_id = hash_entry->value;
4070			cand = btf_type_by_id(d->btf, cand_id);
4071			if (btf_equal_common(t, cand)) {
4072				new_id = cand_id;
4073				break;
4074			}
4075		}
4076		break;
4077
4078	default:
4079		return -EINVAL;
4080	}
4081
4082	d->map[type_id] = new_id;
4083	if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4084		return -ENOMEM;
4085
4086	return 0;
4087}
4088
4089static int btf_dedup_prim_types(struct btf_dedup *d)
4090{
4091	int i, err;
4092
4093	for (i = 0; i < d->btf->nr_types; i++) {
4094		err = btf_dedup_prim_type(d, d->btf->start_id + i);
4095		if (err)
4096			return err;
4097	}
4098	return 0;
4099}
4100
4101/*
4102 * Check whether type is already mapped into canonical one (could be to itself).
4103 */
4104static inline bool is_type_mapped(struct btf_dedup *d, uint32_t type_id)
4105{
4106	return d->map[type_id] <= BTF_MAX_NR_TYPES;
4107}
4108
4109/*
4110 * Resolve type ID into its canonical type ID, if any; otherwise return original
4111 * type ID. If type is FWD and is resolved into STRUCT/UNION already, follow
4112 * STRUCT/UNION link and resolve it into canonical type ID as well.
4113 */
4114static inline __u32 resolve_type_id(struct btf_dedup *d, __u32 type_id)
4115{
4116	while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
4117		type_id = d->map[type_id];
4118	return type_id;
4119}
4120
4121/*
4122 * Resolve FWD to underlying STRUCT/UNION, if any; otherwise return original
4123 * type ID.
4124 */
4125static uint32_t resolve_fwd_id(struct btf_dedup *d, uint32_t type_id)
4126{
4127	__u32 orig_type_id = type_id;
4128
4129	if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
4130		return type_id;
4131
4132	while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
4133		type_id = d->map[type_id];
4134
4135	if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
4136		return type_id;
4137
4138	return orig_type_id;
4139}
4140
4141
4142static inline __u16 btf_fwd_kind(struct btf_type *t)
4143{
4144	return btf_kflag(t) ? BTF_KIND_UNION : BTF_KIND_STRUCT;
4145}
4146
4147/* Check if given two types are identical ARRAY definitions */
4148static bool btf_dedup_identical_arrays(struct btf_dedup *d, __u32 id1, __u32 id2)
4149{
4150	struct btf_type *t1, *t2;
4151
4152	t1 = btf_type_by_id(d->btf, id1);
4153	t2 = btf_type_by_id(d->btf, id2);
4154	if (!btf_is_array(t1) || !btf_is_array(t2))
4155		return false;
4156
4157	return btf_equal_array(t1, t2);
4158}
4159
4160/* Check if given two types are identical STRUCT/UNION definitions */
4161static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id2)
4162{
4163	const struct btf_member *m1, *m2;
4164	struct btf_type *t1, *t2;
4165	int n, i;
4166
4167	t1 = btf_type_by_id(d->btf, id1);
4168	t2 = btf_type_by_id(d->btf, id2);
4169
4170	if (!btf_is_composite(t1) || btf_kind(t1) != btf_kind(t2))
4171		return false;
4172
4173	if (!btf_shallow_equal_struct(t1, t2))
4174		return false;
4175
4176	m1 = btf_members(t1);
4177	m2 = btf_members(t2);
4178	for (i = 0, n = btf_vlen(t1); i < n; i++, m1++, m2++) {
4179		if (m1->type != m2->type &&
4180		    !btf_dedup_identical_arrays(d, m1->type, m2->type) &&
4181		    !btf_dedup_identical_structs(d, m1->type, m2->type))
4182			return false;
4183	}
4184	return true;
4185}
4186
4187/*
4188 * Check equivalence of BTF type graph formed by candidate struct/union (we'll
4189 * call it "candidate graph" in this description for brevity) to a type graph
4190 * formed by (potential) canonical struct/union ("canonical graph" for brevity
4191 * here, though keep in mind that not all types in canonical graph are
4192 * necessarily canonical representatives themselves, some of them might be
4193 * duplicates or its uniqueness might not have been established yet).
4194 * Returns:
4195 *  - >0, if type graphs are equivalent;
4196 *  -  0, if not equivalent;
4197 *  - <0, on error.
4198 *
4199 * Algorithm performs side-by-side DFS traversal of both type graphs and checks
4200 * equivalence of BTF types at each step. If at any point BTF types in candidate
4201 * and canonical graphs are not compatible structurally, whole graphs are
4202 * incompatible. If types are structurally equivalent (i.e., all information
4203 * except referenced type IDs is exactly the same), a mapping from `canon_id` to
4204 * a `cand_id` is recored in hypothetical mapping (`btf_dedup->hypot_map`).
4205 * If a type references other types, then those referenced types are checked
4206 * for equivalence recursively.
4207 *
4208 * During DFS traversal, if we find that for current `canon_id` type we
4209 * already have some mapping in hypothetical map, we check for two possible
4210 * situations:
4211 *   - `canon_id` is mapped to exactly the same type as `cand_id`. This will
4212 *     happen when type graphs have cycles. In this case we assume those two
4213 *     types are equivalent.
4214 *   - `canon_id` is mapped to different type. This is contradiction in our
4215 *     hypothetical mapping, because same graph in canonical graph corresponds
4216 *     to two different types in candidate graph, which for equivalent type
4217 *     graphs shouldn't happen. This condition terminates equivalence check
4218 *     with negative result.
4219 *
4220 * If type graphs traversal exhausts types to check and find no contradiction,
4221 * then type graphs are equivalent.
4222 *
4223 * When checking types for equivalence, there is one special case: FWD types.
4224 * If FWD type resolution is allowed and one of the types (either from canonical
4225 * or candidate graph) is FWD and other is STRUCT/UNION (depending on FWD's kind
4226 * flag) and their names match, hypothetical mapping is updated to point from
4227 * FWD to STRUCT/UNION. If graphs will be determined as equivalent successfully,
4228 * this mapping will be used to record FWD -> STRUCT/UNION mapping permanently.
4229 *
4230 * Technically, this could lead to incorrect FWD to STRUCT/UNION resolution,
4231 * if there are two exactly named (or anonymous) structs/unions that are
4232 * compatible structurally, one of which has FWD field, while other is concrete
4233 * STRUCT/UNION, but according to C sources they are different structs/unions
4234 * that are referencing different types with the same name. This is extremely
4235 * unlikely to happen, but btf_dedup API allows to disable FWD resolution if
4236 * this logic is causing problems.
4237 *
4238 * Doing FWD resolution means that both candidate and/or canonical graphs can
4239 * consists of portions of the graph that come from multiple compilation units.
4240 * This is due to the fact that types within single compilation unit are always
4241 * deduplicated and FWDs are already resolved, if referenced struct/union
4242 * definiton is available. So, if we had unresolved FWD and found corresponding
4243 * STRUCT/UNION, they will be from different compilation units. This
4244 * consequently means that when we "link" FWD to corresponding STRUCT/UNION,
4245 * type graph will likely have at least two different BTF types that describe
4246 * same type (e.g., most probably there will be two different BTF types for the
4247 * same 'int' primitive type) and could even have "overlapping" parts of type
4248 * graph that describe same subset of types.
4249 *
4250 * This in turn means that our assumption that each type in canonical graph
4251 * must correspond to exactly one type in candidate graph might not hold
4252 * anymore and will make it harder to detect contradictions using hypothetical
4253 * map. To handle this problem, we allow to follow FWD -> STRUCT/UNION
4254 * resolution only in canonical graph. FWDs in candidate graphs are never
4255 * resolved. To see why it's OK, let's check all possible situations w.r.t. FWDs
4256 * that can occur:
4257 *   - Both types in canonical and candidate graphs are FWDs. If they are
4258 *     structurally equivalent, then they can either be both resolved to the
4259 *     same STRUCT/UNION or not resolved at all. In both cases they are
4260 *     equivalent and there is no need to resolve FWD on candidate side.
4261 *   - Both types in canonical and candidate graphs are concrete STRUCT/UNION,
4262 *     so nothing to resolve as well, algorithm will check equivalence anyway.
4263 *   - Type in canonical graph is FWD, while type in candidate is concrete
4264 *     STRUCT/UNION. In this case candidate graph comes from single compilation
4265 *     unit, so there is exactly one BTF type for each unique C type. After
4266 *     resolving FWD into STRUCT/UNION, there might be more than one BTF type
4267 *     in canonical graph mapping to single BTF type in candidate graph, but
4268 *     because hypothetical mapping maps from canonical to candidate types, it's
4269 *     alright, and we still maintain the property of having single `canon_id`
4270 *     mapping to single `cand_id` (there could be two different `canon_id`
4271 *     mapped to the same `cand_id`, but it's not contradictory).
4272 *   - Type in canonical graph is concrete STRUCT/UNION, while type in candidate
4273 *     graph is FWD. In this case we are just going to check compatibility of
4274 *     STRUCT/UNION and corresponding FWD, and if they are compatible, we'll
4275 *     assume that whatever STRUCT/UNION FWD resolves to must be equivalent to
4276 *     a concrete STRUCT/UNION from canonical graph. If the rest of type graphs
4277 *     turn out equivalent, we'll re-resolve FWD to concrete STRUCT/UNION from
4278 *     canonical graph.
4279 */
4280static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id,
4281			      __u32 canon_id)
4282{
4283	struct btf_type *cand_type;
4284	struct btf_type *canon_type;
4285	__u32 hypot_type_id;
4286	__u16 cand_kind;
4287	__u16 canon_kind;
4288	int i, eq;
4289
4290	/* if both resolve to the same canonical, they must be equivalent */
4291	if (resolve_type_id(d, cand_id) == resolve_type_id(d, canon_id))
4292		return 1;
4293
4294	canon_id = resolve_fwd_id(d, canon_id);
4295
4296	hypot_type_id = d->hypot_map[canon_id];
4297	if (hypot_type_id <= BTF_MAX_NR_TYPES) {
4298		if (hypot_type_id == cand_id)
4299			return 1;
4300		/* In some cases compiler will generate different DWARF types
4301		 * for *identical* array type definitions and use them for
4302		 * different fields within the *same* struct. This breaks type
4303		 * equivalence check, which makes an assumption that candidate
4304		 * types sub-graph has a consistent and deduped-by-compiler
4305		 * types within a single CU. So work around that by explicitly
4306		 * allowing identical array types here.
4307		 */
4308		if (btf_dedup_identical_arrays(d, hypot_type_id, cand_id))
4309			return 1;
4310		/* It turns out that similar situation can happen with
4311		 * struct/union sometimes, sigh... Handle the case where
4312		 * structs/unions are exactly the same, down to the referenced
4313		 * type IDs. Anything more complicated (e.g., if referenced
4314		 * types are different, but equivalent) is *way more*
4315		 * complicated and requires a many-to-many equivalence mapping.
4316		 */
4317		if (btf_dedup_identical_structs(d, hypot_type_id, cand_id))
4318			return 1;
4319		return 0;
4320	}
4321
4322	if (btf_dedup_hypot_map_add(d, canon_id, cand_id))
4323		return -ENOMEM;
4324
4325	cand_type = btf_type_by_id(d->btf, cand_id);
4326	canon_type = btf_type_by_id(d->btf, canon_id);
4327	cand_kind = btf_kind(cand_type);
4328	canon_kind = btf_kind(canon_type);
4329
4330	if (cand_type->name_off != canon_type->name_off)
4331		return 0;
4332
4333	/* FWD <--> STRUCT/UNION equivalence check, if enabled */
4334	if ((cand_kind == BTF_KIND_FWD || canon_kind == BTF_KIND_FWD)
4335	    && cand_kind != canon_kind) {
4336		__u16 real_kind;
4337		__u16 fwd_kind;
4338
4339		if (cand_kind == BTF_KIND_FWD) {
4340			real_kind = canon_kind;
4341			fwd_kind = btf_fwd_kind(cand_type);
4342		} else {
4343			real_kind = cand_kind;
4344			fwd_kind = btf_fwd_kind(canon_type);
4345			/* we'd need to resolve base FWD to STRUCT/UNION */
4346			if (fwd_kind == real_kind && canon_id < d->btf->start_id)
4347				d->hypot_adjust_canon = true;
4348		}
4349		return fwd_kind == real_kind;
4350	}
4351
4352	if (cand_kind != canon_kind)
4353		return 0;
4354
4355	switch (cand_kind) {
4356	case BTF_KIND_INT:
4357		return btf_equal_int_tag(cand_type, canon_type);
4358
4359	case BTF_KIND_ENUM:
4360	case BTF_KIND_ENUM64:
4361		return btf_compat_enum(cand_type, canon_type);
4362
4363	case BTF_KIND_FWD:
4364	case BTF_KIND_FLOAT:
4365		return btf_equal_common(cand_type, canon_type);
4366
4367	case BTF_KIND_CONST:
4368	case BTF_KIND_VOLATILE:
4369	case BTF_KIND_RESTRICT:
4370	case BTF_KIND_PTR:
4371	case BTF_KIND_TYPEDEF:
4372	case BTF_KIND_FUNC:
4373	case BTF_KIND_TYPE_TAG:
4374		if (cand_type->info != canon_type->info)
4375			return 0;
4376		return btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4377
4378	case BTF_KIND_ARRAY: {
4379		const struct btf_array *cand_arr, *canon_arr;
4380
4381		if (!btf_compat_array(cand_type, canon_type))
4382			return 0;
4383		cand_arr = btf_array(cand_type);
4384		canon_arr = btf_array(canon_type);
4385		eq = btf_dedup_is_equiv(d, cand_arr->index_type, canon_arr->index_type);
4386		if (eq <= 0)
4387			return eq;
4388		return btf_dedup_is_equiv(d, cand_arr->type, canon_arr->type);
4389	}
4390
4391	case BTF_KIND_STRUCT:
4392	case BTF_KIND_UNION: {
4393		const struct btf_member *cand_m, *canon_m;
4394		__u16 vlen;
4395
4396		if (!btf_shallow_equal_struct(cand_type, canon_type))
4397			return 0;
4398		vlen = btf_vlen(cand_type);
4399		cand_m = btf_members(cand_type);
4400		canon_m = btf_members(canon_type);
4401		for (i = 0; i < vlen; i++) {
4402			eq = btf_dedup_is_equiv(d, cand_m->type, canon_m->type);
4403			if (eq <= 0)
4404				return eq;
4405			cand_m++;
4406			canon_m++;
4407		}
4408
4409		return 1;
4410	}
4411
4412	case BTF_KIND_FUNC_PROTO: {
4413		const struct btf_param *cand_p, *canon_p;
4414		__u16 vlen;
4415
4416		if (!btf_compat_fnproto(cand_type, canon_type))
4417			return 0;
4418		eq = btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4419		if (eq <= 0)
4420			return eq;
4421		vlen = btf_vlen(cand_type);
4422		cand_p = btf_params(cand_type);
4423		canon_p = btf_params(canon_type);
4424		for (i = 0; i < vlen; i++) {
4425			eq = btf_dedup_is_equiv(d, cand_p->type, canon_p->type);
4426			if (eq <= 0)
4427				return eq;
4428			cand_p++;
4429			canon_p++;
4430		}
4431		return 1;
4432	}
4433
4434	default:
4435		return -EINVAL;
4436	}
4437	return 0;
4438}
4439
4440/*
4441 * Use hypothetical mapping, produced by successful type graph equivalence
4442 * check, to augment existing struct/union canonical mapping, where possible.
4443 *
4444 * If BTF_KIND_FWD resolution is allowed, this mapping is also used to record
4445 * FWD -> STRUCT/UNION correspondence as well. FWD resolution is bidirectional:
4446 * it doesn't matter if FWD type was part of canonical graph or candidate one,
4447 * we are recording the mapping anyway. As opposed to carefulness required
4448 * for struct/union correspondence mapping (described below), for FWD resolution
4449 * it's not important, as by the time that FWD type (reference type) will be
4450 * deduplicated all structs/unions will be deduped already anyway.
4451 *
4452 * Recording STRUCT/UNION mapping is purely a performance optimization and is
4453 * not required for correctness. It needs to be done carefully to ensure that
4454 * struct/union from candidate's type graph is not mapped into corresponding
4455 * struct/union from canonical type graph that itself hasn't been resolved into
4456 * canonical representative. The only guarantee we have is that canonical
4457 * struct/union was determined as canonical and that won't change. But any
4458 * types referenced through that struct/union fields could have been not yet
4459 * resolved, so in case like that it's too early to establish any kind of
4460 * correspondence between structs/unions.
4461 *
4462 * No canonical correspondence is derived for primitive types (they are already
4463 * deduplicated completely already anyway) or reference types (they rely on
4464 * stability of struct/union canonical relationship for equivalence checks).
4465 */
4466static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
4467{
4468	__u32 canon_type_id, targ_type_id;
4469	__u16 t_kind, c_kind;
4470	__u32 t_id, c_id;
4471	int i;
4472
4473	for (i = 0; i < d->hypot_cnt; i++) {
4474		canon_type_id = d->hypot_list[i];
4475		targ_type_id = d->hypot_map[canon_type_id];
4476		t_id = resolve_type_id(d, targ_type_id);
4477		c_id = resolve_type_id(d, canon_type_id);
4478		t_kind = btf_kind(btf__type_by_id(d->btf, t_id));
4479		c_kind = btf_kind(btf__type_by_id(d->btf, c_id));
4480		/*
4481		 * Resolve FWD into STRUCT/UNION.
4482		 * It's ok to resolve FWD into STRUCT/UNION that's not yet
4483		 * mapped to canonical representative (as opposed to
4484		 * STRUCT/UNION <--> STRUCT/UNION mapping logic below), because
4485		 * eventually that struct is going to be mapped and all resolved
4486		 * FWDs will automatically resolve to correct canonical
4487		 * representative. This will happen before ref type deduping,
4488		 * which critically depends on stability of these mapping. This
4489		 * stability is not a requirement for STRUCT/UNION equivalence
4490		 * checks, though.
4491		 */
4492
4493		/* if it's the split BTF case, we still need to point base FWD
4494		 * to STRUCT/UNION in a split BTF, because FWDs from split BTF
4495		 * will be resolved against base FWD. If we don't point base
4496		 * canonical FWD to the resolved STRUCT/UNION, then all the
4497		 * FWDs in split BTF won't be correctly resolved to a proper
4498		 * STRUCT/UNION.
4499		 */
4500		if (t_kind != BTF_KIND_FWD && c_kind == BTF_KIND_FWD)
4501			d->map[c_id] = t_id;
4502
4503		/* if graph equivalence determined that we'd need to adjust
4504		 * base canonical types, then we need to only point base FWDs
4505		 * to STRUCTs/UNIONs and do no more modifications. For all
4506		 * other purposes the type graphs were not equivalent.
4507		 */
4508		if (d->hypot_adjust_canon)
4509			continue;
4510
4511		if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
4512			d->map[t_id] = c_id;
4513
4514		if ((t_kind == BTF_KIND_STRUCT || t_kind == BTF_KIND_UNION) &&
4515		    c_kind != BTF_KIND_FWD &&
4516		    is_type_mapped(d, c_id) &&
4517		    !is_type_mapped(d, t_id)) {
4518			/*
4519			 * as a perf optimization, we can map struct/union
4520			 * that's part of type graph we just verified for
4521			 * equivalence. We can do that for struct/union that has
4522			 * canonical representative only, though.
4523			 */
4524			d->map[t_id] = c_id;
4525		}
4526	}
4527}
4528
4529/*
4530 * Deduplicate struct/union types.
4531 *
4532 * For each struct/union type its type signature hash is calculated, taking
4533 * into account type's name, size, number, order and names of fields, but
4534 * ignoring type ID's referenced from fields, because they might not be deduped
4535 * completely until after reference types deduplication phase. This type hash
4536 * is used to iterate over all potential canonical types, sharing same hash.
4537 * For each canonical candidate we check whether type graphs that they form
4538 * (through referenced types in fields and so on) are equivalent using algorithm
4539 * implemented in `btf_dedup_is_equiv`. If such equivalence is found and
4540 * BTF_KIND_FWD resolution is allowed, then hypothetical mapping
4541 * (btf_dedup->hypot_map) produced by aforementioned type graph equivalence
4542 * algorithm is used to record FWD -> STRUCT/UNION mapping. It's also used to
4543 * potentially map other structs/unions to their canonical representatives,
4544 * if such relationship hasn't yet been established. This speeds up algorithm
4545 * by eliminating some of the duplicate work.
4546 *
4547 * If no matching canonical representative was found, struct/union is marked
4548 * as canonical for itself and is added into btf_dedup->dedup_table hash map
4549 * for further look ups.
4550 */
4551static int btf_dedup_struct_type(struct btf_dedup *d, __u32 type_id)
4552{
4553	struct btf_type *cand_type, *t;
4554	struct hashmap_entry *hash_entry;
4555	/* if we don't find equivalent type, then we are canonical */
4556	__u32 new_id = type_id;
4557	__u16 kind;
4558	long h;
4559
4560	/* already deduped or is in process of deduping (loop detected) */
4561	if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4562		return 0;
4563
4564	t = btf_type_by_id(d->btf, type_id);
4565	kind = btf_kind(t);
4566
4567	if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION)
4568		return 0;
4569
4570	h = btf_hash_struct(t);
4571	for_each_dedup_cand(d, hash_entry, h) {
4572		__u32 cand_id = hash_entry->value;
4573		int eq;
4574
4575		/*
4576		 * Even though btf_dedup_is_equiv() checks for
4577		 * btf_shallow_equal_struct() internally when checking two
4578		 * structs (unions) for equivalence, we need to guard here
4579		 * from picking matching FWD type as a dedup candidate.
4580		 * This can happen due to hash collision. In such case just
4581		 * relying on btf_dedup_is_equiv() would lead to potentially
4582		 * creating a loop (FWD -> STRUCT and STRUCT -> FWD), because
4583		 * FWD and compatible STRUCT/UNION are considered equivalent.
4584		 */
4585		cand_type = btf_type_by_id(d->btf, cand_id);
4586		if (!btf_shallow_equal_struct(t, cand_type))
4587			continue;
4588
4589		btf_dedup_clear_hypot_map(d);
4590		eq = btf_dedup_is_equiv(d, type_id, cand_id);
4591		if (eq < 0)
4592			return eq;
4593		if (!eq)
4594			continue;
4595		btf_dedup_merge_hypot_map(d);
4596		if (d->hypot_adjust_canon) /* not really equivalent */
4597			continue;
4598		new_id = cand_id;
4599		break;
4600	}
4601
4602	d->map[type_id] = new_id;
4603	if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4604		return -ENOMEM;
4605
4606	return 0;
4607}
4608
4609static int btf_dedup_struct_types(struct btf_dedup *d)
4610{
4611	int i, err;
4612
4613	for (i = 0; i < d->btf->nr_types; i++) {
4614		err = btf_dedup_struct_type(d, d->btf->start_id + i);
4615		if (err)
4616			return err;
4617	}
4618	return 0;
4619}
4620
4621/*
4622 * Deduplicate reference type.
4623 *
4624 * Once all primitive and struct/union types got deduplicated, we can easily
4625 * deduplicate all other (reference) BTF types. This is done in two steps:
4626 *
4627 * 1. Resolve all referenced type IDs into their canonical type IDs. This
4628 * resolution can be done either immediately for primitive or struct/union types
4629 * (because they were deduped in previous two phases) or recursively for
4630 * reference types. Recursion will always terminate at either primitive or
4631 * struct/union type, at which point we can "unwind" chain of reference types
4632 * one by one. There is no danger of encountering cycles because in C type
4633 * system the only way to form type cycle is through struct/union, so any chain
4634 * of reference types, even those taking part in a type cycle, will inevitably
4635 * reach struct/union at some point.
4636 *
4637 * 2. Once all referenced type IDs are resolved into canonical ones, BTF type
4638 * becomes "stable", in the sense that no further deduplication will cause
4639 * any changes to it. With that, it's now possible to calculate type's signature
4640 * hash (this time taking into account referenced type IDs) and loop over all
4641 * potential canonical representatives. If no match was found, current type
4642 * will become canonical representative of itself and will be added into
4643 * btf_dedup->dedup_table as another possible canonical representative.
4644 */
4645static int btf_dedup_ref_type(struct btf_dedup *d, __u32 type_id)
4646{
4647	struct hashmap_entry *hash_entry;
4648	__u32 new_id = type_id, cand_id;
4649	struct btf_type *t, *cand;
4650	/* if we don't find equivalent type, then we are representative type */
4651	int ref_type_id;
4652	long h;
4653
4654	if (d->map[type_id] == BTF_IN_PROGRESS_ID)
4655		return -ELOOP;
4656	if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4657		return resolve_type_id(d, type_id);
4658
4659	t = btf_type_by_id(d->btf, type_id);
4660	d->map[type_id] = BTF_IN_PROGRESS_ID;
4661
4662	switch (btf_kind(t)) {
4663	case BTF_KIND_CONST:
4664	case BTF_KIND_VOLATILE:
4665	case BTF_KIND_RESTRICT:
4666	case BTF_KIND_PTR:
4667	case BTF_KIND_TYPEDEF:
4668	case BTF_KIND_FUNC:
4669	case BTF_KIND_TYPE_TAG:
4670		ref_type_id = btf_dedup_ref_type(d, t->type);
4671		if (ref_type_id < 0)
4672			return ref_type_id;
4673		t->type = ref_type_id;
4674
4675		h = btf_hash_common(t);
4676		for_each_dedup_cand(d, hash_entry, h) {
4677			cand_id = hash_entry->value;
4678			cand = btf_type_by_id(d->btf, cand_id);
4679			if (btf_equal_common(t, cand)) {
4680				new_id = cand_id;
4681				break;
4682			}
4683		}
4684		break;
4685
4686	case BTF_KIND_DECL_TAG:
4687		ref_type_id = btf_dedup_ref_type(d, t->type);
4688		if (ref_type_id < 0)
4689			return ref_type_id;
4690		t->type = ref_type_id;
4691
4692		h = btf_hash_int_decl_tag(t);
4693		for_each_dedup_cand(d, hash_entry, h) {
4694			cand_id = hash_entry->value;
4695			cand = btf_type_by_id(d->btf, cand_id);
4696			if (btf_equal_int_tag(t, cand)) {
4697				new_id = cand_id;
4698				break;
4699			}
4700		}
4701		break;
4702
4703	case BTF_KIND_ARRAY: {
4704		struct btf_array *info = btf_array(t);
4705
4706		ref_type_id = btf_dedup_ref_type(d, info->type);
4707		if (ref_type_id < 0)
4708			return ref_type_id;
4709		info->type = ref_type_id;
4710
4711		ref_type_id = btf_dedup_ref_type(d, info->index_type);
4712		if (ref_type_id < 0)
4713			return ref_type_id;
4714		info->index_type = ref_type_id;
4715
4716		h = btf_hash_array(t);
4717		for_each_dedup_cand(d, hash_entry, h) {
4718			cand_id = hash_entry->value;
4719			cand = btf_type_by_id(d->btf, cand_id);
4720			if (btf_equal_array(t, cand)) {
4721				new_id = cand_id;
4722				break;
4723			}
4724		}
4725		break;
4726	}
4727
4728	case BTF_KIND_FUNC_PROTO: {
4729		struct btf_param *param;
4730		__u16 vlen;
4731		int i;
4732
4733		ref_type_id = btf_dedup_ref_type(d, t->type);
4734		if (ref_type_id < 0)
4735			return ref_type_id;
4736		t->type = ref_type_id;
4737
4738		vlen = btf_vlen(t);
4739		param = btf_params(t);
4740		for (i = 0; i < vlen; i++) {
4741			ref_type_id = btf_dedup_ref_type(d, param->type);
4742			if (ref_type_id < 0)
4743				return ref_type_id;
4744			param->type = ref_type_id;
4745			param++;
4746		}
4747
4748		h = btf_hash_fnproto(t);
4749		for_each_dedup_cand(d, hash_entry, h) {
4750			cand_id = hash_entry->value;
4751			cand = btf_type_by_id(d->btf, cand_id);
4752			if (btf_equal_fnproto(t, cand)) {
4753				new_id = cand_id;
4754				break;
4755			}
4756		}
4757		break;
4758	}
4759
4760	default:
4761		return -EINVAL;
4762	}
4763
4764	d->map[type_id] = new_id;
4765	if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4766		return -ENOMEM;
4767
4768	return new_id;
4769}
4770
4771static int btf_dedup_ref_types(struct btf_dedup *d)
4772{
4773	int i, err;
4774
4775	for (i = 0; i < d->btf->nr_types; i++) {
4776		err = btf_dedup_ref_type(d, d->btf->start_id + i);
4777		if (err < 0)
4778			return err;
4779	}
4780	/* we won't need d->dedup_table anymore */
4781	hashmap__free(d->dedup_table);
4782	d->dedup_table = NULL;
4783	return 0;
4784}
4785
4786/*
4787 * Collect a map from type names to type ids for all canonical structs
4788 * and unions. If the same name is shared by several canonical types
4789 * use a special value 0 to indicate this fact.
4790 */
4791static int btf_dedup_fill_unique_names_map(struct btf_dedup *d, struct hashmap *names_map)
4792{
4793	__u32 nr_types = btf__type_cnt(d->btf);
4794	struct btf_type *t;
4795	__u32 type_id;
4796	__u16 kind;
4797	int err;
4798
4799	/*
4800	 * Iterate over base and split module ids in order to get all
4801	 * available structs in the map.
4802	 */
4803	for (type_id = 1; type_id < nr_types; ++type_id) {
4804		t = btf_type_by_id(d->btf, type_id);
4805		kind = btf_kind(t);
4806
4807		if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION)
4808			continue;
4809
4810		/* Skip non-canonical types */
4811		if (type_id != d->map[type_id])
4812			continue;
4813
4814		err = hashmap__add(names_map, t->name_off, type_id);
4815		if (err == -EEXIST)
4816			err = hashmap__set(names_map, t->name_off, 0, NULL, NULL);
4817
4818		if (err)
4819			return err;
4820	}
4821
4822	return 0;
4823}
4824
4825static int btf_dedup_resolve_fwd(struct btf_dedup *d, struct hashmap *names_map, __u32 type_id)
4826{
4827	struct btf_type *t = btf_type_by_id(d->btf, type_id);
4828	enum btf_fwd_kind fwd_kind = btf_kflag(t);
4829	__u16 cand_kind, kind = btf_kind(t);
4830	struct btf_type *cand_t;
4831	uintptr_t cand_id;
4832
4833	if (kind != BTF_KIND_FWD)
4834		return 0;
4835
4836	/* Skip if this FWD already has a mapping */
4837	if (type_id != d->map[type_id])
4838		return 0;
4839
4840	if (!hashmap__find(names_map, t->name_off, &cand_id))
4841		return 0;
4842
4843	/* Zero is a special value indicating that name is not unique */
4844	if (!cand_id)
4845		return 0;
4846
4847	cand_t = btf_type_by_id(d->btf, cand_id);
4848	cand_kind = btf_kind(cand_t);
4849	if ((cand_kind == BTF_KIND_STRUCT && fwd_kind != BTF_FWD_STRUCT) ||
4850	    (cand_kind == BTF_KIND_UNION && fwd_kind != BTF_FWD_UNION))
4851		return 0;
4852
4853	d->map[type_id] = cand_id;
4854
4855	return 0;
4856}
4857
4858/*
4859 * Resolve unambiguous forward declarations.
4860 *
4861 * The lion's share of all FWD declarations is resolved during
4862 * `btf_dedup_struct_types` phase when different type graphs are
4863 * compared against each other. However, if in some compilation unit a
4864 * FWD declaration is not a part of a type graph compared against
4865 * another type graph that declaration's canonical type would not be
4866 * changed. Example:
4867 *
4868 * CU #1:
4869 *
4870 * struct foo;
4871 * struct foo *some_global;
4872 *
4873 * CU #2:
4874 *
4875 * struct foo { int u; };
4876 * struct foo *another_global;
4877 *
4878 * After `btf_dedup_struct_types` the BTF looks as follows:
4879 *
4880 * [1] STRUCT 'foo' size=4 vlen=1 ...
4881 * [2] INT 'int' size=4 ...
4882 * [3] PTR '(anon)' type_id=1
4883 * [4] FWD 'foo' fwd_kind=struct
4884 * [5] PTR '(anon)' type_id=4
4885 *
4886 * This pass assumes that such FWD declarations should be mapped to
4887 * structs or unions with identical name in case if the name is not
4888 * ambiguous.
4889 */
4890static int btf_dedup_resolve_fwds(struct btf_dedup *d)
4891{
4892	int i, err;
4893	struct hashmap *names_map;
4894
4895	names_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL);
4896	if (IS_ERR(names_map))
4897		return PTR_ERR(names_map);
4898
4899	err = btf_dedup_fill_unique_names_map(d, names_map);
4900	if (err < 0)
4901		goto exit;
4902
4903	for (i = 0; i < d->btf->nr_types; i++) {
4904		err = btf_dedup_resolve_fwd(d, names_map, d->btf->start_id + i);
4905		if (err < 0)
4906			break;
4907	}
4908
4909exit:
4910	hashmap__free(names_map);
4911	return err;
4912}
4913
4914/*
4915 * Compact types.
4916 *
4917 * After we established for each type its corresponding canonical representative
4918 * type, we now can eliminate types that are not canonical and leave only
4919 * canonical ones layed out sequentially in memory by copying them over
4920 * duplicates. During compaction btf_dedup->hypot_map array is reused to store
4921 * a map from original type ID to a new compacted type ID, which will be used
4922 * during next phase to "fix up" type IDs, referenced from struct/union and
4923 * reference types.
4924 */
4925static int btf_dedup_compact_types(struct btf_dedup *d)
4926{
4927	__u32 *new_offs;
4928	__u32 next_type_id = d->btf->start_id;
4929	const struct btf_type *t;
4930	void *p;
4931	int i, id, len;
4932
4933	/* we are going to reuse hypot_map to store compaction remapping */
4934	d->hypot_map[0] = 0;
4935	/* base BTF types are not renumbered */
4936	for (id = 1; id < d->btf->start_id; id++)
4937		d->hypot_map[id] = id;
4938	for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++)
4939		d->hypot_map[id] = BTF_UNPROCESSED_ID;
4940
4941	p = d->btf->types_data;
4942
4943	for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) {
4944		if (d->map[id] != id)
4945			continue;
4946
4947		t = btf__type_by_id(d->btf, id);
4948		len = btf_type_size(t);
4949		if (len < 0)
4950			return len;
4951
4952		memmove(p, t, len);
4953		d->hypot_map[id] = next_type_id;
4954		d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data;
4955		p += len;
4956		next_type_id++;
4957	}
4958
4959	/* shrink struct btf's internal types index and update btf_header */
4960	d->btf->nr_types = next_type_id - d->btf->start_id;
4961	d->btf->type_offs_cap = d->btf->nr_types;
4962	d->btf->hdr->type_len = p - d->btf->types_data;
4963	new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap,
4964				       sizeof(*new_offs));
4965	if (d->btf->type_offs_cap && !new_offs)
4966		return -ENOMEM;
4967	d->btf->type_offs = new_offs;
4968	d->btf->hdr->str_off = d->btf->hdr->type_len;
4969	d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len;
4970	return 0;
4971}
4972
4973/*
4974 * Figure out final (deduplicated and compacted) type ID for provided original
4975 * `type_id` by first resolving it into corresponding canonical type ID and
4976 * then mapping it to a deduplicated type ID, stored in btf_dedup->hypot_map,
4977 * which is populated during compaction phase.
4978 */
4979static int btf_dedup_remap_type_id(__u32 *type_id, void *ctx)
4980{
4981	struct btf_dedup *d = ctx;
4982	__u32 resolved_type_id, new_type_id;
4983
4984	resolved_type_id = resolve_type_id(d, *type_id);
4985	new_type_id = d->hypot_map[resolved_type_id];
4986	if (new_type_id > BTF_MAX_NR_TYPES)
4987		return -EINVAL;
4988
4989	*type_id = new_type_id;
4990	return 0;
4991}
4992
4993/*
4994 * Remap referenced type IDs into deduped type IDs.
4995 *
4996 * After BTF types are deduplicated and compacted, their final type IDs may
4997 * differ from original ones. The map from original to a corresponding
4998 * deduped type ID is stored in btf_dedup->hypot_map and is populated during
4999 * compaction phase. During remapping phase we are rewriting all type IDs
5000 * referenced from any BTF type (e.g., struct fields, func proto args, etc) to
5001 * their final deduped type IDs.
5002 */
5003static int btf_dedup_remap_types(struct btf_dedup *d)
5004{
5005	int i, r;
5006
5007	for (i = 0; i < d->btf->nr_types; i++) {
5008		struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
5009
5010		r = btf_type_visit_type_ids(t, btf_dedup_remap_type_id, d);
5011		if (r)
5012			return r;
5013	}
5014
5015	if (!d->btf_ext)
5016		return 0;
5017
5018	r = btf_ext_visit_type_ids(d->btf_ext, btf_dedup_remap_type_id, d);
5019	if (r)
5020		return r;
5021
5022	return 0;
5023}
5024
5025/*
5026 * Probe few well-known locations for vmlinux kernel image and try to load BTF
5027 * data out of it to use for target BTF.
5028 */
5029struct btf *btf__load_vmlinux_btf(void)
5030{
5031	const char *locations[] = {
5032		/* try canonical vmlinux BTF through sysfs first */
5033		"/sys/kernel/btf/vmlinux",
5034		/* fall back to trying to find vmlinux on disk otherwise */
5035		"/boot/vmlinux-%1$s",
5036		"/lib/modules/%1$s/vmlinux-%1$s",
5037		"/lib/modules/%1$s/build/vmlinux",
5038		"/usr/lib/modules/%1$s/kernel/vmlinux",
5039		"/usr/lib/debug/boot/vmlinux-%1$s",
5040		"/usr/lib/debug/boot/vmlinux-%1$s.debug",
5041		"/usr/lib/debug/lib/modules/%1$s/vmlinux",
5042	};
5043	char path[PATH_MAX + 1];
5044	struct utsname buf;
5045	struct btf *btf;
5046	int i, err;
5047
5048	uname(&buf);
5049
5050	for (i = 0; i < ARRAY_SIZE(locations); i++) {
5051		snprintf(path, PATH_MAX, locations[i], buf.release);
5052
5053		if (faccessat(AT_FDCWD, path, R_OK, AT_EACCESS))
5054			continue;
5055
5056		btf = btf__parse(path, NULL);
5057		err = libbpf_get_error(btf);
5058		pr_debug("loading kernel BTF '%s': %d\n", path, err);
5059		if (err)
5060			continue;
5061
5062		return btf;
5063	}
5064
5065	pr_warn("failed to find valid kernel BTF\n");
5066	return libbpf_err_ptr(-ESRCH);
5067}
5068
5069struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
5070
5071struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf)
5072{
5073	char path[80];
5074
5075	snprintf(path, sizeof(path), "/sys/kernel/btf/%s", module_name);
5076	return btf__parse_split(path, vmlinux_btf);
5077}
5078
5079int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx)
5080{
5081	int i, n, err;
5082
5083	switch (btf_kind(t)) {
5084	case BTF_KIND_INT:
5085	case BTF_KIND_FLOAT:
5086	case BTF_KIND_ENUM:
5087	case BTF_KIND_ENUM64:
5088		return 0;
5089
5090	case BTF_KIND_FWD:
5091	case BTF_KIND_CONST:
5092	case BTF_KIND_VOLATILE:
5093	case BTF_KIND_RESTRICT:
5094	case BTF_KIND_PTR:
5095	case BTF_KIND_TYPEDEF:
5096	case BTF_KIND_FUNC:
5097	case BTF_KIND_VAR:
5098	case BTF_KIND_DECL_TAG:
5099	case BTF_KIND_TYPE_TAG:
5100		return visit(&t->type, ctx);
5101
5102	case BTF_KIND_ARRAY: {
5103		struct btf_array *a = btf_array(t);
5104
5105		err = visit(&a->type, ctx);
5106		err = err ?: visit(&a->index_type, ctx);
5107		return err;
5108	}
5109
5110	case BTF_KIND_STRUCT:
5111	case BTF_KIND_UNION: {
5112		struct btf_member *m = btf_members(t);
5113
5114		for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
5115			err = visit(&m->type, ctx);
5116			if (err)
5117				return err;
5118		}
5119		return 0;
5120	}
5121
5122	case BTF_KIND_FUNC_PROTO: {
5123		struct btf_param *m = btf_params(t);
5124
5125		err = visit(&t->type, ctx);
5126		if (err)
5127			return err;
5128		for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
5129			err = visit(&m->type, ctx);
5130			if (err)
5131				return err;
5132		}
5133		return 0;
5134	}
5135
5136	case BTF_KIND_DATASEC: {
5137		struct btf_var_secinfo *m = btf_var_secinfos(t);
5138
5139		for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
5140			err = visit(&m->type, ctx);
5141			if (err)
5142				return err;
5143		}
5144		return 0;
5145	}
5146
5147	default:
5148		return -EINVAL;
5149	}
5150}
5151
5152int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx)
5153{
5154	int i, n, err;
5155
5156	err = visit(&t->name_off, ctx);
5157	if (err)
5158		return err;
5159
5160	switch (btf_kind(t)) {
5161	case BTF_KIND_STRUCT:
5162	case BTF_KIND_UNION: {
5163		struct btf_member *m = btf_members(t);
5164
5165		for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
5166			err = visit(&m->name_off, ctx);
5167			if (err)
5168				return err;
5169		}
5170		break;
5171	}
5172	case BTF_KIND_ENUM: {
5173		struct btf_enum *m = btf_enum(t);
5174
5175		for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
5176			err = visit(&m->name_off, ctx);
5177			if (err)
5178				return err;
5179		}
5180		break;
5181	}
5182	case BTF_KIND_ENUM64: {
5183		struct btf_enum64 *m = btf_enum64(t);
5184
5185		for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
5186			err = visit(&m->name_off, ctx);
5187			if (err)
5188				return err;
5189		}
5190		break;
5191	}
5192	case BTF_KIND_FUNC_PROTO: {
5193		struct btf_param *m = btf_params(t);
5194
5195		for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
5196			err = visit(&m->name_off, ctx);
5197			if (err)
5198				return err;
5199		}
5200		break;
5201	}
5202	default:
5203		break;
5204	}
5205
5206	return 0;
5207}
5208
5209int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx)
5210{
5211	const struct btf_ext_info *seg;
5212	struct btf_ext_info_sec *sec;
5213	int i, err;
5214
5215	seg = &btf_ext->func_info;
5216	for_each_btf_ext_sec(seg, sec) {
5217		struct bpf_func_info_min *rec;
5218
5219		for_each_btf_ext_rec(seg, sec, i, rec) {
5220			err = visit(&rec->type_id, ctx);
5221			if (err < 0)
5222				return err;
5223		}
5224	}
5225
5226	seg = &btf_ext->core_relo_info;
5227	for_each_btf_ext_sec(seg, sec) {
5228		struct bpf_core_relo *rec;
5229
5230		for_each_btf_ext_rec(seg, sec, i, rec) {
5231			err = visit(&rec->type_id, ctx);
5232			if (err < 0)
5233				return err;
5234		}
5235	}
5236
5237	return 0;
5238}
5239
5240int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx)
5241{
5242	const struct btf_ext_info *seg;
5243	struct btf_ext_info_sec *sec;
5244	int i, err;
5245
5246	seg = &btf_ext->func_info;
5247	for_each_btf_ext_sec(seg, sec) {
5248		err = visit(&sec->sec_name_off, ctx);
5249		if (err)
5250			return err;
5251	}
5252
5253	seg = &btf_ext->line_info;
5254	for_each_btf_ext_sec(seg, sec) {
5255		struct bpf_line_info_min *rec;
5256
5257		err = visit(&sec->sec_name_off, ctx);
5258		if (err)
5259			return err;
5260
5261		for_each_btf_ext_rec(seg, sec, i, rec) {
5262			err = visit(&rec->file_name_off, ctx);
5263			if (err)
5264				return err;
5265			err = visit(&rec->line_off, ctx);
5266			if (err)
5267				return err;
5268		}
5269	}
5270
5271	seg = &btf_ext->core_relo_info;
5272	for_each_btf_ext_sec(seg, sec) {
5273		struct bpf_core_relo *rec;
5274
5275		err = visit(&sec->sec_name_off, ctx);
5276		if (err)
5277			return err;
5278
5279		for_each_btf_ext_rec(seg, sec, i, rec) {
5280			err = visit(&rec->access_str_off, ctx);
5281			if (err)
5282				return err;
5283		}
5284	}
5285
5286	return 0;
5287}
5288