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