Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
0002 /* Copyright (c) 2018 Facebook */
0003 
0004 #include <byteswap.h>
0005 #include <endian.h>
0006 #include <stdio.h>
0007 #include <stdlib.h>
0008 #include <string.h>
0009 #include <fcntl.h>
0010 #include <unistd.h>
0011 #include <errno.h>
0012 #include <sys/utsname.h>
0013 #include <sys/param.h>
0014 #include <sys/stat.h>
0015 #include <linux/kernel.h>
0016 #include <linux/err.h>
0017 #include <linux/btf.h>
0018 #include <gelf.h>
0019 #include "btf.h"
0020 #include "bpf.h"
0021 #include "libbpf.h"
0022 #include "libbpf_internal.h"
0023 #include "hashmap.h"
0024 #include "strset.h"
0025 
0026 #define BTF_MAX_NR_TYPES 0x7fffffffU
0027 #define BTF_MAX_STR_OFFSET 0x7fffffffU
0028 
0029 static struct btf_type btf_void;
0030 
0031 struct btf {
0032     /* raw BTF data in native endianness */
0033     void *raw_data;
0034     /* raw BTF data in non-native endianness */
0035     void *raw_data_swapped;
0036     __u32 raw_size;
0037     /* whether target endianness differs from the native one */
0038     bool swapped_endian;
0039 
0040     /*
0041      * When BTF is loaded from an ELF or raw memory it is stored
0042      * in a contiguous memory block. The hdr, type_data, and, strs_data
0043      * point inside that memory region to their respective parts of BTF
0044      * representation:
0045      *
0046      * +--------------------------------+
0047      * |  Header  |  Types  |  Strings  |
0048      * +--------------------------------+
0049      * ^          ^         ^
0050      * |          |         |
0051      * hdr        |         |
0052      * types_data-+         |
0053      * strs_data------------+
0054      *
0055      * If BTF data is later modified, e.g., due to types added or
0056      * removed, BTF deduplication performed, etc, this contiguous
0057      * representation is broken up into three independently allocated
0058      * memory regions to be able to modify them independently.
0059      * raw_data is nulled out at that point, but can be later allocated
0060      * and cached again if user calls btf__raw_data(), at which point
0061      * raw_data will contain a contiguous copy of header, types, and
0062      * strings:
0063      *
0064      * +----------+  +---------+  +-----------+
0065      * |  Header  |  |  Types  |  |  Strings  |
0066      * +----------+  +---------+  +-----------+
0067      * ^             ^            ^
0068      * |             |            |
0069      * hdr           |            |
0070      * types_data----+            |
0071      * strset__data(strs_set)-----+
0072      *
0073      *               +----------+---------+-----------+
0074      *               |  Header  |  Types  |  Strings  |
0075      * raw_data----->+----------+---------+-----------+
0076      */
0077     struct btf_header *hdr;
0078 
0079     void *types_data;
0080     size_t types_data_cap; /* used size stored in hdr->type_len */
0081 
0082     /* type ID to `struct btf_type *` lookup index
0083      * type_offs[0] corresponds to the first non-VOID type:
0084      *   - for base BTF it's type [1];
0085      *   - for split BTF it's the first non-base BTF type.
0086      */
0087     __u32 *type_offs;
0088     size_t type_offs_cap;
0089     /* number of types in this BTF instance:
0090      *   - doesn't include special [0] void type;
0091      *   - for split BTF counts number of types added on top of base BTF.
0092      */
0093     __u32 nr_types;
0094     /* if not NULL, points to the base BTF on top of which the current
0095      * split BTF is based
0096      */
0097     struct btf *base_btf;
0098     /* BTF type ID of the first type in this BTF instance:
0099      *   - for base BTF it's equal to 1;
0100      *   - for split BTF it's equal to biggest type ID of base BTF plus 1.
0101      */
0102     int start_id;
0103     /* logical string offset of this BTF instance:
0104      *   - for base BTF it's equal to 0;
0105      *   - for split BTF it's equal to total size of base BTF's string section size.
0106      */
0107     int start_str_off;
0108 
0109     /* only one of strs_data or strs_set can be non-NULL, depending on
0110      * whether BTF is in a modifiable state (strs_set is used) or not
0111      * (strs_data points inside raw_data)
0112      */
0113     void *strs_data;
0114     /* a set of unique strings */
0115     struct strset *strs_set;
0116     /* whether strings are already deduplicated */
0117     bool strs_deduped;
0118 
0119     /* BTF object FD, if loaded into kernel */
0120     int fd;
0121 
0122     /* Pointer size (in bytes) for a target architecture of this BTF */
0123     int ptr_sz;
0124 };
0125 
0126 static inline __u64 ptr_to_u64(const void *ptr)
0127 {
0128     return (__u64) (unsigned long) ptr;
0129 }
0130 
0131 /* Ensure given dynamically allocated memory region pointed to by *data* with
0132  * capacity of *cap_cnt* elements each taking *elem_sz* bytes has enough
0133  * memory to accommodate *add_cnt* new elements, assuming *cur_cnt* elements
0134  * are already used. At most *max_cnt* elements can be ever allocated.
0135  * If necessary, memory is reallocated and all existing data is copied over,
0136  * new pointer to the memory region is stored at *data, new memory region
0137  * capacity (in number of elements) is stored in *cap.
0138  * On success, memory pointer to the beginning of unused memory is returned.
0139  * On error, NULL is returned.
0140  */
0141 void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz,
0142              size_t cur_cnt, size_t max_cnt, size_t add_cnt)
0143 {
0144     size_t new_cnt;
0145     void *new_data;
0146 
0147     if (cur_cnt + add_cnt <= *cap_cnt)
0148         return *data + cur_cnt * elem_sz;
0149 
0150     /* requested more than the set limit */
0151     if (cur_cnt + add_cnt > max_cnt)
0152         return NULL;
0153 
0154     new_cnt = *cap_cnt;
0155     new_cnt += new_cnt / 4;       /* expand by 25% */
0156     if (new_cnt < 16)         /* but at least 16 elements */
0157         new_cnt = 16;
0158     if (new_cnt > max_cnt)        /* but not exceeding a set limit */
0159         new_cnt = max_cnt;
0160     if (new_cnt < cur_cnt + add_cnt)  /* also ensure we have enough memory */
0161         new_cnt = cur_cnt + add_cnt;
0162 
0163     new_data = libbpf_reallocarray(*data, new_cnt, elem_sz);
0164     if (!new_data)
0165         return NULL;
0166 
0167     /* zero out newly allocated portion of memory */
0168     memset(new_data + (*cap_cnt) * elem_sz, 0, (new_cnt - *cap_cnt) * elem_sz);
0169 
0170     *data = new_data;
0171     *cap_cnt = new_cnt;
0172     return new_data + cur_cnt * elem_sz;
0173 }
0174 
0175 /* Ensure given dynamically allocated memory region has enough allocated space
0176  * to accommodate *need_cnt* elements of size *elem_sz* bytes each
0177  */
0178 int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt)
0179 {
0180     void *p;
0181 
0182     if (need_cnt <= *cap_cnt)
0183         return 0;
0184 
0185     p = libbpf_add_mem(data, cap_cnt, elem_sz, *cap_cnt, SIZE_MAX, need_cnt - *cap_cnt);
0186     if (!p)
0187         return -ENOMEM;
0188 
0189     return 0;
0190 }
0191 
0192 static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt)
0193 {
0194     return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32),
0195                   btf->nr_types, BTF_MAX_NR_TYPES, add_cnt);
0196 }
0197 
0198 static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off)
0199 {
0200     __u32 *p;
0201 
0202     p = btf_add_type_offs_mem(btf, 1);
0203     if (!p)
0204         return -ENOMEM;
0205 
0206     *p = type_off;
0207     return 0;
0208 }
0209 
0210 static void btf_bswap_hdr(struct btf_header *h)
0211 {
0212     h->magic = bswap_16(h->magic);
0213     h->hdr_len = bswap_32(h->hdr_len);
0214     h->type_off = bswap_32(h->type_off);
0215     h->type_len = bswap_32(h->type_len);
0216     h->str_off = bswap_32(h->str_off);
0217     h->str_len = bswap_32(h->str_len);
0218 }
0219 
0220 static int btf_parse_hdr(struct btf *btf)
0221 {
0222     struct btf_header *hdr = btf->hdr;
0223     __u32 meta_left;
0224 
0225     if (btf->raw_size < sizeof(struct btf_header)) {
0226         pr_debug("BTF header not found\n");
0227         return -EINVAL;
0228     }
0229 
0230     if (hdr->magic == bswap_16(BTF_MAGIC)) {
0231         btf->swapped_endian = true;
0232         if (bswap_32(hdr->hdr_len) != sizeof(struct btf_header)) {
0233             pr_warn("Can't load BTF with non-native endianness due to unsupported header length %u\n",
0234                 bswap_32(hdr->hdr_len));
0235             return -ENOTSUP;
0236         }
0237         btf_bswap_hdr(hdr);
0238     } else if (hdr->magic != BTF_MAGIC) {
0239         pr_debug("Invalid BTF magic: %x\n", hdr->magic);
0240         return -EINVAL;
0241     }
0242 
0243     if (btf->raw_size < hdr->hdr_len) {
0244         pr_debug("BTF header len %u larger than data size %u\n",
0245              hdr->hdr_len, btf->raw_size);
0246         return -EINVAL;
0247     }
0248 
0249     meta_left = btf->raw_size - hdr->hdr_len;
0250     if (meta_left < (long long)hdr->str_off + hdr->str_len) {
0251         pr_debug("Invalid BTF total size: %u\n", btf->raw_size);
0252         return -EINVAL;
0253     }
0254 
0255     if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) {
0256         pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n",
0257              hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len);
0258         return -EINVAL;
0259     }
0260 
0261     if (hdr->type_off % 4) {
0262         pr_debug("BTF type section is not aligned to 4 bytes\n");
0263         return -EINVAL;
0264     }
0265 
0266     return 0;
0267 }
0268 
0269 static int btf_parse_str_sec(struct btf *btf)
0270 {
0271     const struct btf_header *hdr = btf->hdr;
0272     const char *start = btf->strs_data;
0273     const char *end = start + btf->hdr->str_len;
0274 
0275     if (btf->base_btf && hdr->str_len == 0)
0276         return 0;
0277     if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_STR_OFFSET || end[-1]) {
0278         pr_debug("Invalid BTF string section\n");
0279         return -EINVAL;
0280     }
0281     if (!btf->base_btf && start[0]) {
0282         pr_debug("Invalid BTF string section\n");
0283         return -EINVAL;
0284     }
0285     return 0;
0286 }
0287 
0288 static int btf_type_size(const struct btf_type *t)
0289 {
0290     const int base_size = sizeof(struct btf_type);
0291     __u16 vlen = btf_vlen(t);
0292 
0293     switch (btf_kind(t)) {
0294     case BTF_KIND_FWD:
0295     case BTF_KIND_CONST:
0296     case BTF_KIND_VOLATILE:
0297     case BTF_KIND_RESTRICT:
0298     case BTF_KIND_PTR:
0299     case BTF_KIND_TYPEDEF:
0300     case BTF_KIND_FUNC:
0301     case BTF_KIND_FLOAT:
0302     case BTF_KIND_TYPE_TAG:
0303         return base_size;
0304     case BTF_KIND_INT:
0305         return base_size + sizeof(__u32);
0306     case BTF_KIND_ENUM:
0307         return base_size + vlen * sizeof(struct btf_enum);
0308     case BTF_KIND_ENUM64:
0309         return base_size + vlen * sizeof(struct btf_enum64);
0310     case BTF_KIND_ARRAY:
0311         return base_size + sizeof(struct btf_array);
0312     case BTF_KIND_STRUCT:
0313     case BTF_KIND_UNION:
0314         return base_size + vlen * sizeof(struct btf_member);
0315     case BTF_KIND_FUNC_PROTO:
0316         return base_size + vlen * sizeof(struct btf_param);
0317     case BTF_KIND_VAR:
0318         return base_size + sizeof(struct btf_var);
0319     case BTF_KIND_DATASEC:
0320         return base_size + vlen * sizeof(struct btf_var_secinfo);
0321     case BTF_KIND_DECL_TAG:
0322         return base_size + sizeof(struct btf_decl_tag);
0323     default:
0324         pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
0325         return -EINVAL;
0326     }
0327 }
0328 
0329 static void btf_bswap_type_base(struct btf_type *t)
0330 {
0331     t->name_off = bswap_32(t->name_off);
0332     t->info = bswap_32(t->info);
0333     t->type = bswap_32(t->type);
0334 }
0335 
0336 static int btf_bswap_type_rest(struct btf_type *t)
0337 {
0338     struct btf_var_secinfo *v;
0339     struct btf_enum64 *e64;
0340     struct btf_member *m;
0341     struct btf_array *a;
0342     struct btf_param *p;
0343     struct btf_enum *e;
0344     __u16 vlen = btf_vlen(t);
0345     int i;
0346 
0347     switch (btf_kind(t)) {
0348     case BTF_KIND_FWD:
0349     case BTF_KIND_CONST:
0350     case BTF_KIND_VOLATILE:
0351     case BTF_KIND_RESTRICT:
0352     case BTF_KIND_PTR:
0353     case BTF_KIND_TYPEDEF:
0354     case BTF_KIND_FUNC:
0355     case BTF_KIND_FLOAT:
0356     case BTF_KIND_TYPE_TAG:
0357         return 0;
0358     case BTF_KIND_INT:
0359         *(__u32 *)(t + 1) = bswap_32(*(__u32 *)(t + 1));
0360         return 0;
0361     case BTF_KIND_ENUM:
0362         for (i = 0, e = btf_enum(t); i < vlen; i++, e++) {
0363             e->name_off = bswap_32(e->name_off);
0364             e->val = bswap_32(e->val);
0365         }
0366         return 0;
0367     case BTF_KIND_ENUM64:
0368         for (i = 0, e64 = btf_enum64(t); i < vlen; i++, e64++) {
0369             e64->name_off = bswap_32(e64->name_off);
0370             e64->val_lo32 = bswap_32(e64->val_lo32);
0371             e64->val_hi32 = bswap_32(e64->val_hi32);
0372         }
0373         return 0;
0374     case BTF_KIND_ARRAY:
0375         a = btf_array(t);
0376         a->type = bswap_32(a->type);
0377         a->index_type = bswap_32(a->index_type);
0378         a->nelems = bswap_32(a->nelems);
0379         return 0;
0380     case BTF_KIND_STRUCT:
0381     case BTF_KIND_UNION:
0382         for (i = 0, m = btf_members(t); i < vlen; i++, m++) {
0383             m->name_off = bswap_32(m->name_off);
0384             m->type = bswap_32(m->type);
0385             m->offset = bswap_32(m->offset);
0386         }
0387         return 0;
0388     case BTF_KIND_FUNC_PROTO:
0389         for (i = 0, p = btf_params(t); i < vlen; i++, p++) {
0390             p->name_off = bswap_32(p->name_off);
0391             p->type = bswap_32(p->type);
0392         }
0393         return 0;
0394     case BTF_KIND_VAR:
0395         btf_var(t)->linkage = bswap_32(btf_var(t)->linkage);
0396         return 0;
0397     case BTF_KIND_DATASEC:
0398         for (i = 0, v = btf_var_secinfos(t); i < vlen; i++, v++) {
0399             v->type = bswap_32(v->type);
0400             v->offset = bswap_32(v->offset);
0401             v->size = bswap_32(v->size);
0402         }
0403         return 0;
0404     case BTF_KIND_DECL_TAG:
0405         btf_decl_tag(t)->component_idx = bswap_32(btf_decl_tag(t)->component_idx);
0406         return 0;
0407     default:
0408         pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t));
0409         return -EINVAL;
0410     }
0411 }
0412 
0413 static int btf_parse_type_sec(struct btf *btf)
0414 {
0415     struct btf_header *hdr = btf->hdr;
0416     void *next_type = btf->types_data;
0417     void *end_type = next_type + hdr->type_len;
0418     int err, type_size;
0419 
0420     while (next_type + sizeof(struct btf_type) <= end_type) {
0421         if (btf->swapped_endian)
0422             btf_bswap_type_base(next_type);
0423 
0424         type_size = btf_type_size(next_type);
0425         if (type_size < 0)
0426             return type_size;
0427         if (next_type + type_size > end_type) {
0428             pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types);
0429             return -EINVAL;
0430         }
0431 
0432         if (btf->swapped_endian && btf_bswap_type_rest(next_type))
0433             return -EINVAL;
0434 
0435         err = btf_add_type_idx_entry(btf, next_type - btf->types_data);
0436         if (err)
0437             return err;
0438 
0439         next_type += type_size;
0440         btf->nr_types++;
0441     }
0442 
0443     if (next_type != end_type) {
0444         pr_warn("BTF types data is malformed\n");
0445         return -EINVAL;
0446     }
0447 
0448     return 0;
0449 }
0450 
0451 __u32 btf__type_cnt(const struct btf *btf)
0452 {
0453     return btf->start_id + btf->nr_types;
0454 }
0455 
0456 const struct btf *btf__base_btf(const struct btf *btf)
0457 {
0458     return btf->base_btf;
0459 }
0460 
0461 /* internal helper returning non-const pointer to a type */
0462 struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id)
0463 {
0464     if (type_id == 0)
0465         return &btf_void;
0466     if (type_id < btf->start_id)
0467         return btf_type_by_id(btf->base_btf, type_id);
0468     return btf->types_data + btf->type_offs[type_id - btf->start_id];
0469 }
0470 
0471 const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id)
0472 {
0473     if (type_id >= btf->start_id + btf->nr_types)
0474         return errno = EINVAL, NULL;
0475     return btf_type_by_id((struct btf *)btf, type_id);
0476 }
0477 
0478 static int determine_ptr_size(const struct btf *btf)
0479 {
0480     static const char * const long_aliases[] = {
0481         "long",
0482         "long int",
0483         "int long",
0484         "unsigned long",
0485         "long unsigned",
0486         "unsigned long int",
0487         "unsigned int long",
0488         "long unsigned int",
0489         "long int unsigned",
0490         "int unsigned long",
0491         "int long unsigned",
0492     };
0493     const struct btf_type *t;
0494     const char *name;
0495     int i, j, n;
0496 
0497     if (btf->base_btf && btf->base_btf->ptr_sz > 0)
0498         return btf->base_btf->ptr_sz;
0499 
0500     n = btf__type_cnt(btf);
0501     for (i = 1; i < n; i++) {
0502         t = btf__type_by_id(btf, i);
0503         if (!btf_is_int(t))
0504             continue;
0505 
0506         if (t->size != 4 && t->size != 8)
0507             continue;
0508 
0509         name = btf__name_by_offset(btf, t->name_off);
0510         if (!name)
0511             continue;
0512 
0513         for (j = 0; j < ARRAY_SIZE(long_aliases); j++) {
0514             if (strcmp(name, long_aliases[j]) == 0)
0515                 return t->size;
0516         }
0517     }
0518 
0519     return -1;
0520 }
0521 
0522 static size_t btf_ptr_sz(const struct btf *btf)
0523 {
0524     if (!btf->ptr_sz)
0525         ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
0526     return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz;
0527 }
0528 
0529 /* Return pointer size this BTF instance assumes. The size is heuristically
0530  * determined by looking for 'long' or 'unsigned long' integer type and
0531  * recording its size in bytes. If BTF type information doesn't have any such
0532  * type, this function returns 0. In the latter case, native architecture's
0533  * pointer size is assumed, so will be either 4 or 8, depending on
0534  * architecture that libbpf was compiled for. It's possible to override
0535  * guessed value by using btf__set_pointer_size() API.
0536  */
0537 size_t btf__pointer_size(const struct btf *btf)
0538 {
0539     if (!btf->ptr_sz)
0540         ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf);
0541 
0542     if (btf->ptr_sz < 0)
0543         /* not enough BTF type info to guess */
0544         return 0;
0545 
0546     return btf->ptr_sz;
0547 }
0548 
0549 /* Override or set pointer size in bytes. Only values of 4 and 8 are
0550  * supported.
0551  */
0552 int btf__set_pointer_size(struct btf *btf, size_t ptr_sz)
0553 {
0554     if (ptr_sz != 4 && ptr_sz != 8)
0555         return libbpf_err(-EINVAL);
0556     btf->ptr_sz = ptr_sz;
0557     return 0;
0558 }
0559 
0560 static bool is_host_big_endian(void)
0561 {
0562 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
0563     return false;
0564 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
0565     return true;
0566 #else
0567 # error "Unrecognized __BYTE_ORDER__"
0568 #endif
0569 }
0570 
0571 enum btf_endianness btf__endianness(const struct btf *btf)
0572 {
0573     if (is_host_big_endian())
0574         return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN;
0575     else
0576         return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN;
0577 }
0578 
0579 int btf__set_endianness(struct btf *btf, enum btf_endianness endian)
0580 {
0581     if (endian != BTF_LITTLE_ENDIAN && endian != BTF_BIG_ENDIAN)
0582         return libbpf_err(-EINVAL);
0583 
0584     btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN);
0585     if (!btf->swapped_endian) {
0586         free(btf->raw_data_swapped);
0587         btf->raw_data_swapped = NULL;
0588     }
0589     return 0;
0590 }
0591 
0592 static bool btf_type_is_void(const struct btf_type *t)
0593 {
0594     return t == &btf_void || btf_is_fwd(t);
0595 }
0596 
0597 static bool btf_type_is_void_or_null(const struct btf_type *t)
0598 {
0599     return !t || btf_type_is_void(t);
0600 }
0601 
0602 #define MAX_RESOLVE_DEPTH 32
0603 
0604 __s64 btf__resolve_size(const struct btf *btf, __u32 type_id)
0605 {
0606     const struct btf_array *array;
0607     const struct btf_type *t;
0608     __u32 nelems = 1;
0609     __s64 size = -1;
0610     int i;
0611 
0612     t = btf__type_by_id(btf, type_id);
0613     for (i = 0; i < MAX_RESOLVE_DEPTH && !btf_type_is_void_or_null(t); i++) {
0614         switch (btf_kind(t)) {
0615         case BTF_KIND_INT:
0616         case BTF_KIND_STRUCT:
0617         case BTF_KIND_UNION:
0618         case BTF_KIND_ENUM:
0619         case BTF_KIND_ENUM64:
0620         case BTF_KIND_DATASEC:
0621         case BTF_KIND_FLOAT:
0622             size = t->size;
0623             goto done;
0624         case BTF_KIND_PTR:
0625             size = btf_ptr_sz(btf);
0626             goto done;
0627         case BTF_KIND_TYPEDEF:
0628         case BTF_KIND_VOLATILE:
0629         case BTF_KIND_CONST:
0630         case BTF_KIND_RESTRICT:
0631         case BTF_KIND_VAR:
0632         case BTF_KIND_DECL_TAG:
0633         case BTF_KIND_TYPE_TAG:
0634             type_id = t->type;
0635             break;
0636         case BTF_KIND_ARRAY:
0637             array = btf_array(t);
0638             if (nelems && array->nelems > UINT32_MAX / nelems)
0639                 return libbpf_err(-E2BIG);
0640             nelems *= array->nelems;
0641             type_id = array->type;
0642             break;
0643         default:
0644             return libbpf_err(-EINVAL);
0645         }
0646 
0647         t = btf__type_by_id(btf, type_id);
0648     }
0649 
0650 done:
0651     if (size < 0)
0652         return libbpf_err(-EINVAL);
0653     if (nelems && size > UINT32_MAX / nelems)
0654         return libbpf_err(-E2BIG);
0655 
0656     return nelems * size;
0657 }
0658 
0659 int btf__align_of(const struct btf *btf, __u32 id)
0660 {
0661     const struct btf_type *t = btf__type_by_id(btf, id);
0662     __u16 kind = btf_kind(t);
0663 
0664     switch (kind) {
0665     case BTF_KIND_INT:
0666     case BTF_KIND_ENUM:
0667     case BTF_KIND_ENUM64:
0668     case BTF_KIND_FLOAT:
0669         return min(btf_ptr_sz(btf), (size_t)t->size);
0670     case BTF_KIND_PTR:
0671         return btf_ptr_sz(btf);
0672     case BTF_KIND_TYPEDEF:
0673     case BTF_KIND_VOLATILE:
0674     case BTF_KIND_CONST:
0675     case BTF_KIND_RESTRICT:
0676     case BTF_KIND_TYPE_TAG:
0677         return btf__align_of(btf, t->type);
0678     case BTF_KIND_ARRAY:
0679         return btf__align_of(btf, btf_array(t)->type);
0680     case BTF_KIND_STRUCT:
0681     case BTF_KIND_UNION: {
0682         const struct btf_member *m = btf_members(t);
0683         __u16 vlen = btf_vlen(t);
0684         int i, max_align = 1, align;
0685 
0686         for (i = 0; i < vlen; i++, m++) {
0687             align = btf__align_of(btf, m->type);
0688             if (align <= 0)
0689                 return libbpf_err(align);
0690             max_align = max(max_align, align);
0691         }
0692 
0693         return max_align;
0694     }
0695     default:
0696         pr_warn("unsupported BTF_KIND:%u\n", btf_kind(t));
0697         return errno = EINVAL, 0;
0698     }
0699 }
0700 
0701 int btf__resolve_type(const struct btf *btf, __u32 type_id)
0702 {
0703     const struct btf_type *t;
0704     int depth = 0;
0705 
0706     t = btf__type_by_id(btf, type_id);
0707     while (depth < MAX_RESOLVE_DEPTH &&
0708            !btf_type_is_void_or_null(t) &&
0709            (btf_is_mod(t) || btf_is_typedef(t) || btf_is_var(t))) {
0710         type_id = t->type;
0711         t = btf__type_by_id(btf, type_id);
0712         depth++;
0713     }
0714 
0715     if (depth == MAX_RESOLVE_DEPTH || btf_type_is_void_or_null(t))
0716         return libbpf_err(-EINVAL);
0717 
0718     return type_id;
0719 }
0720 
0721 __s32 btf__find_by_name(const struct btf *btf, const char *type_name)
0722 {
0723     __u32 i, nr_types = btf__type_cnt(btf);
0724 
0725     if (!strcmp(type_name, "void"))
0726         return 0;
0727 
0728     for (i = 1; i < nr_types; i++) {
0729         const struct btf_type *t = btf__type_by_id(btf, i);
0730         const char *name = btf__name_by_offset(btf, t->name_off);
0731 
0732         if (name && !strcmp(type_name, name))
0733             return i;
0734     }
0735 
0736     return libbpf_err(-ENOENT);
0737 }
0738 
0739 static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id,
0740                    const char *type_name, __u32 kind)
0741 {
0742     __u32 i, nr_types = btf__type_cnt(btf);
0743 
0744     if (kind == BTF_KIND_UNKN || !strcmp(type_name, "void"))
0745         return 0;
0746 
0747     for (i = start_id; i < nr_types; i++) {
0748         const struct btf_type *t = btf__type_by_id(btf, i);
0749         const char *name;
0750 
0751         if (btf_kind(t) != kind)
0752             continue;
0753         name = btf__name_by_offset(btf, t->name_off);
0754         if (name && !strcmp(type_name, name))
0755             return i;
0756     }
0757 
0758     return libbpf_err(-ENOENT);
0759 }
0760 
0761 __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name,
0762                  __u32 kind)
0763 {
0764     return btf_find_by_name_kind(btf, btf->start_id, type_name, kind);
0765 }
0766 
0767 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name,
0768                  __u32 kind)
0769 {
0770     return btf_find_by_name_kind(btf, 1, type_name, kind);
0771 }
0772 
0773 static bool btf_is_modifiable(const struct btf *btf)
0774 {
0775     return (void *)btf->hdr != btf->raw_data;
0776 }
0777 
0778 void btf__free(struct btf *btf)
0779 {
0780     if (IS_ERR_OR_NULL(btf))
0781         return;
0782 
0783     if (btf->fd >= 0)
0784         close(btf->fd);
0785 
0786     if (btf_is_modifiable(btf)) {
0787         /* if BTF was modified after loading, it will have a split
0788          * in-memory representation for header, types, and strings
0789          * sections, so we need to free all of them individually. It
0790          * might still have a cached contiguous raw data present,
0791          * which will be unconditionally freed below.
0792          */
0793         free(btf->hdr);
0794         free(btf->types_data);
0795         strset__free(btf->strs_set);
0796     }
0797     free(btf->raw_data);
0798     free(btf->raw_data_swapped);
0799     free(btf->type_offs);
0800     free(btf);
0801 }
0802 
0803 static struct btf *btf_new_empty(struct btf *base_btf)
0804 {
0805     struct btf *btf;
0806 
0807     btf = calloc(1, sizeof(*btf));
0808     if (!btf)
0809         return ERR_PTR(-ENOMEM);
0810 
0811     btf->nr_types = 0;
0812     btf->start_id = 1;
0813     btf->start_str_off = 0;
0814     btf->fd = -1;
0815     btf->ptr_sz = sizeof(void *);
0816     btf->swapped_endian = false;
0817 
0818     if (base_btf) {
0819         btf->base_btf = base_btf;
0820         btf->start_id = btf__type_cnt(base_btf);
0821         btf->start_str_off = base_btf->hdr->str_len;
0822     }
0823 
0824     /* +1 for empty string at offset 0 */
0825     btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1);
0826     btf->raw_data = calloc(1, btf->raw_size);
0827     if (!btf->raw_data) {
0828         free(btf);
0829         return ERR_PTR(-ENOMEM);
0830     }
0831 
0832     btf->hdr = btf->raw_data;
0833     btf->hdr->hdr_len = sizeof(struct btf_header);
0834     btf->hdr->magic = BTF_MAGIC;
0835     btf->hdr->version = BTF_VERSION;
0836 
0837     btf->types_data = btf->raw_data + btf->hdr->hdr_len;
0838     btf->strs_data = btf->raw_data + btf->hdr->hdr_len;
0839     btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */
0840 
0841     return btf;
0842 }
0843 
0844 struct btf *btf__new_empty(void)
0845 {
0846     return libbpf_ptr(btf_new_empty(NULL));
0847 }
0848 
0849 struct btf *btf__new_empty_split(struct btf *base_btf)
0850 {
0851     return libbpf_ptr(btf_new_empty(base_btf));
0852 }
0853 
0854 static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf)
0855 {
0856     struct btf *btf;
0857     int err;
0858 
0859     btf = calloc(1, sizeof(struct btf));
0860     if (!btf)
0861         return ERR_PTR(-ENOMEM);
0862 
0863     btf->nr_types = 0;
0864     btf->start_id = 1;
0865     btf->start_str_off = 0;
0866     btf->fd = -1;
0867 
0868     if (base_btf) {
0869         btf->base_btf = base_btf;
0870         btf->start_id = btf__type_cnt(base_btf);
0871         btf->start_str_off = base_btf->hdr->str_len;
0872     }
0873 
0874     btf->raw_data = malloc(size);
0875     if (!btf->raw_data) {
0876         err = -ENOMEM;
0877         goto done;
0878     }
0879     memcpy(btf->raw_data, data, size);
0880     btf->raw_size = size;
0881 
0882     btf->hdr = btf->raw_data;
0883     err = btf_parse_hdr(btf);
0884     if (err)
0885         goto done;
0886 
0887     btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off;
0888     btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off;
0889 
0890     err = btf_parse_str_sec(btf);
0891     err = err ?: btf_parse_type_sec(btf);
0892     if (err)
0893         goto done;
0894 
0895 done:
0896     if (err) {
0897         btf__free(btf);
0898         return ERR_PTR(err);
0899     }
0900 
0901     return btf;
0902 }
0903 
0904 struct btf *btf__new(const void *data, __u32 size)
0905 {
0906     return libbpf_ptr(btf_new(data, size, NULL));
0907 }
0908 
0909 static struct btf *btf_parse_elf(const char *path, struct btf *base_btf,
0910                  struct btf_ext **btf_ext)
0911 {
0912     Elf_Data *btf_data = NULL, *btf_ext_data = NULL;
0913     int err = 0, fd = -1, idx = 0;
0914     struct btf *btf = NULL;
0915     Elf_Scn *scn = NULL;
0916     Elf *elf = NULL;
0917     GElf_Ehdr ehdr;
0918     size_t shstrndx;
0919 
0920     if (elf_version(EV_CURRENT) == EV_NONE) {
0921         pr_warn("failed to init libelf for %s\n", path);
0922         return ERR_PTR(-LIBBPF_ERRNO__LIBELF);
0923     }
0924 
0925     fd = open(path, O_RDONLY | O_CLOEXEC);
0926     if (fd < 0) {
0927         err = -errno;
0928         pr_warn("failed to open %s: %s\n", path, strerror(errno));
0929         return ERR_PTR(err);
0930     }
0931 
0932     err = -LIBBPF_ERRNO__FORMAT;
0933 
0934     elf = elf_begin(fd, ELF_C_READ, NULL);
0935     if (!elf) {
0936         pr_warn("failed to open %s as ELF file\n", path);
0937         goto done;
0938     }
0939     if (!gelf_getehdr(elf, &ehdr)) {
0940         pr_warn("failed to get EHDR from %s\n", path);
0941         goto done;
0942     }
0943 
0944     if (elf_getshdrstrndx(elf, &shstrndx)) {
0945         pr_warn("failed to get section names section index for %s\n",
0946             path);
0947         goto done;
0948     }
0949 
0950     if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) {
0951         pr_warn("failed to get e_shstrndx from %s\n", path);
0952         goto done;
0953     }
0954 
0955     while ((scn = elf_nextscn(elf, scn)) != NULL) {
0956         GElf_Shdr sh;
0957         char *name;
0958 
0959         idx++;
0960         if (gelf_getshdr(scn, &sh) != &sh) {
0961             pr_warn("failed to get section(%d) header from %s\n",
0962                 idx, path);
0963             goto done;
0964         }
0965         name = elf_strptr(elf, shstrndx, sh.sh_name);
0966         if (!name) {
0967             pr_warn("failed to get section(%d) name from %s\n",
0968                 idx, path);
0969             goto done;
0970         }
0971         if (strcmp(name, BTF_ELF_SEC) == 0) {
0972             btf_data = elf_getdata(scn, 0);
0973             if (!btf_data) {
0974                 pr_warn("failed to get section(%d, %s) data from %s\n",
0975                     idx, name, path);
0976                 goto done;
0977             }
0978             continue;
0979         } else if (btf_ext && strcmp(name, BTF_EXT_ELF_SEC) == 0) {
0980             btf_ext_data = elf_getdata(scn, 0);
0981             if (!btf_ext_data) {
0982                 pr_warn("failed to get section(%d, %s) data from %s\n",
0983                     idx, name, path);
0984                 goto done;
0985             }
0986             continue;
0987         }
0988     }
0989 
0990     err = 0;
0991 
0992     if (!btf_data) {
0993         err = -ENOENT;
0994         goto done;
0995     }
0996     btf = btf_new(btf_data->d_buf, btf_data->d_size, base_btf);
0997     err = libbpf_get_error(btf);
0998     if (err)
0999         goto done;
1000 
1001     switch (gelf_getclass(elf)) {
1002     case ELFCLASS32:
1003         btf__set_pointer_size(btf, 4);
1004         break;
1005     case ELFCLASS64:
1006         btf__set_pointer_size(btf, 8);
1007         break;
1008     default:
1009         pr_warn("failed to get ELF class (bitness) for %s\n", path);
1010         break;
1011     }
1012 
1013     if (btf_ext && btf_ext_data) {
1014         *btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size);
1015         err = libbpf_get_error(*btf_ext);
1016         if (err)
1017             goto done;
1018     } else if (btf_ext) {
1019         *btf_ext = NULL;
1020     }
1021 done:
1022     if (elf)
1023         elf_end(elf);
1024     close(fd);
1025 
1026     if (!err)
1027         return btf;
1028 
1029     if (btf_ext)
1030         btf_ext__free(*btf_ext);
1031     btf__free(btf);
1032 
1033     return ERR_PTR(err);
1034 }
1035 
1036 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext)
1037 {
1038     return libbpf_ptr(btf_parse_elf(path, NULL, btf_ext));
1039 }
1040 
1041 struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf)
1042 {
1043     return libbpf_ptr(btf_parse_elf(path, base_btf, NULL));
1044 }
1045 
1046 static struct btf *btf_parse_raw(const char *path, struct btf *base_btf)
1047 {
1048     struct btf *btf = NULL;
1049     void *data = NULL;
1050     FILE *f = NULL;
1051     __u16 magic;
1052     int err = 0;
1053     long sz;
1054 
1055     f = fopen(path, "rb");
1056     if (!f) {
1057         err = -errno;
1058         goto err_out;
1059     }
1060 
1061     /* check BTF magic */
1062     if (fread(&magic, 1, sizeof(magic), f) < sizeof(magic)) {
1063         err = -EIO;
1064         goto err_out;
1065     }
1066     if (magic != BTF_MAGIC && magic != bswap_16(BTF_MAGIC)) {
1067         /* definitely not a raw BTF */
1068         err = -EPROTO;
1069         goto err_out;
1070     }
1071 
1072     /* get file size */
1073     if (fseek(f, 0, SEEK_END)) {
1074         err = -errno;
1075         goto err_out;
1076     }
1077     sz = ftell(f);
1078     if (sz < 0) {
1079         err = -errno;
1080         goto err_out;
1081     }
1082     /* rewind to the start */
1083     if (fseek(f, 0, SEEK_SET)) {
1084         err = -errno;
1085         goto err_out;
1086     }
1087 
1088     /* pre-alloc memory and read all of BTF data */
1089     data = malloc(sz);
1090     if (!data) {
1091         err = -ENOMEM;
1092         goto err_out;
1093     }
1094     if (fread(data, 1, sz, f) < sz) {
1095         err = -EIO;
1096         goto err_out;
1097     }
1098 
1099     /* finally parse BTF data */
1100     btf = btf_new(data, sz, base_btf);
1101 
1102 err_out:
1103     free(data);
1104     if (f)
1105         fclose(f);
1106     return err ? ERR_PTR(err) : btf;
1107 }
1108 
1109 struct btf *btf__parse_raw(const char *path)
1110 {
1111     return libbpf_ptr(btf_parse_raw(path, NULL));
1112 }
1113 
1114 struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf)
1115 {
1116     return libbpf_ptr(btf_parse_raw(path, base_btf));
1117 }
1118 
1119 static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext)
1120 {
1121     struct btf *btf;
1122     int err;
1123 
1124     if (btf_ext)
1125         *btf_ext = NULL;
1126 
1127     btf = btf_parse_raw(path, base_btf);
1128     err = libbpf_get_error(btf);
1129     if (!err)
1130         return btf;
1131     if (err != -EPROTO)
1132         return ERR_PTR(err);
1133     return btf_parse_elf(path, base_btf, btf_ext);
1134 }
1135 
1136 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext)
1137 {
1138     return libbpf_ptr(btf_parse(path, NULL, btf_ext));
1139 }
1140 
1141 struct btf *btf__parse_split(const char *path, struct btf *base_btf)
1142 {
1143     return libbpf_ptr(btf_parse(path, base_btf, NULL));
1144 }
1145 
1146 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1147 
1148 int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level)
1149 {
1150     LIBBPF_OPTS(bpf_btf_load_opts, opts);
1151     __u32 buf_sz = 0, raw_size;
1152     char *buf = NULL, *tmp;
1153     void *raw_data;
1154     int err = 0;
1155 
1156     if (btf->fd >= 0)
1157         return libbpf_err(-EEXIST);
1158     if (log_sz && !log_buf)
1159         return libbpf_err(-EINVAL);
1160 
1161     /* cache native raw data representation */
1162     raw_data = btf_get_raw_data(btf, &raw_size, false);
1163     if (!raw_data) {
1164         err = -ENOMEM;
1165         goto done;
1166     }
1167     btf->raw_size = raw_size;
1168     btf->raw_data = raw_data;
1169 
1170 retry_load:
1171     /* if log_level is 0, we won't provide log_buf/log_size to the kernel,
1172      * initially. Only if BTF loading fails, we bump log_level to 1 and
1173      * retry, using either auto-allocated or custom log_buf. This way
1174      * non-NULL custom log_buf provides a buffer just in case, but hopes
1175      * for successful load and no need for log_buf.
1176      */
1177     if (log_level) {
1178         /* if caller didn't provide custom log_buf, we'll keep
1179          * allocating our own progressively bigger buffers for BTF
1180          * verification log
1181          */
1182         if (!log_buf) {
1183             buf_sz = max((__u32)BPF_LOG_BUF_SIZE, buf_sz * 2);
1184             tmp = realloc(buf, buf_sz);
1185             if (!tmp) {
1186                 err = -ENOMEM;
1187                 goto done;
1188             }
1189             buf = tmp;
1190             buf[0] = '\0';
1191         }
1192 
1193         opts.log_buf = log_buf ? log_buf : buf;
1194         opts.log_size = log_buf ? log_sz : buf_sz;
1195         opts.log_level = log_level;
1196     }
1197 
1198     btf->fd = bpf_btf_load(raw_data, raw_size, &opts);
1199     if (btf->fd < 0) {
1200         /* time to turn on verbose mode and try again */
1201         if (log_level == 0) {
1202             log_level = 1;
1203             goto retry_load;
1204         }
1205         /* only retry if caller didn't provide custom log_buf, but
1206          * make sure we can never overflow buf_sz
1207          */
1208         if (!log_buf && errno == ENOSPC && buf_sz <= UINT_MAX / 2)
1209             goto retry_load;
1210 
1211         err = -errno;
1212         pr_warn("BTF loading error: %d\n", err);
1213         /* don't print out contents of custom log_buf */
1214         if (!log_buf && buf[0])
1215             pr_warn("-- BEGIN BTF LOAD LOG ---\n%s\n-- END BTF LOAD LOG --\n", buf);
1216     }
1217 
1218 done:
1219     free(buf);
1220     return libbpf_err(err);
1221 }
1222 
1223 int btf__load_into_kernel(struct btf *btf)
1224 {
1225     return btf_load_into_kernel(btf, NULL, 0, 0);
1226 }
1227 
1228 int btf__load(struct btf *) __attribute__((alias("btf__load_into_kernel")));
1229 
1230 int btf__fd(const struct btf *btf)
1231 {
1232     return btf->fd;
1233 }
1234 
1235 void btf__set_fd(struct btf *btf, int fd)
1236 {
1237     btf->fd = fd;
1238 }
1239 
1240 static const void *btf_strs_data(const struct btf *btf)
1241 {
1242     return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set);
1243 }
1244 
1245 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian)
1246 {
1247     struct btf_header *hdr = btf->hdr;
1248     struct btf_type *t;
1249     void *data, *p;
1250     __u32 data_sz;
1251     int i;
1252 
1253     data = swap_endian ? btf->raw_data_swapped : btf->raw_data;
1254     if (data) {
1255         *size = btf->raw_size;
1256         return data;
1257     }
1258 
1259     data_sz = hdr->hdr_len + hdr->type_len + hdr->str_len;
1260     data = calloc(1, data_sz);
1261     if (!data)
1262         return NULL;
1263     p = data;
1264 
1265     memcpy(p, hdr, hdr->hdr_len);
1266     if (swap_endian)
1267         btf_bswap_hdr(p);
1268     p += hdr->hdr_len;
1269 
1270     memcpy(p, btf->types_data, hdr->type_len);
1271     if (swap_endian) {
1272         for (i = 0; i < btf->nr_types; i++) {
1273             t = p + btf->type_offs[i];
1274             /* btf_bswap_type_rest() relies on native t->info, so
1275              * we swap base type info after we swapped all the
1276              * additional information
1277              */
1278             if (btf_bswap_type_rest(t))
1279                 goto err_out;
1280             btf_bswap_type_base(t);
1281         }
1282     }
1283     p += hdr->type_len;
1284 
1285     memcpy(p, btf_strs_data(btf), hdr->str_len);
1286     p += hdr->str_len;
1287 
1288     *size = data_sz;
1289     return data;
1290 err_out:
1291     free(data);
1292     return NULL;
1293 }
1294 
1295 const void *btf__raw_data(const struct btf *btf_ro, __u32 *size)
1296 {
1297     struct btf *btf = (struct btf *)btf_ro;
1298     __u32 data_sz;
1299     void *data;
1300 
1301     data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian);
1302     if (!data)
1303         return errno = ENOMEM, NULL;
1304 
1305     btf->raw_size = data_sz;
1306     if (btf->swapped_endian)
1307         btf->raw_data_swapped = data;
1308     else
1309         btf->raw_data = data;
1310     *size = data_sz;
1311     return data;
1312 }
1313 
1314 __attribute__((alias("btf__raw_data")))
1315 const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1316 
1317 const char *btf__str_by_offset(const struct btf *btf, __u32 offset)
1318 {
1319     if (offset < btf->start_str_off)
1320         return btf__str_by_offset(btf->base_btf, offset);
1321     else if (offset - btf->start_str_off < btf->hdr->str_len)
1322         return btf_strs_data(btf) + (offset - btf->start_str_off);
1323     else
1324         return errno = EINVAL, NULL;
1325 }
1326 
1327 const char *btf__name_by_offset(const struct btf *btf, __u32 offset)
1328 {
1329     return btf__str_by_offset(btf, offset);
1330 }
1331 
1332 struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf)
1333 {
1334     struct bpf_btf_info btf_info;
1335     __u32 len = sizeof(btf_info);
1336     __u32 last_size;
1337     struct btf *btf;
1338     void *ptr;
1339     int err;
1340 
1341     /* we won't know btf_size until we call bpf_obj_get_info_by_fd(). so
1342      * let's start with a sane default - 4KiB here - and resize it only if
1343      * bpf_obj_get_info_by_fd() needs a bigger buffer.
1344      */
1345     last_size = 4096;
1346     ptr = malloc(last_size);
1347     if (!ptr)
1348         return ERR_PTR(-ENOMEM);
1349 
1350     memset(&btf_info, 0, sizeof(btf_info));
1351     btf_info.btf = ptr_to_u64(ptr);
1352     btf_info.btf_size = last_size;
1353     err = bpf_obj_get_info_by_fd(btf_fd, &btf_info, &len);
1354 
1355     if (!err && btf_info.btf_size > last_size) {
1356         void *temp_ptr;
1357 
1358         last_size = btf_info.btf_size;
1359         temp_ptr = realloc(ptr, last_size);
1360         if (!temp_ptr) {
1361             btf = ERR_PTR(-ENOMEM);
1362             goto exit_free;
1363         }
1364         ptr = temp_ptr;
1365 
1366         len = sizeof(btf_info);
1367         memset(&btf_info, 0, sizeof(btf_info));
1368         btf_info.btf = ptr_to_u64(ptr);
1369         btf_info.btf_size = last_size;
1370 
1371         err = bpf_obj_get_info_by_fd(btf_fd, &btf_info, &len);
1372     }
1373 
1374     if (err || btf_info.btf_size > last_size) {
1375         btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG);
1376         goto exit_free;
1377     }
1378 
1379     btf = btf_new(ptr, btf_info.btf_size, base_btf);
1380 
1381 exit_free:
1382     free(ptr);
1383     return btf;
1384 }
1385 
1386 struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf)
1387 {
1388     struct btf *btf;
1389     int btf_fd;
1390 
1391     btf_fd = bpf_btf_get_fd_by_id(id);
1392     if (btf_fd < 0)
1393         return libbpf_err_ptr(-errno);
1394 
1395     btf = btf_get_from_fd(btf_fd, base_btf);
1396     close(btf_fd);
1397 
1398     return libbpf_ptr(btf);
1399 }
1400 
1401 struct btf *btf__load_from_kernel_by_id(__u32 id)
1402 {
1403     return btf__load_from_kernel_by_id_split(id, NULL);
1404 }
1405 
1406 static void btf_invalidate_raw_data(struct btf *btf)
1407 {
1408     if (btf->raw_data) {
1409         free(btf->raw_data);
1410         btf->raw_data = NULL;
1411     }
1412     if (btf->raw_data_swapped) {
1413         free(btf->raw_data_swapped);
1414         btf->raw_data_swapped = NULL;
1415     }
1416 }
1417 
1418 /* Ensure BTF is ready to be modified (by splitting into a three memory
1419  * regions for header, types, and strings). Also invalidate cached
1420  * raw_data, if any.
1421  */
1422 static int btf_ensure_modifiable(struct btf *btf)
1423 {
1424     void *hdr, *types;
1425     struct strset *set = NULL;
1426     int err = -ENOMEM;
1427 
1428     if (btf_is_modifiable(btf)) {
1429         /* any BTF modification invalidates raw_data */
1430         btf_invalidate_raw_data(btf);
1431         return 0;
1432     }
1433 
1434     /* split raw data into three memory regions */
1435     hdr = malloc(btf->hdr->hdr_len);
1436     types = malloc(btf->hdr->type_len);
1437     if (!hdr || !types)
1438         goto err_out;
1439 
1440     memcpy(hdr, btf->hdr, btf->hdr->hdr_len);
1441     memcpy(types, btf->types_data, btf->hdr->type_len);
1442 
1443     /* build lookup index for all strings */
1444     set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len);
1445     if (IS_ERR(set)) {
1446         err = PTR_ERR(set);
1447         goto err_out;
1448     }
1449 
1450     /* only when everything was successful, update internal state */
1451     btf->hdr = hdr;
1452     btf->types_data = types;
1453     btf->types_data_cap = btf->hdr->type_len;
1454     btf->strs_data = NULL;
1455     btf->strs_set = set;
1456     /* if BTF was created from scratch, all strings are guaranteed to be
1457      * unique and deduplicated
1458      */
1459     if (btf->hdr->str_len == 0)
1460         btf->strs_deduped = true;
1461     if (!btf->base_btf && btf->hdr->str_len == 1)
1462         btf->strs_deduped = true;
1463 
1464     /* invalidate raw_data representation */
1465     btf_invalidate_raw_data(btf);
1466 
1467     return 0;
1468 
1469 err_out:
1470     strset__free(set);
1471     free(hdr);
1472     free(types);
1473     return err;
1474 }
1475 
1476 /* Find an offset in BTF string section that corresponds to a given string *s*.
1477  * Returns:
1478  *   - >0 offset into string section, if string is found;
1479  *   - -ENOENT, if string is not in the string section;
1480  *   - <0, on any other error.
1481  */
1482 int btf__find_str(struct btf *btf, const char *s)
1483 {
1484     int off;
1485 
1486     if (btf->base_btf) {
1487         off = btf__find_str(btf->base_btf, s);
1488         if (off != -ENOENT)
1489             return off;
1490     }
1491 
1492     /* BTF needs to be in a modifiable state to build string lookup index */
1493     if (btf_ensure_modifiable(btf))
1494         return libbpf_err(-ENOMEM);
1495 
1496     off = strset__find_str(btf->strs_set, s);
1497     if (off < 0)
1498         return libbpf_err(off);
1499 
1500     return btf->start_str_off + off;
1501 }
1502 
1503 /* Add a string s to the BTF string section.
1504  * Returns:
1505  *   - > 0 offset into string section, on success;
1506  *   - < 0, on error.
1507  */
1508 int btf__add_str(struct btf *btf, const char *s)
1509 {
1510     int off;
1511 
1512     if (btf->base_btf) {
1513         off = btf__find_str(btf->base_btf, s);
1514         if (off != -ENOENT)
1515             return off;
1516     }
1517 
1518     if (btf_ensure_modifiable(btf))
1519         return libbpf_err(-ENOMEM);
1520 
1521     off = strset__add_str(btf->strs_set, s);
1522     if (off < 0)
1523         return libbpf_err(off);
1524 
1525     btf->hdr->str_len = strset__data_size(btf->strs_set);
1526 
1527     return btf->start_str_off + off;
1528 }
1529 
1530 static void *btf_add_type_mem(struct btf *btf, size_t add_sz)
1531 {
1532     return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1,
1533                   btf->hdr->type_len, UINT_MAX, add_sz);
1534 }
1535 
1536 static void btf_type_inc_vlen(struct btf_type *t)
1537 {
1538     t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, btf_kflag(t));
1539 }
1540 
1541 static int btf_commit_type(struct btf *btf, int data_sz)
1542 {
1543     int err;
1544 
1545     err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
1546     if (err)
1547         return libbpf_err(err);
1548 
1549     btf->hdr->type_len += data_sz;
1550     btf->hdr->str_off += data_sz;
1551     btf->nr_types++;
1552     return btf->start_id + btf->nr_types - 1;
1553 }
1554 
1555 struct btf_pipe {
1556     const struct btf *src;
1557     struct btf *dst;
1558     struct hashmap *str_off_map; /* map string offsets from src to dst */
1559 };
1560 
1561 static int btf_rewrite_str(__u32 *str_off, void *ctx)
1562 {
1563     struct btf_pipe *p = ctx;
1564     void *mapped_off;
1565     int off, err;
1566 
1567     if (!*str_off) /* nothing to do for empty strings */
1568         return 0;
1569 
1570     if (p->str_off_map &&
1571         hashmap__find(p->str_off_map, (void *)(long)*str_off, &mapped_off)) {
1572         *str_off = (__u32)(long)mapped_off;
1573         return 0;
1574     }
1575 
1576     off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off));
1577     if (off < 0)
1578         return off;
1579 
1580     /* Remember string mapping from src to dst.  It avoids
1581      * performing expensive string comparisons.
1582      */
1583     if (p->str_off_map) {
1584         err = hashmap__append(p->str_off_map, (void *)(long)*str_off, (void *)(long)off);
1585         if (err)
1586             return err;
1587     }
1588 
1589     *str_off = off;
1590     return 0;
1591 }
1592 
1593 int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type)
1594 {
1595     struct btf_pipe p = { .src = src_btf, .dst = btf };
1596     struct btf_type *t;
1597     int sz, err;
1598 
1599     sz = btf_type_size(src_type);
1600     if (sz < 0)
1601         return libbpf_err(sz);
1602 
1603     /* deconstruct BTF, if necessary, and invalidate raw_data */
1604     if (btf_ensure_modifiable(btf))
1605         return libbpf_err(-ENOMEM);
1606 
1607     t = btf_add_type_mem(btf, sz);
1608     if (!t)
1609         return libbpf_err(-ENOMEM);
1610 
1611     memcpy(t, src_type, sz);
1612 
1613     err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
1614     if (err)
1615         return libbpf_err(err);
1616 
1617     return btf_commit_type(btf, sz);
1618 }
1619 
1620 static int btf_rewrite_type_ids(__u32 *type_id, void *ctx)
1621 {
1622     struct btf *btf = ctx;
1623 
1624     if (!*type_id) /* nothing to do for VOID references */
1625         return 0;
1626 
1627     /* we haven't updated btf's type count yet, so
1628      * btf->start_id + btf->nr_types - 1 is the type ID offset we should
1629      * add to all newly added BTF types
1630      */
1631     *type_id += btf->start_id + btf->nr_types - 1;
1632     return 0;
1633 }
1634 
1635 static size_t btf_dedup_identity_hash_fn(const void *key, void *ctx);
1636 static bool btf_dedup_equal_fn(const void *k1, const void *k2, void *ctx);
1637 
1638 int btf__add_btf(struct btf *btf, const struct btf *src_btf)
1639 {
1640     struct btf_pipe p = { .src = src_btf, .dst = btf };
1641     int data_sz, sz, cnt, i, err, old_strs_len;
1642     __u32 *off;
1643     void *t;
1644 
1645     /* appending split BTF isn't supported yet */
1646     if (src_btf->base_btf)
1647         return libbpf_err(-ENOTSUP);
1648 
1649     /* deconstruct BTF, if necessary, and invalidate raw_data */
1650     if (btf_ensure_modifiable(btf))
1651         return libbpf_err(-ENOMEM);
1652 
1653     /* remember original strings section size if we have to roll back
1654      * partial strings section changes
1655      */
1656     old_strs_len = btf->hdr->str_len;
1657 
1658     data_sz = src_btf->hdr->type_len;
1659     cnt = btf__type_cnt(src_btf) - 1;
1660 
1661     /* pre-allocate enough memory for new types */
1662     t = btf_add_type_mem(btf, data_sz);
1663     if (!t)
1664         return libbpf_err(-ENOMEM);
1665 
1666     /* pre-allocate enough memory for type offset index for new types */
1667     off = btf_add_type_offs_mem(btf, cnt);
1668     if (!off)
1669         return libbpf_err(-ENOMEM);
1670 
1671     /* Map the string offsets from src_btf to the offsets from btf to improve performance */
1672     p.str_off_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL);
1673     if (IS_ERR(p.str_off_map))
1674         return libbpf_err(-ENOMEM);
1675 
1676     /* bulk copy types data for all types from src_btf */
1677     memcpy(t, src_btf->types_data, data_sz);
1678 
1679     for (i = 0; i < cnt; i++) {
1680         sz = btf_type_size(t);
1681         if (sz < 0) {
1682             /* unlikely, has to be corrupted src_btf */
1683             err = sz;
1684             goto err_out;
1685         }
1686 
1687         /* fill out type ID to type offset mapping for lookups by type ID */
1688         *off = t - btf->types_data;
1689 
1690         /* add, dedup, and remap strings referenced by this BTF type */
1691         err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
1692         if (err)
1693             goto err_out;
1694 
1695         /* remap all type IDs referenced from this BTF type */
1696         err = btf_type_visit_type_ids(t, btf_rewrite_type_ids, btf);
1697         if (err)
1698             goto err_out;
1699 
1700         /* go to next type data and type offset index entry */
1701         t += sz;
1702         off++;
1703     }
1704 
1705     /* Up until now any of the copied type data was effectively invisible,
1706      * so if we exited early before this point due to error, BTF would be
1707      * effectively unmodified. There would be extra internal memory
1708      * pre-allocated, but it would not be available for querying.  But now
1709      * that we've copied and rewritten all the data successfully, we can
1710      * update type count and various internal offsets and sizes to
1711      * "commit" the changes and made them visible to the outside world.
1712      */
1713     btf->hdr->type_len += data_sz;
1714     btf->hdr->str_off += data_sz;
1715     btf->nr_types += cnt;
1716 
1717     hashmap__free(p.str_off_map);
1718 
1719     /* return type ID of the first added BTF type */
1720     return btf->start_id + btf->nr_types - cnt;
1721 err_out:
1722     /* zero out preallocated memory as if it was just allocated with
1723      * libbpf_add_mem()
1724      */
1725     memset(btf->types_data + btf->hdr->type_len, 0, data_sz);
1726     memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len);
1727 
1728     /* and now restore original strings section size; types data size
1729      * wasn't modified, so doesn't need restoring, see big comment above */
1730     btf->hdr->str_len = old_strs_len;
1731 
1732     hashmap__free(p.str_off_map);
1733 
1734     return libbpf_err(err);
1735 }
1736 
1737 /*
1738  * Append new BTF_KIND_INT type with:
1739  *   - *name* - non-empty, non-NULL type name;
1740  *   - *sz* - power-of-2 (1, 2, 4, ..) size of the type, in bytes;
1741  *   - encoding is a combination of BTF_INT_SIGNED, BTF_INT_CHAR, BTF_INT_BOOL.
1742  * Returns:
1743  *   - >0, type ID of newly added BTF type;
1744  *   - <0, on error.
1745  */
1746 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding)
1747 {
1748     struct btf_type *t;
1749     int sz, name_off;
1750 
1751     /* non-empty name */
1752     if (!name || !name[0])
1753         return libbpf_err(-EINVAL);
1754     /* byte_sz must be power of 2 */
1755     if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 16)
1756         return libbpf_err(-EINVAL);
1757     if (encoding & ~(BTF_INT_SIGNED | BTF_INT_CHAR | BTF_INT_BOOL))
1758         return libbpf_err(-EINVAL);
1759 
1760     /* deconstruct BTF, if necessary, and invalidate raw_data */
1761     if (btf_ensure_modifiable(btf))
1762         return libbpf_err(-ENOMEM);
1763 
1764     sz = sizeof(struct btf_type) + sizeof(int);
1765     t = btf_add_type_mem(btf, sz);
1766     if (!t)
1767         return libbpf_err(-ENOMEM);
1768 
1769     /* if something goes wrong later, we might end up with an extra string,
1770      * but that shouldn't be a problem, because BTF can't be constructed
1771      * completely anyway and will most probably be just discarded
1772      */
1773     name_off = btf__add_str(btf, name);
1774     if (name_off < 0)
1775         return name_off;
1776 
1777     t->name_off = name_off;
1778     t->info = btf_type_info(BTF_KIND_INT, 0, 0);
1779     t->size = byte_sz;
1780     /* set INT info, we don't allow setting legacy bit offset/size */
1781     *(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8);
1782 
1783     return btf_commit_type(btf, sz);
1784 }
1785 
1786 /*
1787  * Append new BTF_KIND_FLOAT type with:
1788  *   - *name* - non-empty, non-NULL type name;
1789  *   - *sz* - size of the type, in bytes;
1790  * Returns:
1791  *   - >0, type ID of newly added BTF type;
1792  *   - <0, on error.
1793  */
1794 int btf__add_float(struct btf *btf, const char *name, size_t byte_sz)
1795 {
1796     struct btf_type *t;
1797     int sz, name_off;
1798 
1799     /* non-empty name */
1800     if (!name || !name[0])
1801         return libbpf_err(-EINVAL);
1802 
1803     /* byte_sz must be one of the explicitly allowed values */
1804     if (byte_sz != 2 && byte_sz != 4 && byte_sz != 8 && byte_sz != 12 &&
1805         byte_sz != 16)
1806         return libbpf_err(-EINVAL);
1807 
1808     if (btf_ensure_modifiable(btf))
1809         return libbpf_err(-ENOMEM);
1810 
1811     sz = sizeof(struct btf_type);
1812     t = btf_add_type_mem(btf, sz);
1813     if (!t)
1814         return libbpf_err(-ENOMEM);
1815 
1816     name_off = btf__add_str(btf, name);
1817     if (name_off < 0)
1818         return name_off;
1819 
1820     t->name_off = name_off;
1821     t->info = btf_type_info(BTF_KIND_FLOAT, 0, 0);
1822     t->size = byte_sz;
1823 
1824     return btf_commit_type(btf, sz);
1825 }
1826 
1827 /* it's completely legal to append BTF types with type IDs pointing forward to
1828  * types that haven't been appended yet, so we only make sure that id looks
1829  * sane, we can't guarantee that ID will always be valid
1830  */
1831 static int validate_type_id(int id)
1832 {
1833     if (id < 0 || id > BTF_MAX_NR_TYPES)
1834         return -EINVAL;
1835     return 0;
1836 }
1837 
1838 /* generic append function for PTR, TYPEDEF, CONST/VOLATILE/RESTRICT */
1839 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id)
1840 {
1841     struct btf_type *t;
1842     int sz, name_off = 0;
1843 
1844     if (validate_type_id(ref_type_id))
1845         return libbpf_err(-EINVAL);
1846 
1847     if (btf_ensure_modifiable(btf))
1848         return libbpf_err(-ENOMEM);
1849 
1850     sz = sizeof(struct btf_type);
1851     t = btf_add_type_mem(btf, sz);
1852     if (!t)
1853         return libbpf_err(-ENOMEM);
1854 
1855     if (name && name[0]) {
1856         name_off = btf__add_str(btf, name);
1857         if (name_off < 0)
1858             return name_off;
1859     }
1860 
1861     t->name_off = name_off;
1862     t->info = btf_type_info(kind, 0, 0);
1863     t->type = ref_type_id;
1864 
1865     return btf_commit_type(btf, sz);
1866 }
1867 
1868 /*
1869  * Append new BTF_KIND_PTR type with:
1870  *   - *ref_type_id* - referenced type ID, it might not exist yet;
1871  * Returns:
1872  *   - >0, type ID of newly added BTF type;
1873  *   - <0, on error.
1874  */
1875 int btf__add_ptr(struct btf *btf, int ref_type_id)
1876 {
1877     return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id);
1878 }
1879 
1880 /*
1881  * Append new BTF_KIND_ARRAY type with:
1882  *   - *index_type_id* - type ID of the type describing array index;
1883  *   - *elem_type_id* - type ID of the type describing array element;
1884  *   - *nr_elems* - the size of the array;
1885  * Returns:
1886  *   - >0, type ID of newly added BTF type;
1887  *   - <0, on error.
1888  */
1889 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems)
1890 {
1891     struct btf_type *t;
1892     struct btf_array *a;
1893     int sz;
1894 
1895     if (validate_type_id(index_type_id) || validate_type_id(elem_type_id))
1896         return libbpf_err(-EINVAL);
1897 
1898     if (btf_ensure_modifiable(btf))
1899         return libbpf_err(-ENOMEM);
1900 
1901     sz = sizeof(struct btf_type) + sizeof(struct btf_array);
1902     t = btf_add_type_mem(btf, sz);
1903     if (!t)
1904         return libbpf_err(-ENOMEM);
1905 
1906     t->name_off = 0;
1907     t->info = btf_type_info(BTF_KIND_ARRAY, 0, 0);
1908     t->size = 0;
1909 
1910     a = btf_array(t);
1911     a->type = elem_type_id;
1912     a->index_type = index_type_id;
1913     a->nelems = nr_elems;
1914 
1915     return btf_commit_type(btf, sz);
1916 }
1917 
1918 /* generic STRUCT/UNION append function */
1919 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz)
1920 {
1921     struct btf_type *t;
1922     int sz, name_off = 0;
1923 
1924     if (btf_ensure_modifiable(btf))
1925         return libbpf_err(-ENOMEM);
1926 
1927     sz = sizeof(struct btf_type);
1928     t = btf_add_type_mem(btf, sz);
1929     if (!t)
1930         return libbpf_err(-ENOMEM);
1931 
1932     if (name && name[0]) {
1933         name_off = btf__add_str(btf, name);
1934         if (name_off < 0)
1935             return name_off;
1936     }
1937 
1938     /* start out with vlen=0 and no kflag; this will be adjusted when
1939      * adding each member
1940      */
1941     t->name_off = name_off;
1942     t->info = btf_type_info(kind, 0, 0);
1943     t->size = bytes_sz;
1944 
1945     return btf_commit_type(btf, sz);
1946 }
1947 
1948 /*
1949  * Append new BTF_KIND_STRUCT type with:
1950  *   - *name* - name of the struct, can be NULL or empty for anonymous structs;
1951  *   - *byte_sz* - size of the struct, in bytes;
1952  *
1953  * Struct initially has no fields in it. Fields can be added by
1954  * btf__add_field() right after btf__add_struct() succeeds.
1955  *
1956  * Returns:
1957  *   - >0, type ID of newly added BTF type;
1958  *   - <0, on error.
1959  */
1960 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz)
1961 {
1962     return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz);
1963 }
1964 
1965 /*
1966  * Append new BTF_KIND_UNION type with:
1967  *   - *name* - name of the union, can be NULL or empty for anonymous union;
1968  *   - *byte_sz* - size of the union, in bytes;
1969  *
1970  * Union initially has no fields in it. Fields can be added by
1971  * btf__add_field() right after btf__add_union() succeeds. All fields
1972  * should have *bit_offset* of 0.
1973  *
1974  * Returns:
1975  *   - >0, type ID of newly added BTF type;
1976  *   - <0, on error.
1977  */
1978 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz)
1979 {
1980     return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz);
1981 }
1982 
1983 static struct btf_type *btf_last_type(struct btf *btf)
1984 {
1985     return btf_type_by_id(btf, btf__type_cnt(btf) - 1);
1986 }
1987 
1988 /*
1989  * Append new field for the current STRUCT/UNION type with:
1990  *   - *name* - name of the field, can be NULL or empty for anonymous field;
1991  *   - *type_id* - type ID for the type describing field type;
1992  *   - *bit_offset* - bit offset of the start of the field within struct/union;
1993  *   - *bit_size* - bit size of a bitfield, 0 for non-bitfield fields;
1994  * Returns:
1995  *   -  0, on success;
1996  *   - <0, on error.
1997  */
1998 int btf__add_field(struct btf *btf, const char *name, int type_id,
1999            __u32 bit_offset, __u32 bit_size)
2000 {
2001     struct btf_type *t;
2002     struct btf_member *m;
2003     bool is_bitfield;
2004     int sz, name_off = 0;
2005 
2006     /* last type should be union/struct */
2007     if (btf->nr_types == 0)
2008         return libbpf_err(-EINVAL);
2009     t = btf_last_type(btf);
2010     if (!btf_is_composite(t))
2011         return libbpf_err(-EINVAL);
2012 
2013     if (validate_type_id(type_id))
2014         return libbpf_err(-EINVAL);
2015     /* best-effort bit field offset/size enforcement */
2016     is_bitfield = bit_size || (bit_offset % 8 != 0);
2017     if (is_bitfield && (bit_size == 0 || bit_size > 255 || bit_offset > 0xffffff))
2018         return libbpf_err(-EINVAL);
2019 
2020     /* only offset 0 is allowed for unions */
2021     if (btf_is_union(t) && bit_offset)
2022         return libbpf_err(-EINVAL);
2023 
2024     /* decompose and invalidate raw data */
2025     if (btf_ensure_modifiable(btf))
2026         return libbpf_err(-ENOMEM);
2027 
2028     sz = sizeof(struct btf_member);
2029     m = btf_add_type_mem(btf, sz);
2030     if (!m)
2031         return libbpf_err(-ENOMEM);
2032 
2033     if (name && name[0]) {
2034         name_off = btf__add_str(btf, name);
2035         if (name_off < 0)
2036             return name_off;
2037     }
2038 
2039     m->name_off = name_off;
2040     m->type = type_id;
2041     m->offset = bit_offset | (bit_size << 24);
2042 
2043     /* btf_add_type_mem can invalidate t pointer */
2044     t = btf_last_type(btf);
2045     /* update parent type's vlen and kflag */
2046     t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, is_bitfield || btf_kflag(t));
2047 
2048     btf->hdr->type_len += sz;
2049     btf->hdr->str_off += sz;
2050     return 0;
2051 }
2052 
2053 static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz,
2054                    bool is_signed, __u8 kind)
2055 {
2056     struct btf_type *t;
2057     int sz, name_off = 0;
2058 
2059     /* byte_sz must be power of 2 */
2060     if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 8)
2061         return libbpf_err(-EINVAL);
2062 
2063     if (btf_ensure_modifiable(btf))
2064         return libbpf_err(-ENOMEM);
2065 
2066     sz = sizeof(struct btf_type);
2067     t = btf_add_type_mem(btf, sz);
2068     if (!t)
2069         return libbpf_err(-ENOMEM);
2070 
2071     if (name && name[0]) {
2072         name_off = btf__add_str(btf, name);
2073         if (name_off < 0)
2074             return name_off;
2075     }
2076 
2077     /* start out with vlen=0; it will be adjusted when adding enum values */
2078     t->name_off = name_off;
2079     t->info = btf_type_info(kind, 0, is_signed);
2080     t->size = byte_sz;
2081 
2082     return btf_commit_type(btf, sz);
2083 }
2084 
2085 /*
2086  * Append new BTF_KIND_ENUM type with:
2087  *   - *name* - name of the enum, can be NULL or empty for anonymous enums;
2088  *   - *byte_sz* - size of the enum, in bytes.
2089  *
2090  * Enum initially has no enum values in it (and corresponds to enum forward
2091  * declaration). Enumerator values can be added by btf__add_enum_value()
2092  * immediately after btf__add_enum() succeeds.
2093  *
2094  * Returns:
2095  *   - >0, type ID of newly added BTF type;
2096  *   - <0, on error.
2097  */
2098 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz)
2099 {
2100     /*
2101      * set the signedness to be unsigned, it will change to signed
2102      * if any later enumerator is negative.
2103      */
2104     return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM);
2105 }
2106 
2107 /*
2108  * Append new enum value for the current ENUM type with:
2109  *   - *name* - name of the enumerator value, can't be NULL or empty;
2110  *   - *value* - integer value corresponding to enum value *name*;
2111  * Returns:
2112  *   -  0, on success;
2113  *   - <0, on error.
2114  */
2115 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value)
2116 {
2117     struct btf_type *t;
2118     struct btf_enum *v;
2119     int sz, name_off;
2120 
2121     /* last type should be BTF_KIND_ENUM */
2122     if (btf->nr_types == 0)
2123         return libbpf_err(-EINVAL);
2124     t = btf_last_type(btf);
2125     if (!btf_is_enum(t))
2126         return libbpf_err(-EINVAL);
2127 
2128     /* non-empty name */
2129     if (!name || !name[0])
2130         return libbpf_err(-EINVAL);
2131     if (value < INT_MIN || value > UINT_MAX)
2132         return libbpf_err(-E2BIG);
2133 
2134     /* decompose and invalidate raw data */
2135     if (btf_ensure_modifiable(btf))
2136         return libbpf_err(-ENOMEM);
2137 
2138     sz = sizeof(struct btf_enum);
2139     v = btf_add_type_mem(btf, sz);
2140     if (!v)
2141         return libbpf_err(-ENOMEM);
2142 
2143     name_off = btf__add_str(btf, name);
2144     if (name_off < 0)
2145         return name_off;
2146 
2147     v->name_off = name_off;
2148     v->val = value;
2149 
2150     /* update parent type's vlen */
2151     t = btf_last_type(btf);
2152     btf_type_inc_vlen(t);
2153 
2154     /* if negative value, set signedness to signed */
2155     if (value < 0)
2156         t->info = btf_type_info(btf_kind(t), btf_vlen(t), true);
2157 
2158     btf->hdr->type_len += sz;
2159     btf->hdr->str_off += sz;
2160     return 0;
2161 }
2162 
2163 /*
2164  * Append new BTF_KIND_ENUM64 type with:
2165  *   - *name* - name of the enum, can be NULL or empty for anonymous enums;
2166  *   - *byte_sz* - size of the enum, in bytes.
2167  *   - *is_signed* - whether the enum values are signed or not;
2168  *
2169  * Enum initially has no enum values in it (and corresponds to enum forward
2170  * declaration). Enumerator values can be added by btf__add_enum64_value()
2171  * immediately after btf__add_enum64() succeeds.
2172  *
2173  * Returns:
2174  *   - >0, type ID of newly added BTF type;
2175  *   - <0, on error.
2176  */
2177 int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz,
2178             bool is_signed)
2179 {
2180     return btf_add_enum_common(btf, name, byte_sz, is_signed,
2181                    BTF_KIND_ENUM64);
2182 }
2183 
2184 /*
2185  * Append new enum value for the current ENUM64 type with:
2186  *   - *name* - name of the enumerator value, can't be NULL or empty;
2187  *   - *value* - integer value corresponding to enum value *name*;
2188  * Returns:
2189  *   -  0, on success;
2190  *   - <0, on error.
2191  */
2192 int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value)
2193 {
2194     struct btf_enum64 *v;
2195     struct btf_type *t;
2196     int sz, name_off;
2197 
2198     /* last type should be BTF_KIND_ENUM64 */
2199     if (btf->nr_types == 0)
2200         return libbpf_err(-EINVAL);
2201     t = btf_last_type(btf);
2202     if (!btf_is_enum64(t))
2203         return libbpf_err(-EINVAL);
2204 
2205     /* non-empty name */
2206     if (!name || !name[0])
2207         return libbpf_err(-EINVAL);
2208 
2209     /* decompose and invalidate raw data */
2210     if (btf_ensure_modifiable(btf))
2211         return libbpf_err(-ENOMEM);
2212 
2213     sz = sizeof(struct btf_enum64);
2214     v = btf_add_type_mem(btf, sz);
2215     if (!v)
2216         return libbpf_err(-ENOMEM);
2217 
2218     name_off = btf__add_str(btf, name);
2219     if (name_off < 0)
2220         return name_off;
2221 
2222     v->name_off = name_off;
2223     v->val_lo32 = (__u32)value;
2224     v->val_hi32 = value >> 32;
2225 
2226     /* update parent type's vlen */
2227     t = btf_last_type(btf);
2228     btf_type_inc_vlen(t);
2229 
2230     btf->hdr->type_len += sz;
2231     btf->hdr->str_off += sz;
2232     return 0;
2233 }
2234 
2235 /*
2236  * Append new BTF_KIND_FWD type with:
2237  *   - *name*, non-empty/non-NULL name;
2238  *   - *fwd_kind*, kind of forward declaration, one of BTF_FWD_STRUCT,
2239  *     BTF_FWD_UNION, or BTF_FWD_ENUM;
2240  * Returns:
2241  *   - >0, type ID of newly added BTF type;
2242  *   - <0, on error.
2243  */
2244 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind)
2245 {
2246     if (!name || !name[0])
2247         return libbpf_err(-EINVAL);
2248 
2249     switch (fwd_kind) {
2250     case BTF_FWD_STRUCT:
2251     case BTF_FWD_UNION: {
2252         struct btf_type *t;
2253         int id;
2254 
2255         id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0);
2256         if (id <= 0)
2257             return id;
2258         t = btf_type_by_id(btf, id);
2259         t->info = btf_type_info(BTF_KIND_FWD, 0, fwd_kind == BTF_FWD_UNION);
2260         return id;
2261     }
2262     case BTF_FWD_ENUM:
2263         /* enum forward in BTF currently is just an enum with no enum
2264          * values; we also assume a standard 4-byte size for it
2265          */
2266         return btf__add_enum(btf, name, sizeof(int));
2267     default:
2268         return libbpf_err(-EINVAL);
2269     }
2270 }
2271 
2272 /*
2273  * Append new BTF_KING_TYPEDEF type with:
2274  *   - *name*, non-empty/non-NULL name;
2275  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2276  * Returns:
2277  *   - >0, type ID of newly added BTF type;
2278  *   - <0, on error.
2279  */
2280 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id)
2281 {
2282     if (!name || !name[0])
2283         return libbpf_err(-EINVAL);
2284 
2285     return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id);
2286 }
2287 
2288 /*
2289  * Append new BTF_KIND_VOLATILE type with:
2290  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2291  * Returns:
2292  *   - >0, type ID of newly added BTF type;
2293  *   - <0, on error.
2294  */
2295 int btf__add_volatile(struct btf *btf, int ref_type_id)
2296 {
2297     return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id);
2298 }
2299 
2300 /*
2301  * Append new BTF_KIND_CONST type with:
2302  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2303  * Returns:
2304  *   - >0, type ID of newly added BTF type;
2305  *   - <0, on error.
2306  */
2307 int btf__add_const(struct btf *btf, int ref_type_id)
2308 {
2309     return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id);
2310 }
2311 
2312 /*
2313  * Append new BTF_KIND_RESTRICT type with:
2314  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2315  * Returns:
2316  *   - >0, type ID of newly added BTF type;
2317  *   - <0, on error.
2318  */
2319 int btf__add_restrict(struct btf *btf, int ref_type_id)
2320 {
2321     return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id);
2322 }
2323 
2324 /*
2325  * Append new BTF_KIND_TYPE_TAG type with:
2326  *   - *value*, non-empty/non-NULL tag value;
2327  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2328  * Returns:
2329  *   - >0, type ID of newly added BTF type;
2330  *   - <0, on error.
2331  */
2332 int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id)
2333 {
2334     if (!value|| !value[0])
2335         return libbpf_err(-EINVAL);
2336 
2337     return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id);
2338 }
2339 
2340 /*
2341  * Append new BTF_KIND_FUNC type with:
2342  *   - *name*, non-empty/non-NULL name;
2343  *   - *proto_type_id* - FUNC_PROTO's type ID, it might not exist yet;
2344  * Returns:
2345  *   - >0, type ID of newly added BTF type;
2346  *   - <0, on error.
2347  */
2348 int btf__add_func(struct btf *btf, const char *name,
2349           enum btf_func_linkage linkage, int proto_type_id)
2350 {
2351     int id;
2352 
2353     if (!name || !name[0])
2354         return libbpf_err(-EINVAL);
2355     if (linkage != BTF_FUNC_STATIC && linkage != BTF_FUNC_GLOBAL &&
2356         linkage != BTF_FUNC_EXTERN)
2357         return libbpf_err(-EINVAL);
2358 
2359     id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id);
2360     if (id > 0) {
2361         struct btf_type *t = btf_type_by_id(btf, id);
2362 
2363         t->info = btf_type_info(BTF_KIND_FUNC, linkage, 0);
2364     }
2365     return libbpf_err(id);
2366 }
2367 
2368 /*
2369  * Append new BTF_KIND_FUNC_PROTO with:
2370  *   - *ret_type_id* - type ID for return result of a function.
2371  *
2372  * Function prototype initially has no arguments, but they can be added by
2373  * btf__add_func_param() one by one, immediately after
2374  * btf__add_func_proto() succeeded.
2375  *
2376  * Returns:
2377  *   - >0, type ID of newly added BTF type;
2378  *   - <0, on error.
2379  */
2380 int btf__add_func_proto(struct btf *btf, int ret_type_id)
2381 {
2382     struct btf_type *t;
2383     int sz;
2384 
2385     if (validate_type_id(ret_type_id))
2386         return libbpf_err(-EINVAL);
2387 
2388     if (btf_ensure_modifiable(btf))
2389         return libbpf_err(-ENOMEM);
2390 
2391     sz = sizeof(struct btf_type);
2392     t = btf_add_type_mem(btf, sz);
2393     if (!t)
2394         return libbpf_err(-ENOMEM);
2395 
2396     /* start out with vlen=0; this will be adjusted when adding enum
2397      * values, if necessary
2398      */
2399     t->name_off = 0;
2400     t->info = btf_type_info(BTF_KIND_FUNC_PROTO, 0, 0);
2401     t->type = ret_type_id;
2402 
2403     return btf_commit_type(btf, sz);
2404 }
2405 
2406 /*
2407  * Append new function parameter for current FUNC_PROTO type with:
2408  *   - *name* - parameter name, can be NULL or empty;
2409  *   - *type_id* - type ID describing the type of the parameter.
2410  * Returns:
2411  *   -  0, on success;
2412  *   - <0, on error.
2413  */
2414 int btf__add_func_param(struct btf *btf, const char *name, int type_id)
2415 {
2416     struct btf_type *t;
2417     struct btf_param *p;
2418     int sz, name_off = 0;
2419 
2420     if (validate_type_id(type_id))
2421         return libbpf_err(-EINVAL);
2422 
2423     /* last type should be BTF_KIND_FUNC_PROTO */
2424     if (btf->nr_types == 0)
2425         return libbpf_err(-EINVAL);
2426     t = btf_last_type(btf);
2427     if (!btf_is_func_proto(t))
2428         return libbpf_err(-EINVAL);
2429 
2430     /* decompose and invalidate raw data */
2431     if (btf_ensure_modifiable(btf))
2432         return libbpf_err(-ENOMEM);
2433 
2434     sz = sizeof(struct btf_param);
2435     p = btf_add_type_mem(btf, sz);
2436     if (!p)
2437         return libbpf_err(-ENOMEM);
2438 
2439     if (name && name[0]) {
2440         name_off = btf__add_str(btf, name);
2441         if (name_off < 0)
2442             return name_off;
2443     }
2444 
2445     p->name_off = name_off;
2446     p->type = type_id;
2447 
2448     /* update parent type's vlen */
2449     t = btf_last_type(btf);
2450     btf_type_inc_vlen(t);
2451 
2452     btf->hdr->type_len += sz;
2453     btf->hdr->str_off += sz;
2454     return 0;
2455 }
2456 
2457 /*
2458  * Append new BTF_KIND_VAR type with:
2459  *   - *name* - non-empty/non-NULL name;
2460  *   - *linkage* - variable linkage, one of BTF_VAR_STATIC,
2461  *     BTF_VAR_GLOBAL_ALLOCATED, or BTF_VAR_GLOBAL_EXTERN;
2462  *   - *type_id* - type ID of the type describing the type of the variable.
2463  * Returns:
2464  *   - >0, type ID of newly added BTF type;
2465  *   - <0, on error.
2466  */
2467 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id)
2468 {
2469     struct btf_type *t;
2470     struct btf_var *v;
2471     int sz, name_off;
2472 
2473     /* non-empty name */
2474     if (!name || !name[0])
2475         return libbpf_err(-EINVAL);
2476     if (linkage != BTF_VAR_STATIC && linkage != BTF_VAR_GLOBAL_ALLOCATED &&
2477         linkage != BTF_VAR_GLOBAL_EXTERN)
2478         return libbpf_err(-EINVAL);
2479     if (validate_type_id(type_id))
2480         return libbpf_err(-EINVAL);
2481 
2482     /* deconstruct BTF, if necessary, and invalidate raw_data */
2483     if (btf_ensure_modifiable(btf))
2484         return libbpf_err(-ENOMEM);
2485 
2486     sz = sizeof(struct btf_type) + sizeof(struct btf_var);
2487     t = btf_add_type_mem(btf, sz);
2488     if (!t)
2489         return libbpf_err(-ENOMEM);
2490 
2491     name_off = btf__add_str(btf, name);
2492     if (name_off < 0)
2493         return name_off;
2494 
2495     t->name_off = name_off;
2496     t->info = btf_type_info(BTF_KIND_VAR, 0, 0);
2497     t->type = type_id;
2498 
2499     v = btf_var(t);
2500     v->linkage = linkage;
2501 
2502     return btf_commit_type(btf, sz);
2503 }
2504 
2505 /*
2506  * Append new BTF_KIND_DATASEC type with:
2507  *   - *name* - non-empty/non-NULL name;
2508  *   - *byte_sz* - data section size, in bytes.
2509  *
2510  * Data section is initially empty. Variables info can be added with
2511  * btf__add_datasec_var_info() calls, after btf__add_datasec() succeeds.
2512  *
2513  * Returns:
2514  *   - >0, type ID of newly added BTF type;
2515  *   - <0, on error.
2516  */
2517 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz)
2518 {
2519     struct btf_type *t;
2520     int sz, name_off;
2521 
2522     /* non-empty name */
2523     if (!name || !name[0])
2524         return libbpf_err(-EINVAL);
2525 
2526     if (btf_ensure_modifiable(btf))
2527         return libbpf_err(-ENOMEM);
2528 
2529     sz = sizeof(struct btf_type);
2530     t = btf_add_type_mem(btf, sz);
2531     if (!t)
2532         return libbpf_err(-ENOMEM);
2533 
2534     name_off = btf__add_str(btf, name);
2535     if (name_off < 0)
2536         return name_off;
2537 
2538     /* start with vlen=0, which will be update as var_secinfos are added */
2539     t->name_off = name_off;
2540     t->info = btf_type_info(BTF_KIND_DATASEC, 0, 0);
2541     t->size = byte_sz;
2542 
2543     return btf_commit_type(btf, sz);
2544 }
2545 
2546 /*
2547  * Append new data section variable information entry for current DATASEC type:
2548  *   - *var_type_id* - type ID, describing type of the variable;
2549  *   - *offset* - variable offset within data section, in bytes;
2550  *   - *byte_sz* - variable size, in bytes.
2551  *
2552  * Returns:
2553  *   -  0, on success;
2554  *   - <0, on error.
2555  */
2556 int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz)
2557 {
2558     struct btf_type *t;
2559     struct btf_var_secinfo *v;
2560     int sz;
2561 
2562     /* last type should be BTF_KIND_DATASEC */
2563     if (btf->nr_types == 0)
2564         return libbpf_err(-EINVAL);
2565     t = btf_last_type(btf);
2566     if (!btf_is_datasec(t))
2567         return libbpf_err(-EINVAL);
2568 
2569     if (validate_type_id(var_type_id))
2570         return libbpf_err(-EINVAL);
2571 
2572     /* decompose and invalidate raw data */
2573     if (btf_ensure_modifiable(btf))
2574         return libbpf_err(-ENOMEM);
2575 
2576     sz = sizeof(struct btf_var_secinfo);
2577     v = btf_add_type_mem(btf, sz);
2578     if (!v)
2579         return libbpf_err(-ENOMEM);
2580 
2581     v->type = var_type_id;
2582     v->offset = offset;
2583     v->size = byte_sz;
2584 
2585     /* update parent type's vlen */
2586     t = btf_last_type(btf);
2587     btf_type_inc_vlen(t);
2588 
2589     btf->hdr->type_len += sz;
2590     btf->hdr->str_off += sz;
2591     return 0;
2592 }
2593 
2594 /*
2595  * Append new BTF_KIND_DECL_TAG type with:
2596  *   - *value* - non-empty/non-NULL string;
2597  *   - *ref_type_id* - referenced type ID, it might not exist yet;
2598  *   - *component_idx* - -1 for tagging reference type, otherwise struct/union
2599  *     member or function argument index;
2600  * Returns:
2601  *   - >0, type ID of newly added BTF type;
2602  *   - <0, on error.
2603  */
2604 int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id,
2605          int component_idx)
2606 {
2607     struct btf_type *t;
2608     int sz, value_off;
2609 
2610     if (!value || !value[0] || component_idx < -1)
2611         return libbpf_err(-EINVAL);
2612 
2613     if (validate_type_id(ref_type_id))
2614         return libbpf_err(-EINVAL);
2615 
2616     if (btf_ensure_modifiable(btf))
2617         return libbpf_err(-ENOMEM);
2618 
2619     sz = sizeof(struct btf_type) + sizeof(struct btf_decl_tag);
2620     t = btf_add_type_mem(btf, sz);
2621     if (!t)
2622         return libbpf_err(-ENOMEM);
2623 
2624     value_off = btf__add_str(btf, value);
2625     if (value_off < 0)
2626         return value_off;
2627 
2628     t->name_off = value_off;
2629     t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, false);
2630     t->type = ref_type_id;
2631     btf_decl_tag(t)->component_idx = component_idx;
2632 
2633     return btf_commit_type(btf, sz);
2634 }
2635 
2636 struct btf_ext_sec_setup_param {
2637     __u32 off;
2638     __u32 len;
2639     __u32 min_rec_size;
2640     struct btf_ext_info *ext_info;
2641     const char *desc;
2642 };
2643 
2644 static int btf_ext_setup_info(struct btf_ext *btf_ext,
2645                   struct btf_ext_sec_setup_param *ext_sec)
2646 {
2647     const struct btf_ext_info_sec *sinfo;
2648     struct btf_ext_info *ext_info;
2649     __u32 info_left, record_size;
2650     size_t sec_cnt = 0;
2651     /* The start of the info sec (including the __u32 record_size). */
2652     void *info;
2653 
2654     if (ext_sec->len == 0)
2655         return 0;
2656 
2657     if (ext_sec->off & 0x03) {
2658         pr_debug(".BTF.ext %s section is not aligned to 4 bytes\n",
2659              ext_sec->desc);
2660         return -EINVAL;
2661     }
2662 
2663     info = btf_ext->data + btf_ext->hdr->hdr_len + ext_sec->off;
2664     info_left = ext_sec->len;
2665 
2666     if (btf_ext->data + btf_ext->data_size < info + ext_sec->len) {
2667         pr_debug("%s section (off:%u len:%u) is beyond the end of the ELF section .BTF.ext\n",
2668              ext_sec->desc, ext_sec->off, ext_sec->len);
2669         return -EINVAL;
2670     }
2671 
2672     /* At least a record size */
2673     if (info_left < sizeof(__u32)) {
2674         pr_debug(".BTF.ext %s record size not found\n", ext_sec->desc);
2675         return -EINVAL;
2676     }
2677 
2678     /* The record size needs to meet the minimum standard */
2679     record_size = *(__u32 *)info;
2680     if (record_size < ext_sec->min_rec_size ||
2681         record_size & 0x03) {
2682         pr_debug("%s section in .BTF.ext has invalid record size %u\n",
2683              ext_sec->desc, record_size);
2684         return -EINVAL;
2685     }
2686 
2687     sinfo = info + sizeof(__u32);
2688     info_left -= sizeof(__u32);
2689 
2690     /* If no records, return failure now so .BTF.ext won't be used. */
2691     if (!info_left) {
2692         pr_debug("%s section in .BTF.ext has no records", ext_sec->desc);
2693         return -EINVAL;
2694     }
2695 
2696     while (info_left) {
2697         unsigned int sec_hdrlen = sizeof(struct btf_ext_info_sec);
2698         __u64 total_record_size;
2699         __u32 num_records;
2700 
2701         if (info_left < sec_hdrlen) {
2702             pr_debug("%s section header is not found in .BTF.ext\n",
2703                  ext_sec->desc);
2704             return -EINVAL;
2705         }
2706 
2707         num_records = sinfo->num_info;
2708         if (num_records == 0) {
2709             pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2710                  ext_sec->desc);
2711             return -EINVAL;
2712         }
2713 
2714         total_record_size = sec_hdrlen + (__u64)num_records * record_size;
2715         if (info_left < total_record_size) {
2716             pr_debug("%s section has incorrect num_records in .BTF.ext\n",
2717                  ext_sec->desc);
2718             return -EINVAL;
2719         }
2720 
2721         info_left -= total_record_size;
2722         sinfo = (void *)sinfo + total_record_size;
2723         sec_cnt++;
2724     }
2725 
2726     ext_info = ext_sec->ext_info;
2727     ext_info->len = ext_sec->len - sizeof(__u32);
2728     ext_info->rec_size = record_size;
2729     ext_info->info = info + sizeof(__u32);
2730     ext_info->sec_cnt = sec_cnt;
2731 
2732     return 0;
2733 }
2734 
2735 static int btf_ext_setup_func_info(struct btf_ext *btf_ext)
2736 {
2737     struct btf_ext_sec_setup_param param = {
2738         .off = btf_ext->hdr->func_info_off,
2739         .len = btf_ext->hdr->func_info_len,
2740         .min_rec_size = sizeof(struct bpf_func_info_min),
2741         .ext_info = &btf_ext->func_info,
2742         .desc = "func_info"
2743     };
2744 
2745     return btf_ext_setup_info(btf_ext, &param);
2746 }
2747 
2748 static int btf_ext_setup_line_info(struct btf_ext *btf_ext)
2749 {
2750     struct btf_ext_sec_setup_param param = {
2751         .off = btf_ext->hdr->line_info_off,
2752         .len = btf_ext->hdr->line_info_len,
2753         .min_rec_size = sizeof(struct bpf_line_info_min),
2754         .ext_info = &btf_ext->line_info,
2755         .desc = "line_info",
2756     };
2757 
2758     return btf_ext_setup_info(btf_ext, &param);
2759 }
2760 
2761 static int btf_ext_setup_core_relos(struct btf_ext *btf_ext)
2762 {
2763     struct btf_ext_sec_setup_param param = {
2764         .off = btf_ext->hdr->core_relo_off,
2765         .len = btf_ext->hdr->core_relo_len,
2766         .min_rec_size = sizeof(struct bpf_core_relo),
2767         .ext_info = &btf_ext->core_relo_info,
2768         .desc = "core_relo",
2769     };
2770 
2771     return btf_ext_setup_info(btf_ext, &param);
2772 }
2773 
2774 static int btf_ext_parse_hdr(__u8 *data, __u32 data_size)
2775 {
2776     const struct btf_ext_header *hdr = (struct btf_ext_header *)data;
2777 
2778     if (data_size < offsetofend(struct btf_ext_header, hdr_len) ||
2779         data_size < hdr->hdr_len) {
2780         pr_debug("BTF.ext header not found");
2781         return -EINVAL;
2782     }
2783 
2784     if (hdr->magic == bswap_16(BTF_MAGIC)) {
2785         pr_warn("BTF.ext in non-native endianness is not supported\n");
2786         return -ENOTSUP;
2787     } else if (hdr->magic != BTF_MAGIC) {
2788         pr_debug("Invalid BTF.ext magic:%x\n", hdr->magic);
2789         return -EINVAL;
2790     }
2791 
2792     if (hdr->version != BTF_VERSION) {
2793         pr_debug("Unsupported BTF.ext version:%u\n", hdr->version);
2794         return -ENOTSUP;
2795     }
2796 
2797     if (hdr->flags) {
2798         pr_debug("Unsupported BTF.ext flags:%x\n", hdr->flags);
2799         return -ENOTSUP;
2800     }
2801 
2802     if (data_size == hdr->hdr_len) {
2803         pr_debug("BTF.ext has no data\n");
2804         return -EINVAL;
2805     }
2806 
2807     return 0;
2808 }
2809 
2810 void btf_ext__free(struct btf_ext *btf_ext)
2811 {
2812     if (IS_ERR_OR_NULL(btf_ext))
2813         return;
2814     free(btf_ext->func_info.sec_idxs);
2815     free(btf_ext->line_info.sec_idxs);
2816     free(btf_ext->core_relo_info.sec_idxs);
2817     free(btf_ext->data);
2818     free(btf_ext);
2819 }
2820 
2821 struct btf_ext *btf_ext__new(const __u8 *data, __u32 size)
2822 {
2823     struct btf_ext *btf_ext;
2824     int err;
2825 
2826     btf_ext = calloc(1, sizeof(struct btf_ext));
2827     if (!btf_ext)
2828         return libbpf_err_ptr(-ENOMEM);
2829 
2830     btf_ext->data_size = size;
2831     btf_ext->data = malloc(size);
2832     if (!btf_ext->data) {
2833         err = -ENOMEM;
2834         goto done;
2835     }
2836     memcpy(btf_ext->data, data, size);
2837 
2838     err = btf_ext_parse_hdr(btf_ext->data, size);
2839     if (err)
2840         goto done;
2841 
2842     if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, line_info_len)) {
2843         err = -EINVAL;
2844         goto done;
2845     }
2846 
2847     err = btf_ext_setup_func_info(btf_ext);
2848     if (err)
2849         goto done;
2850 
2851     err = btf_ext_setup_line_info(btf_ext);
2852     if (err)
2853         goto done;
2854 
2855     if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, core_relo_len))
2856         goto done; /* skip core relos parsing */
2857 
2858     err = btf_ext_setup_core_relos(btf_ext);
2859     if (err)
2860         goto done;
2861 
2862 done:
2863     if (err) {
2864         btf_ext__free(btf_ext);
2865         return libbpf_err_ptr(err);
2866     }
2867 
2868     return btf_ext;
2869 }
2870 
2871 const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size)
2872 {
2873     *size = btf_ext->data_size;
2874     return btf_ext->data;
2875 }
2876 
2877 struct btf_dedup;
2878 
2879 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
2880 static void btf_dedup_free(struct btf_dedup *d);
2881 static int btf_dedup_prep(struct btf_dedup *d);
2882 static int btf_dedup_strings(struct btf_dedup *d);
2883 static int btf_dedup_prim_types(struct btf_dedup *d);
2884 static int btf_dedup_struct_types(struct btf_dedup *d);
2885 static int btf_dedup_ref_types(struct btf_dedup *d);
2886 static int btf_dedup_compact_types(struct btf_dedup *d);
2887 static int btf_dedup_remap_types(struct btf_dedup *d);
2888 
2889 /*
2890  * Deduplicate BTF types and strings.
2891  *
2892  * BTF dedup algorithm takes as an input `struct btf` representing `.BTF` ELF
2893  * section with all BTF type descriptors and string data. It overwrites that
2894  * memory in-place with deduplicated types and strings without any loss of
2895  * information. If optional `struct btf_ext` representing '.BTF.ext' ELF section
2896  * is provided, all the strings referenced from .BTF.ext section are honored
2897  * and updated to point to the right offsets after deduplication.
2898  *
2899  * If function returns with error, type/string data might be garbled and should
2900  * be discarded.
2901  *
2902  * More verbose and detailed description of both problem btf_dedup is solving,
2903  * as well as solution could be found at:
2904  * https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html
2905  *
2906  * Problem description and justification
2907  * =====================================
2908  *
2909  * BTF type information is typically emitted either as a result of conversion
2910  * from DWARF to BTF or directly by compiler. In both cases, each compilation
2911  * unit contains information about a subset of all the types that are used
2912  * in an application. These subsets are frequently overlapping and contain a lot
2913  * of duplicated information when later concatenated together into a single
2914  * binary. This algorithm ensures that each unique type is represented by single
2915  * BTF type descriptor, greatly reducing resulting size of BTF data.
2916  *
2917  * Compilation unit isolation and subsequent duplication of data is not the only
2918  * problem. The same type hierarchy (e.g., struct and all the type that struct
2919  * references) in different compilation units can be represented in BTF to
2920  * various degrees of completeness (or, rather, incompleteness) due to
2921  * struct/union forward declarations.
2922  *
2923  * Let's take a look at an example, that we'll use to better understand the
2924  * problem (and solution). Suppose we have two compilation units, each using
2925  * same `struct S`, but each of them having incomplete type information about
2926  * struct's fields:
2927  *
2928  * // CU #1:
2929  * struct S;
2930  * struct A {
2931  *  int a;
2932  *  struct A* self;
2933  *  struct S* parent;
2934  * };
2935  * struct B;
2936  * struct S {
2937  *  struct A* a_ptr;
2938  *  struct B* b_ptr;
2939  * };
2940  *
2941  * // CU #2:
2942  * struct S;
2943  * struct A;
2944  * struct B {
2945  *  int b;
2946  *  struct B* self;
2947  *  struct S* parent;
2948  * };
2949  * struct S {
2950  *  struct A* a_ptr;
2951  *  struct B* b_ptr;
2952  * };
2953  *
2954  * In case of CU #1, BTF data will know only that `struct B` exist (but no
2955  * more), but will know the complete type information about `struct A`. While
2956  * for CU #2, it will know full type information about `struct B`, but will
2957  * only know about forward declaration of `struct A` (in BTF terms, it will
2958  * have `BTF_KIND_FWD` type descriptor with name `B`).
2959  *
2960  * This compilation unit isolation means that it's possible that there is no
2961  * single CU with complete type information describing structs `S`, `A`, and
2962  * `B`. Also, we might get tons of duplicated and redundant type information.
2963  *
2964  * Additional complication we need to keep in mind comes from the fact that
2965  * types, in general, can form graphs containing cycles, not just DAGs.
2966  *
2967  * While algorithm does deduplication, it also merges and resolves type
2968  * information (unless disabled throught `struct btf_opts`), whenever possible.
2969  * E.g., in the example above with two compilation units having partial type
2970  * information for structs `A` and `B`, the output of algorithm will emit
2971  * a single copy of each BTF type that describes structs `A`, `B`, and `S`
2972  * (as well as type information for `int` and pointers), as if they were defined
2973  * in a single compilation unit as:
2974  *
2975  * struct A {
2976  *  int a;
2977  *  struct A* self;
2978  *  struct S* parent;
2979  * };
2980  * struct B {
2981  *  int b;
2982  *  struct B* self;
2983  *  struct S* parent;
2984  * };
2985  * struct S {
2986  *  struct A* a_ptr;
2987  *  struct B* b_ptr;
2988  * };
2989  *
2990  * Algorithm summary
2991  * =================
2992  *
2993  * Algorithm completes its work in 6 separate passes:
2994  *
2995  * 1. Strings deduplication.
2996  * 2. Primitive types deduplication (int, enum, fwd).
2997  * 3. Struct/union types deduplication.
2998  * 4. Reference types deduplication (pointers, typedefs, arrays, funcs, func
2999  *    protos, and const/volatile/restrict modifiers).
3000  * 5. Types compaction.
3001  * 6. Types remapping.
3002  *
3003  * Algorithm determines canonical type descriptor, which is a single
3004  * representative type for each truly unique type. This canonical type is the
3005  * one that will go into final deduplicated BTF type information. For
3006  * struct/unions, it is also the type that algorithm will merge additional type
3007  * information into (while resolving FWDs), as it discovers it from data in
3008  * other CUs. Each input BTF type eventually gets either mapped to itself, if
3009  * that type is canonical, or to some other type, if that type is equivalent
3010  * and was chosen as canonical representative. This mapping is stored in
3011  * `btf_dedup->map` array. This map is also used to record STRUCT/UNION that
3012  * FWD type got resolved to.
3013  *
3014  * To facilitate fast discovery of canonical types, we also maintain canonical
3015  * index (`btf_dedup->dedup_table`), which maps type descriptor's signature hash
3016  * (i.e., hashed kind, name, size, fields, etc) into a list of canonical types
3017  * that match that signature. With sufficiently good choice of type signature
3018  * hashing function, we can limit number of canonical types for each unique type
3019  * signature to a very small number, allowing to find canonical type for any
3020  * duplicated type very quickly.
3021  *
3022  * Struct/union deduplication is the most critical part and algorithm for
3023  * deduplicating structs/unions is described in greater details in comments for
3024  * `btf_dedup_is_equiv` function.
3025  */
3026 int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts)
3027 {
3028     struct btf_dedup *d;
3029     int err;
3030 
3031     if (!OPTS_VALID(opts, btf_dedup_opts))
3032         return libbpf_err(-EINVAL);
3033 
3034     d = btf_dedup_new(btf, opts);
3035     if (IS_ERR(d)) {
3036         pr_debug("btf_dedup_new failed: %ld", PTR_ERR(d));
3037         return libbpf_err(-EINVAL);
3038     }
3039 
3040     if (btf_ensure_modifiable(btf)) {
3041         err = -ENOMEM;
3042         goto done;
3043     }
3044 
3045     err = btf_dedup_prep(d);
3046     if (err) {
3047         pr_debug("btf_dedup_prep failed:%d\n", err);
3048         goto done;
3049     }
3050     err = btf_dedup_strings(d);
3051     if (err < 0) {
3052         pr_debug("btf_dedup_strings failed:%d\n", err);
3053         goto done;
3054     }
3055     err = btf_dedup_prim_types(d);
3056     if (err < 0) {
3057         pr_debug("btf_dedup_prim_types failed:%d\n", err);
3058         goto done;
3059     }
3060     err = btf_dedup_struct_types(d);
3061     if (err < 0) {
3062         pr_debug("btf_dedup_struct_types failed:%d\n", err);
3063         goto done;
3064     }
3065     err = btf_dedup_ref_types(d);
3066     if (err < 0) {
3067         pr_debug("btf_dedup_ref_types failed:%d\n", err);
3068         goto done;
3069     }
3070     err = btf_dedup_compact_types(d);
3071     if (err < 0) {
3072         pr_debug("btf_dedup_compact_types failed:%d\n", err);
3073         goto done;
3074     }
3075     err = btf_dedup_remap_types(d);
3076     if (err < 0) {
3077         pr_debug("btf_dedup_remap_types failed:%d\n", err);
3078         goto done;
3079     }
3080 
3081 done:
3082     btf_dedup_free(d);
3083     return libbpf_err(err);
3084 }
3085 
3086 #define BTF_UNPROCESSED_ID ((__u32)-1)
3087 #define BTF_IN_PROGRESS_ID ((__u32)-2)
3088 
3089 struct btf_dedup {
3090     /* .BTF section to be deduped in-place */
3091     struct btf *btf;
3092     /*
3093      * Optional .BTF.ext section. When provided, any strings referenced
3094      * from it will be taken into account when deduping strings
3095      */
3096     struct btf_ext *btf_ext;
3097     /*
3098      * This is a map from any type's signature hash to a list of possible
3099      * canonical representative type candidates. Hash collisions are
3100      * ignored, so even types of various kinds can share same list of
3101      * candidates, which is fine because we rely on subsequent
3102      * btf_xxx_equal() checks to authoritatively verify type equality.
3103      */
3104     struct hashmap *dedup_table;
3105     /* Canonical types map */
3106     __u32 *map;
3107     /* Hypothetical mapping, used during type graph equivalence checks */
3108     __u32 *hypot_map;
3109     __u32 *hypot_list;
3110     size_t hypot_cnt;
3111     size_t hypot_cap;
3112     /* Whether hypothetical mapping, if successful, would need to adjust
3113      * already canonicalized types (due to a new forward declaration to
3114      * concrete type resolution). In such case, during split BTF dedup
3115      * candidate type would still be considered as different, because base
3116      * BTF is considered to be immutable.
3117      */
3118     bool hypot_adjust_canon;
3119     /* Various option modifying behavior of algorithm */
3120     struct btf_dedup_opts opts;
3121     /* temporary strings deduplication state */
3122     struct strset *strs_set;
3123 };
3124 
3125 static long hash_combine(long h, long value)
3126 {
3127     return h * 31 + value;
3128 }
3129 
3130 #define for_each_dedup_cand(d, node, hash) \
3131     hashmap__for_each_key_entry(d->dedup_table, node, (void *)hash)
3132 
3133 static int btf_dedup_table_add(struct btf_dedup *d, long hash, __u32 type_id)
3134 {
3135     return hashmap__append(d->dedup_table,
3136                    (void *)hash, (void *)(long)type_id);
3137 }
3138 
3139 static int btf_dedup_hypot_map_add(struct btf_dedup *d,
3140                    __u32 from_id, __u32 to_id)
3141 {
3142     if (d->hypot_cnt == d->hypot_cap) {
3143         __u32 *new_list;
3144 
3145         d->hypot_cap += max((size_t)16, d->hypot_cap / 2);
3146         new_list = libbpf_reallocarray(d->hypot_list, d->hypot_cap, sizeof(__u32));
3147         if (!new_list)
3148             return -ENOMEM;
3149         d->hypot_list = new_list;
3150     }
3151     d->hypot_list[d->hypot_cnt++] = from_id;
3152     d->hypot_map[from_id] = to_id;
3153     return 0;
3154 }
3155 
3156 static void btf_dedup_clear_hypot_map(struct btf_dedup *d)
3157 {
3158     int i;
3159 
3160     for (i = 0; i < d->hypot_cnt; i++)
3161         d->hypot_map[d->hypot_list[i]] = BTF_UNPROCESSED_ID;
3162     d->hypot_cnt = 0;
3163     d->hypot_adjust_canon = false;
3164 }
3165 
3166 static void btf_dedup_free(struct btf_dedup *d)
3167 {
3168     hashmap__free(d->dedup_table);
3169     d->dedup_table = NULL;
3170 
3171     free(d->map);
3172     d->map = NULL;
3173 
3174     free(d->hypot_map);
3175     d->hypot_map = NULL;
3176 
3177     free(d->hypot_list);
3178     d->hypot_list = NULL;
3179 
3180     free(d);
3181 }
3182 
3183 static size_t btf_dedup_identity_hash_fn(const void *key, void *ctx)
3184 {
3185     return (size_t)key;
3186 }
3187 
3188 static size_t btf_dedup_collision_hash_fn(const void *key, void *ctx)
3189 {
3190     return 0;
3191 }
3192 
3193 static bool btf_dedup_equal_fn(const void *k1, const void *k2, void *ctx)
3194 {
3195     return k1 == k2;
3196 }
3197 
3198 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts)
3199 {
3200     struct btf_dedup *d = calloc(1, sizeof(struct btf_dedup));
3201     hashmap_hash_fn hash_fn = btf_dedup_identity_hash_fn;
3202     int i, err = 0, type_cnt;
3203 
3204     if (!d)
3205         return ERR_PTR(-ENOMEM);
3206 
3207     if (OPTS_GET(opts, force_collisions, false))
3208         hash_fn = btf_dedup_collision_hash_fn;
3209 
3210     d->btf = btf;
3211     d->btf_ext = OPTS_GET(opts, btf_ext, NULL);
3212 
3213     d->dedup_table = hashmap__new(hash_fn, btf_dedup_equal_fn, NULL);
3214     if (IS_ERR(d->dedup_table)) {
3215         err = PTR_ERR(d->dedup_table);
3216         d->dedup_table = NULL;
3217         goto done;
3218     }
3219 
3220     type_cnt = btf__type_cnt(btf);
3221     d->map = malloc(sizeof(__u32) * type_cnt);
3222     if (!d->map) {
3223         err = -ENOMEM;
3224         goto done;
3225     }
3226     /* special BTF "void" type is made canonical immediately */
3227     d->map[0] = 0;
3228     for (i = 1; i < type_cnt; i++) {
3229         struct btf_type *t = btf_type_by_id(d->btf, i);
3230 
3231         /* VAR and DATASEC are never deduped and are self-canonical */
3232         if (btf_is_var(t) || btf_is_datasec(t))
3233             d->map[i] = i;
3234         else
3235             d->map[i] = BTF_UNPROCESSED_ID;
3236     }
3237 
3238     d->hypot_map = malloc(sizeof(__u32) * type_cnt);
3239     if (!d->hypot_map) {
3240         err = -ENOMEM;
3241         goto done;
3242     }
3243     for (i = 0; i < type_cnt; i++)
3244         d->hypot_map[i] = BTF_UNPROCESSED_ID;
3245 
3246 done:
3247     if (err) {
3248         btf_dedup_free(d);
3249         return ERR_PTR(err);
3250     }
3251 
3252     return d;
3253 }
3254 
3255 /*
3256  * Iterate over all possible places in .BTF and .BTF.ext that can reference
3257  * string and pass pointer to it to a provided callback `fn`.
3258  */
3259 static int btf_for_each_str_off(struct btf_dedup *d, str_off_visit_fn fn, void *ctx)
3260 {
3261     int i, r;
3262 
3263     for (i = 0; i < d->btf->nr_types; i++) {
3264         struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
3265 
3266         r = btf_type_visit_str_offs(t, fn, ctx);
3267         if (r)
3268             return r;
3269     }
3270 
3271     if (!d->btf_ext)
3272         return 0;
3273 
3274     r = btf_ext_visit_str_offs(d->btf_ext, fn, ctx);
3275     if (r)
3276         return r;
3277 
3278     return 0;
3279 }
3280 
3281 static int strs_dedup_remap_str_off(__u32 *str_off_ptr, void *ctx)
3282 {
3283     struct btf_dedup *d = ctx;
3284     __u32 str_off = *str_off_ptr;
3285     const char *s;
3286     int off, err;
3287 
3288     /* don't touch empty string or string in main BTF */
3289     if (str_off == 0 || str_off < d->btf->start_str_off)
3290         return 0;
3291 
3292     s = btf__str_by_offset(d->btf, str_off);
3293     if (d->btf->base_btf) {
3294         err = btf__find_str(d->btf->base_btf, s);
3295         if (err >= 0) {
3296             *str_off_ptr = err;
3297             return 0;
3298         }
3299         if (err != -ENOENT)
3300             return err;
3301     }
3302 
3303     off = strset__add_str(d->strs_set, s);
3304     if (off < 0)
3305         return off;
3306 
3307     *str_off_ptr = d->btf->start_str_off + off;
3308     return 0;
3309 }
3310 
3311 /*
3312  * Dedup string and filter out those that are not referenced from either .BTF
3313  * or .BTF.ext (if provided) sections.
3314  *
3315  * This is done by building index of all strings in BTF's string section,
3316  * then iterating over all entities that can reference strings (e.g., type
3317  * names, struct field names, .BTF.ext line info, etc) and marking corresponding
3318  * strings as used. After that all used strings are deduped and compacted into
3319  * sequential blob of memory and new offsets are calculated. Then all the string
3320  * references are iterated again and rewritten using new offsets.
3321  */
3322 static int btf_dedup_strings(struct btf_dedup *d)
3323 {
3324     int err;
3325 
3326     if (d->btf->strs_deduped)
3327         return 0;
3328 
3329     d->strs_set = strset__new(BTF_MAX_STR_OFFSET, NULL, 0);
3330     if (IS_ERR(d->strs_set)) {
3331         err = PTR_ERR(d->strs_set);
3332         goto err_out;
3333     }
3334 
3335     if (!d->btf->base_btf) {
3336         /* insert empty string; we won't be looking it up during strings
3337          * dedup, but it's good to have it for generic BTF string lookups
3338          */
3339         err = strset__add_str(d->strs_set, "");
3340         if (err < 0)
3341             goto err_out;
3342     }
3343 
3344     /* remap string offsets */
3345     err = btf_for_each_str_off(d, strs_dedup_remap_str_off, d);
3346     if (err)
3347         goto err_out;
3348 
3349     /* replace BTF string data and hash with deduped ones */
3350     strset__free(d->btf->strs_set);
3351     d->btf->hdr->str_len = strset__data_size(d->strs_set);
3352     d->btf->strs_set = d->strs_set;
3353     d->strs_set = NULL;
3354     d->btf->strs_deduped = true;
3355     return 0;
3356 
3357 err_out:
3358     strset__free(d->strs_set);
3359     d->strs_set = NULL;
3360 
3361     return err;
3362 }
3363 
3364 static long btf_hash_common(struct btf_type *t)
3365 {
3366     long h;
3367 
3368     h = hash_combine(0, t->name_off);
3369     h = hash_combine(h, t->info);
3370     h = hash_combine(h, t->size);
3371     return h;
3372 }
3373 
3374 static bool btf_equal_common(struct btf_type *t1, struct btf_type *t2)
3375 {
3376     return t1->name_off == t2->name_off &&
3377            t1->info == t2->info &&
3378            t1->size == t2->size;
3379 }
3380 
3381 /* Calculate type signature hash of INT or TAG. */
3382 static long btf_hash_int_decl_tag(struct btf_type *t)
3383 {
3384     __u32 info = *(__u32 *)(t + 1);
3385     long h;
3386 
3387     h = btf_hash_common(t);
3388     h = hash_combine(h, info);
3389     return h;
3390 }
3391 
3392 /* Check structural equality of two INTs or TAGs. */
3393 static bool btf_equal_int_tag(struct btf_type *t1, struct btf_type *t2)
3394 {
3395     __u32 info1, info2;
3396 
3397     if (!btf_equal_common(t1, t2))
3398         return false;
3399     info1 = *(__u32 *)(t1 + 1);
3400     info2 = *(__u32 *)(t2 + 1);
3401     return info1 == info2;
3402 }
3403 
3404 /* Calculate type signature hash of ENUM/ENUM64. */
3405 static long btf_hash_enum(struct btf_type *t)
3406 {
3407     long h;
3408 
3409     /* don't hash vlen and enum members to support enum fwd resolving */
3410     h = hash_combine(0, t->name_off);
3411     h = hash_combine(h, t->info & ~0xffff);
3412     h = hash_combine(h, t->size);
3413     return h;
3414 }
3415 
3416 /* Check structural equality of two ENUMs. */
3417 static bool btf_equal_enum(struct btf_type *t1, struct btf_type *t2)
3418 {
3419     const struct btf_enum *m1, *m2;
3420     __u16 vlen;
3421     int i;
3422 
3423     if (!btf_equal_common(t1, t2))
3424         return false;
3425 
3426     vlen = btf_vlen(t1);
3427     m1 = btf_enum(t1);
3428     m2 = btf_enum(t2);
3429     for (i = 0; i < vlen; i++) {
3430         if (m1->name_off != m2->name_off || m1->val != m2->val)
3431             return false;
3432         m1++;
3433         m2++;
3434     }
3435     return true;
3436 }
3437 
3438 static bool btf_equal_enum64(struct btf_type *t1, struct btf_type *t2)
3439 {
3440     const struct btf_enum64 *m1, *m2;
3441     __u16 vlen;
3442     int i;
3443 
3444     if (!btf_equal_common(t1, t2))
3445         return false;
3446 
3447     vlen = btf_vlen(t1);
3448     m1 = btf_enum64(t1);
3449     m2 = btf_enum64(t2);
3450     for (i = 0; i < vlen; i++) {
3451         if (m1->name_off != m2->name_off || m1->val_lo32 != m2->val_lo32 ||
3452             m1->val_hi32 != m2->val_hi32)
3453             return false;
3454         m1++;
3455         m2++;
3456     }
3457     return true;
3458 }
3459 
3460 static inline bool btf_is_enum_fwd(struct btf_type *t)
3461 {
3462     return btf_is_any_enum(t) && btf_vlen(t) == 0;
3463 }
3464 
3465 static bool btf_compat_enum(struct btf_type *t1, struct btf_type *t2)
3466 {
3467     if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2))
3468         return btf_equal_enum(t1, t2);
3469     /* ignore vlen when comparing */
3470     return t1->name_off == t2->name_off &&
3471            (t1->info & ~0xffff) == (t2->info & ~0xffff) &&
3472            t1->size == t2->size;
3473 }
3474 
3475 static bool btf_compat_enum64(struct btf_type *t1, struct btf_type *t2)
3476 {
3477     if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2))
3478         return btf_equal_enum64(t1, t2);
3479 
3480     /* ignore vlen when comparing */
3481     return t1->name_off == t2->name_off &&
3482            (t1->info & ~0xffff) == (t2->info & ~0xffff) &&
3483            t1->size == t2->size;
3484 }
3485 
3486 /*
3487  * Calculate type signature hash of STRUCT/UNION, ignoring referenced type IDs,
3488  * as referenced type IDs equivalence is established separately during type
3489  * graph equivalence check algorithm.
3490  */
3491 static long btf_hash_struct(struct btf_type *t)
3492 {
3493     const struct btf_member *member = btf_members(t);
3494     __u32 vlen = btf_vlen(t);
3495     long h = btf_hash_common(t);
3496     int i;
3497 
3498     for (i = 0; i < vlen; i++) {
3499         h = hash_combine(h, member->name_off);
3500         h = hash_combine(h, member->offset);
3501         /* no hashing of referenced type ID, it can be unresolved yet */
3502         member++;
3503     }
3504     return h;
3505 }
3506 
3507 /*
3508  * Check structural compatibility of two STRUCTs/UNIONs, ignoring referenced
3509  * type IDs. This check is performed during type graph equivalence check and
3510  * referenced types equivalence is checked separately.
3511  */
3512 static bool btf_shallow_equal_struct(struct btf_type *t1, struct btf_type *t2)
3513 {
3514     const struct btf_member *m1, *m2;
3515     __u16 vlen;
3516     int i;
3517 
3518     if (!btf_equal_common(t1, t2))
3519         return false;
3520 
3521     vlen = btf_vlen(t1);
3522     m1 = btf_members(t1);
3523     m2 = btf_members(t2);
3524     for (i = 0; i < vlen; i++) {
3525         if (m1->name_off != m2->name_off || m1->offset != m2->offset)
3526             return false;
3527         m1++;
3528         m2++;
3529     }
3530     return true;
3531 }
3532 
3533 /*
3534  * Calculate type signature hash of ARRAY, including referenced type IDs,
3535  * under assumption that they were already resolved to canonical type IDs and
3536  * are not going to change.
3537  */
3538 static long btf_hash_array(struct btf_type *t)
3539 {
3540     const struct btf_array *info = btf_array(t);
3541     long h = btf_hash_common(t);
3542 
3543     h = hash_combine(h, info->type);
3544     h = hash_combine(h, info->index_type);
3545     h = hash_combine(h, info->nelems);
3546     return h;
3547 }
3548 
3549 /*
3550  * Check exact equality of two ARRAYs, taking into account referenced
3551  * type IDs, under assumption that they were already resolved to canonical
3552  * type IDs and are not going to change.
3553  * This function is called during reference types deduplication to compare
3554  * ARRAY to potential canonical representative.
3555  */
3556 static bool btf_equal_array(struct btf_type *t1, struct btf_type *t2)
3557 {
3558     const struct btf_array *info1, *info2;
3559 
3560     if (!btf_equal_common(t1, t2))
3561         return false;
3562 
3563     info1 = btf_array(t1);
3564     info2 = btf_array(t2);
3565     return info1->type == info2->type &&
3566            info1->index_type == info2->index_type &&
3567            info1->nelems == info2->nelems;
3568 }
3569 
3570 /*
3571  * Check structural compatibility of two ARRAYs, ignoring referenced type
3572  * IDs. This check is performed during type graph equivalence check and
3573  * referenced types equivalence is checked separately.
3574  */
3575 static bool btf_compat_array(struct btf_type *t1, struct btf_type *t2)
3576 {
3577     if (!btf_equal_common(t1, t2))
3578         return false;
3579 
3580     return btf_array(t1)->nelems == btf_array(t2)->nelems;
3581 }
3582 
3583 /*
3584  * Calculate type signature hash of FUNC_PROTO, including referenced type IDs,
3585  * under assumption that they were already resolved to canonical type IDs and
3586  * are not going to change.
3587  */
3588 static long btf_hash_fnproto(struct btf_type *t)
3589 {
3590     const struct btf_param *member = btf_params(t);
3591     __u16 vlen = btf_vlen(t);
3592     long h = btf_hash_common(t);
3593     int i;
3594 
3595     for (i = 0; i < vlen; i++) {
3596         h = hash_combine(h, member->name_off);
3597         h = hash_combine(h, member->type);
3598         member++;
3599     }
3600     return h;
3601 }
3602 
3603 /*
3604  * Check exact equality of two FUNC_PROTOs, taking into account referenced
3605  * type IDs, under assumption that they were already resolved to canonical
3606  * type IDs and are not going to change.
3607  * This function is called during reference types deduplication to compare
3608  * FUNC_PROTO to potential canonical representative.
3609  */
3610 static bool btf_equal_fnproto(struct btf_type *t1, struct btf_type *t2)
3611 {
3612     const struct btf_param *m1, *m2;
3613     __u16 vlen;
3614     int i;
3615 
3616     if (!btf_equal_common(t1, t2))
3617         return false;
3618 
3619     vlen = btf_vlen(t1);
3620     m1 = btf_params(t1);
3621     m2 = btf_params(t2);
3622     for (i = 0; i < vlen; i++) {
3623         if (m1->name_off != m2->name_off || m1->type != m2->type)
3624             return false;
3625         m1++;
3626         m2++;
3627     }
3628     return true;
3629 }
3630 
3631 /*
3632  * Check structural compatibility of two FUNC_PROTOs, ignoring referenced type
3633  * IDs. This check is performed during type graph equivalence check and
3634  * referenced types equivalence is checked separately.
3635  */
3636 static bool btf_compat_fnproto(struct btf_type *t1, struct btf_type *t2)
3637 {
3638     const struct btf_param *m1, *m2;
3639     __u16 vlen;
3640     int i;
3641 
3642     /* skip return type ID */
3643     if (t1->name_off != t2->name_off || t1->info != t2->info)
3644         return false;
3645 
3646     vlen = btf_vlen(t1);
3647     m1 = btf_params(t1);
3648     m2 = btf_params(t2);
3649     for (i = 0; i < vlen; i++) {
3650         if (m1->name_off != m2->name_off)
3651             return false;
3652         m1++;
3653         m2++;
3654     }
3655     return true;
3656 }
3657 
3658 /* Prepare split BTF for deduplication by calculating hashes of base BTF's
3659  * types and initializing the rest of the state (canonical type mapping) for
3660  * the fixed base BTF part.
3661  */
3662 static int btf_dedup_prep(struct btf_dedup *d)
3663 {
3664     struct btf_type *t;
3665     int type_id;
3666     long h;
3667 
3668     if (!d->btf->base_btf)
3669         return 0;
3670 
3671     for (type_id = 1; type_id < d->btf->start_id; type_id++) {
3672         t = btf_type_by_id(d->btf, type_id);
3673 
3674         /* all base BTF types are self-canonical by definition */
3675         d->map[type_id] = type_id;
3676 
3677         switch (btf_kind(t)) {
3678         case BTF_KIND_VAR:
3679         case BTF_KIND_DATASEC:
3680             /* VAR and DATASEC are never hash/deduplicated */
3681             continue;
3682         case BTF_KIND_CONST:
3683         case BTF_KIND_VOLATILE:
3684         case BTF_KIND_RESTRICT:
3685         case BTF_KIND_PTR:
3686         case BTF_KIND_FWD:
3687         case BTF_KIND_TYPEDEF:
3688         case BTF_KIND_FUNC:
3689         case BTF_KIND_FLOAT:
3690         case BTF_KIND_TYPE_TAG:
3691             h = btf_hash_common(t);
3692             break;
3693         case BTF_KIND_INT:
3694         case BTF_KIND_DECL_TAG:
3695             h = btf_hash_int_decl_tag(t);
3696             break;
3697         case BTF_KIND_ENUM:
3698         case BTF_KIND_ENUM64:
3699             h = btf_hash_enum(t);
3700             break;
3701         case BTF_KIND_STRUCT:
3702         case BTF_KIND_UNION:
3703             h = btf_hash_struct(t);
3704             break;
3705         case BTF_KIND_ARRAY:
3706             h = btf_hash_array(t);
3707             break;
3708         case BTF_KIND_FUNC_PROTO:
3709             h = btf_hash_fnproto(t);
3710             break;
3711         default:
3712             pr_debug("unknown kind %d for type [%d]\n", btf_kind(t), type_id);
3713             return -EINVAL;
3714         }
3715         if (btf_dedup_table_add(d, h, type_id))
3716             return -ENOMEM;
3717     }
3718 
3719     return 0;
3720 }
3721 
3722 /*
3723  * Deduplicate primitive types, that can't reference other types, by calculating
3724  * their type signature hash and comparing them with any possible canonical
3725  * candidate. If no canonical candidate matches, type itself is marked as
3726  * canonical and is added into `btf_dedup->dedup_table` as another candidate.
3727  */
3728 static int btf_dedup_prim_type(struct btf_dedup *d, __u32 type_id)
3729 {
3730     struct btf_type *t = btf_type_by_id(d->btf, type_id);
3731     struct hashmap_entry *hash_entry;
3732     struct btf_type *cand;
3733     /* if we don't find equivalent type, then we are canonical */
3734     __u32 new_id = type_id;
3735     __u32 cand_id;
3736     long h;
3737 
3738     switch (btf_kind(t)) {
3739     case BTF_KIND_CONST:
3740     case BTF_KIND_VOLATILE:
3741     case BTF_KIND_RESTRICT:
3742     case BTF_KIND_PTR:
3743     case BTF_KIND_TYPEDEF:
3744     case BTF_KIND_ARRAY:
3745     case BTF_KIND_STRUCT:
3746     case BTF_KIND_UNION:
3747     case BTF_KIND_FUNC:
3748     case BTF_KIND_FUNC_PROTO:
3749     case BTF_KIND_VAR:
3750     case BTF_KIND_DATASEC:
3751     case BTF_KIND_DECL_TAG:
3752     case BTF_KIND_TYPE_TAG:
3753         return 0;
3754 
3755     case BTF_KIND_INT:
3756         h = btf_hash_int_decl_tag(t);
3757         for_each_dedup_cand(d, hash_entry, h) {
3758             cand_id = (__u32)(long)hash_entry->value;
3759             cand = btf_type_by_id(d->btf, cand_id);
3760             if (btf_equal_int_tag(t, cand)) {
3761                 new_id = cand_id;
3762                 break;
3763             }
3764         }
3765         break;
3766 
3767     case BTF_KIND_ENUM:
3768         h = btf_hash_enum(t);
3769         for_each_dedup_cand(d, hash_entry, h) {
3770             cand_id = (__u32)(long)hash_entry->value;
3771             cand = btf_type_by_id(d->btf, cand_id);
3772             if (btf_equal_enum(t, cand)) {
3773                 new_id = cand_id;
3774                 break;
3775             }
3776             if (btf_compat_enum(t, cand)) {
3777                 if (btf_is_enum_fwd(t)) {
3778                     /* resolve fwd to full enum */
3779                     new_id = cand_id;
3780                     break;
3781                 }
3782                 /* resolve canonical enum fwd to full enum */
3783                 d->map[cand_id] = type_id;
3784             }
3785         }
3786         break;
3787 
3788     case BTF_KIND_ENUM64:
3789         h = btf_hash_enum(t);
3790         for_each_dedup_cand(d, hash_entry, h) {
3791             cand_id = (__u32)(long)hash_entry->value;
3792             cand = btf_type_by_id(d->btf, cand_id);
3793             if (btf_equal_enum64(t, cand)) {
3794                 new_id = cand_id;
3795                 break;
3796             }
3797             if (btf_compat_enum64(t, cand)) {
3798                 if (btf_is_enum_fwd(t)) {
3799                     /* resolve fwd to full enum */
3800                     new_id = cand_id;
3801                     break;
3802                 }
3803                 /* resolve canonical enum fwd to full enum */
3804                 d->map[cand_id] = type_id;
3805             }
3806         }
3807         break;
3808 
3809     case BTF_KIND_FWD:
3810     case BTF_KIND_FLOAT:
3811         h = btf_hash_common(t);
3812         for_each_dedup_cand(d, hash_entry, h) {
3813             cand_id = (__u32)(long)hash_entry->value;
3814             cand = btf_type_by_id(d->btf, cand_id);
3815             if (btf_equal_common(t, cand)) {
3816                 new_id = cand_id;
3817                 break;
3818             }
3819         }
3820         break;
3821 
3822     default:
3823         return -EINVAL;
3824     }
3825 
3826     d->map[type_id] = new_id;
3827     if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
3828         return -ENOMEM;
3829 
3830     return 0;
3831 }
3832 
3833 static int btf_dedup_prim_types(struct btf_dedup *d)
3834 {
3835     int i, err;
3836 
3837     for (i = 0; i < d->btf->nr_types; i++) {
3838         err = btf_dedup_prim_type(d, d->btf->start_id + i);
3839         if (err)
3840             return err;
3841     }
3842     return 0;
3843 }
3844 
3845 /*
3846  * Check whether type is already mapped into canonical one (could be to itself).
3847  */
3848 static inline bool is_type_mapped(struct btf_dedup *d, uint32_t type_id)
3849 {
3850     return d->map[type_id] <= BTF_MAX_NR_TYPES;
3851 }
3852 
3853 /*
3854  * Resolve type ID into its canonical type ID, if any; otherwise return original
3855  * type ID. If type is FWD and is resolved into STRUCT/UNION already, follow
3856  * STRUCT/UNION link and resolve it into canonical type ID as well.
3857  */
3858 static inline __u32 resolve_type_id(struct btf_dedup *d, __u32 type_id)
3859 {
3860     while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
3861         type_id = d->map[type_id];
3862     return type_id;
3863 }
3864 
3865 /*
3866  * Resolve FWD to underlying STRUCT/UNION, if any; otherwise return original
3867  * type ID.
3868  */
3869 static uint32_t resolve_fwd_id(struct btf_dedup *d, uint32_t type_id)
3870 {
3871     __u32 orig_type_id = type_id;
3872 
3873     if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
3874         return type_id;
3875 
3876     while (is_type_mapped(d, type_id) && d->map[type_id] != type_id)
3877         type_id = d->map[type_id];
3878 
3879     if (!btf_is_fwd(btf__type_by_id(d->btf, type_id)))
3880         return type_id;
3881 
3882     return orig_type_id;
3883 }
3884 
3885 
3886 static inline __u16 btf_fwd_kind(struct btf_type *t)
3887 {
3888     return btf_kflag(t) ? BTF_KIND_UNION : BTF_KIND_STRUCT;
3889 }
3890 
3891 /* Check if given two types are identical ARRAY definitions */
3892 static int btf_dedup_identical_arrays(struct btf_dedup *d, __u32 id1, __u32 id2)
3893 {
3894     struct btf_type *t1, *t2;
3895 
3896     t1 = btf_type_by_id(d->btf, id1);
3897     t2 = btf_type_by_id(d->btf, id2);
3898     if (!btf_is_array(t1) || !btf_is_array(t2))
3899         return 0;
3900 
3901     return btf_equal_array(t1, t2);
3902 }
3903 
3904 /* Check if given two types are identical STRUCT/UNION definitions */
3905 static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id2)
3906 {
3907     const struct btf_member *m1, *m2;
3908     struct btf_type *t1, *t2;
3909     int n, i;
3910 
3911     t1 = btf_type_by_id(d->btf, id1);
3912     t2 = btf_type_by_id(d->btf, id2);
3913 
3914     if (!btf_is_composite(t1) || btf_kind(t1) != btf_kind(t2))
3915         return false;
3916 
3917     if (!btf_shallow_equal_struct(t1, t2))
3918         return false;
3919 
3920     m1 = btf_members(t1);
3921     m2 = btf_members(t2);
3922     for (i = 0, n = btf_vlen(t1); i < n; i++, m1++, m2++) {
3923         if (m1->type != m2->type)
3924             return false;
3925     }
3926     return true;
3927 }
3928 
3929 /*
3930  * Check equivalence of BTF type graph formed by candidate struct/union (we'll
3931  * call it "candidate graph" in this description for brevity) to a type graph
3932  * formed by (potential) canonical struct/union ("canonical graph" for brevity
3933  * here, though keep in mind that not all types in canonical graph are
3934  * necessarily canonical representatives themselves, some of them might be
3935  * duplicates or its uniqueness might not have been established yet).
3936  * Returns:
3937  *  - >0, if type graphs are equivalent;
3938  *  -  0, if not equivalent;
3939  *  - <0, on error.
3940  *
3941  * Algorithm performs side-by-side DFS traversal of both type graphs and checks
3942  * equivalence of BTF types at each step. If at any point BTF types in candidate
3943  * and canonical graphs are not compatible structurally, whole graphs are
3944  * incompatible. If types are structurally equivalent (i.e., all information
3945  * except referenced type IDs is exactly the same), a mapping from `canon_id` to
3946  * a `cand_id` is recored in hypothetical mapping (`btf_dedup->hypot_map`).
3947  * If a type references other types, then those referenced types are checked
3948  * for equivalence recursively.
3949  *
3950  * During DFS traversal, if we find that for current `canon_id` type we
3951  * already have some mapping in hypothetical map, we check for two possible
3952  * situations:
3953  *   - `canon_id` is mapped to exactly the same type as `cand_id`. This will
3954  *     happen when type graphs have cycles. In this case we assume those two
3955  *     types are equivalent.
3956  *   - `canon_id` is mapped to different type. This is contradiction in our
3957  *     hypothetical mapping, because same graph in canonical graph corresponds
3958  *     to two different types in candidate graph, which for equivalent type
3959  *     graphs shouldn't happen. This condition terminates equivalence check
3960  *     with negative result.
3961  *
3962  * If type graphs traversal exhausts types to check and find no contradiction,
3963  * then type graphs are equivalent.
3964  *
3965  * When checking types for equivalence, there is one special case: FWD types.
3966  * If FWD type resolution is allowed and one of the types (either from canonical
3967  * or candidate graph) is FWD and other is STRUCT/UNION (depending on FWD's kind
3968  * flag) and their names match, hypothetical mapping is updated to point from
3969  * FWD to STRUCT/UNION. If graphs will be determined as equivalent successfully,
3970  * this mapping will be used to record FWD -> STRUCT/UNION mapping permanently.
3971  *
3972  * Technically, this could lead to incorrect FWD to STRUCT/UNION resolution,
3973  * if there are two exactly named (or anonymous) structs/unions that are
3974  * compatible structurally, one of which has FWD field, while other is concrete
3975  * STRUCT/UNION, but according to C sources they are different structs/unions
3976  * that are referencing different types with the same name. This is extremely
3977  * unlikely to happen, but btf_dedup API allows to disable FWD resolution if
3978  * this logic is causing problems.
3979  *
3980  * Doing FWD resolution means that both candidate and/or canonical graphs can
3981  * consists of portions of the graph that come from multiple compilation units.
3982  * This is due to the fact that types within single compilation unit are always
3983  * deduplicated and FWDs are already resolved, if referenced struct/union
3984  * definiton is available. So, if we had unresolved FWD and found corresponding
3985  * STRUCT/UNION, they will be from different compilation units. This
3986  * consequently means that when we "link" FWD to corresponding STRUCT/UNION,
3987  * type graph will likely have at least two different BTF types that describe
3988  * same type (e.g., most probably there will be two different BTF types for the
3989  * same 'int' primitive type) and could even have "overlapping" parts of type
3990  * graph that describe same subset of types.
3991  *
3992  * This in turn means that our assumption that each type in canonical graph
3993  * must correspond to exactly one type in candidate graph might not hold
3994  * anymore and will make it harder to detect contradictions using hypothetical
3995  * map. To handle this problem, we allow to follow FWD -> STRUCT/UNION
3996  * resolution only in canonical graph. FWDs in candidate graphs are never
3997  * resolved. To see why it's OK, let's check all possible situations w.r.t. FWDs
3998  * that can occur:
3999  *   - Both types in canonical and candidate graphs are FWDs. If they are
4000  *     structurally equivalent, then they can either be both resolved to the
4001  *     same STRUCT/UNION or not resolved at all. In both cases they are
4002  *     equivalent and there is no need to resolve FWD on candidate side.
4003  *   - Both types in canonical and candidate graphs are concrete STRUCT/UNION,
4004  *     so nothing to resolve as well, algorithm will check equivalence anyway.
4005  *   - Type in canonical graph is FWD, while type in candidate is concrete
4006  *     STRUCT/UNION. In this case candidate graph comes from single compilation
4007  *     unit, so there is exactly one BTF type for each unique C type. After
4008  *     resolving FWD into STRUCT/UNION, there might be more than one BTF type
4009  *     in canonical graph mapping to single BTF type in candidate graph, but
4010  *     because hypothetical mapping maps from canonical to candidate types, it's
4011  *     alright, and we still maintain the property of having single `canon_id`
4012  *     mapping to single `cand_id` (there could be two different `canon_id`
4013  *     mapped to the same `cand_id`, but it's not contradictory).
4014  *   - Type in canonical graph is concrete STRUCT/UNION, while type in candidate
4015  *     graph is FWD. In this case we are just going to check compatibility of
4016  *     STRUCT/UNION and corresponding FWD, and if they are compatible, we'll
4017  *     assume that whatever STRUCT/UNION FWD resolves to must be equivalent to
4018  *     a concrete STRUCT/UNION from canonical graph. If the rest of type graphs
4019  *     turn out equivalent, we'll re-resolve FWD to concrete STRUCT/UNION from
4020  *     canonical graph.
4021  */
4022 static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id,
4023                   __u32 canon_id)
4024 {
4025     struct btf_type *cand_type;
4026     struct btf_type *canon_type;
4027     __u32 hypot_type_id;
4028     __u16 cand_kind;
4029     __u16 canon_kind;
4030     int i, eq;
4031 
4032     /* if both resolve to the same canonical, they must be equivalent */
4033     if (resolve_type_id(d, cand_id) == resolve_type_id(d, canon_id))
4034         return 1;
4035 
4036     canon_id = resolve_fwd_id(d, canon_id);
4037 
4038     hypot_type_id = d->hypot_map[canon_id];
4039     if (hypot_type_id <= BTF_MAX_NR_TYPES) {
4040         if (hypot_type_id == cand_id)
4041             return 1;
4042         /* In some cases compiler will generate different DWARF types
4043          * for *identical* array type definitions and use them for
4044          * different fields within the *same* struct. This breaks type
4045          * equivalence check, which makes an assumption that candidate
4046          * types sub-graph has a consistent and deduped-by-compiler
4047          * types within a single CU. So work around that by explicitly
4048          * allowing identical array types here.
4049          */
4050         if (btf_dedup_identical_arrays(d, hypot_type_id, cand_id))
4051             return 1;
4052         /* It turns out that similar situation can happen with
4053          * struct/union sometimes, sigh... Handle the case where
4054          * structs/unions are exactly the same, down to the referenced
4055          * type IDs. Anything more complicated (e.g., if referenced
4056          * types are different, but equivalent) is *way more*
4057          * complicated and requires a many-to-many equivalence mapping.
4058          */
4059         if (btf_dedup_identical_structs(d, hypot_type_id, cand_id))
4060             return 1;
4061         return 0;
4062     }
4063 
4064     if (btf_dedup_hypot_map_add(d, canon_id, cand_id))
4065         return -ENOMEM;
4066 
4067     cand_type = btf_type_by_id(d->btf, cand_id);
4068     canon_type = btf_type_by_id(d->btf, canon_id);
4069     cand_kind = btf_kind(cand_type);
4070     canon_kind = btf_kind(canon_type);
4071 
4072     if (cand_type->name_off != canon_type->name_off)
4073         return 0;
4074 
4075     /* FWD <--> STRUCT/UNION equivalence check, if enabled */
4076     if ((cand_kind == BTF_KIND_FWD || canon_kind == BTF_KIND_FWD)
4077         && cand_kind != canon_kind) {
4078         __u16 real_kind;
4079         __u16 fwd_kind;
4080 
4081         if (cand_kind == BTF_KIND_FWD) {
4082             real_kind = canon_kind;
4083             fwd_kind = btf_fwd_kind(cand_type);
4084         } else {
4085             real_kind = cand_kind;
4086             fwd_kind = btf_fwd_kind(canon_type);
4087             /* we'd need to resolve base FWD to STRUCT/UNION */
4088             if (fwd_kind == real_kind && canon_id < d->btf->start_id)
4089                 d->hypot_adjust_canon = true;
4090         }
4091         return fwd_kind == real_kind;
4092     }
4093 
4094     if (cand_kind != canon_kind)
4095         return 0;
4096 
4097     switch (cand_kind) {
4098     case BTF_KIND_INT:
4099         return btf_equal_int_tag(cand_type, canon_type);
4100 
4101     case BTF_KIND_ENUM:
4102         return btf_compat_enum(cand_type, canon_type);
4103 
4104     case BTF_KIND_ENUM64:
4105         return btf_compat_enum64(cand_type, canon_type);
4106 
4107     case BTF_KIND_FWD:
4108     case BTF_KIND_FLOAT:
4109         return btf_equal_common(cand_type, canon_type);
4110 
4111     case BTF_KIND_CONST:
4112     case BTF_KIND_VOLATILE:
4113     case BTF_KIND_RESTRICT:
4114     case BTF_KIND_PTR:
4115     case BTF_KIND_TYPEDEF:
4116     case BTF_KIND_FUNC:
4117     case BTF_KIND_TYPE_TAG:
4118         if (cand_type->info != canon_type->info)
4119             return 0;
4120         return btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4121 
4122     case BTF_KIND_ARRAY: {
4123         const struct btf_array *cand_arr, *canon_arr;
4124 
4125         if (!btf_compat_array(cand_type, canon_type))
4126             return 0;
4127         cand_arr = btf_array(cand_type);
4128         canon_arr = btf_array(canon_type);
4129         eq = btf_dedup_is_equiv(d, cand_arr->index_type, canon_arr->index_type);
4130         if (eq <= 0)
4131             return eq;
4132         return btf_dedup_is_equiv(d, cand_arr->type, canon_arr->type);
4133     }
4134 
4135     case BTF_KIND_STRUCT:
4136     case BTF_KIND_UNION: {
4137         const struct btf_member *cand_m, *canon_m;
4138         __u16 vlen;
4139 
4140         if (!btf_shallow_equal_struct(cand_type, canon_type))
4141             return 0;
4142         vlen = btf_vlen(cand_type);
4143         cand_m = btf_members(cand_type);
4144         canon_m = btf_members(canon_type);
4145         for (i = 0; i < vlen; i++) {
4146             eq = btf_dedup_is_equiv(d, cand_m->type, canon_m->type);
4147             if (eq <= 0)
4148                 return eq;
4149             cand_m++;
4150             canon_m++;
4151         }
4152 
4153         return 1;
4154     }
4155 
4156     case BTF_KIND_FUNC_PROTO: {
4157         const struct btf_param *cand_p, *canon_p;
4158         __u16 vlen;
4159 
4160         if (!btf_compat_fnproto(cand_type, canon_type))
4161             return 0;
4162         eq = btf_dedup_is_equiv(d, cand_type->type, canon_type->type);
4163         if (eq <= 0)
4164             return eq;
4165         vlen = btf_vlen(cand_type);
4166         cand_p = btf_params(cand_type);
4167         canon_p = btf_params(canon_type);
4168         for (i = 0; i < vlen; i++) {
4169             eq = btf_dedup_is_equiv(d, cand_p->type, canon_p->type);
4170             if (eq <= 0)
4171                 return eq;
4172             cand_p++;
4173             canon_p++;
4174         }
4175         return 1;
4176     }
4177 
4178     default:
4179         return -EINVAL;
4180     }
4181     return 0;
4182 }
4183 
4184 /*
4185  * Use hypothetical mapping, produced by successful type graph equivalence
4186  * check, to augment existing struct/union canonical mapping, where possible.
4187  *
4188  * If BTF_KIND_FWD resolution is allowed, this mapping is also used to record
4189  * FWD -> STRUCT/UNION correspondence as well. FWD resolution is bidirectional:
4190  * it doesn't matter if FWD type was part of canonical graph or candidate one,
4191  * we are recording the mapping anyway. As opposed to carefulness required
4192  * for struct/union correspondence mapping (described below), for FWD resolution
4193  * it's not important, as by the time that FWD type (reference type) will be
4194  * deduplicated all structs/unions will be deduped already anyway.
4195  *
4196  * Recording STRUCT/UNION mapping is purely a performance optimization and is
4197  * not required for correctness. It needs to be done carefully to ensure that
4198  * struct/union from candidate's type graph is not mapped into corresponding
4199  * struct/union from canonical type graph that itself hasn't been resolved into
4200  * canonical representative. The only guarantee we have is that canonical
4201  * struct/union was determined as canonical and that won't change. But any
4202  * types referenced through that struct/union fields could have been not yet
4203  * resolved, so in case like that it's too early to establish any kind of
4204  * correspondence between structs/unions.
4205  *
4206  * No canonical correspondence is derived for primitive types (they are already
4207  * deduplicated completely already anyway) or reference types (they rely on
4208  * stability of struct/union canonical relationship for equivalence checks).
4209  */
4210 static void btf_dedup_merge_hypot_map(struct btf_dedup *d)
4211 {
4212     __u32 canon_type_id, targ_type_id;
4213     __u16 t_kind, c_kind;
4214     __u32 t_id, c_id;
4215     int i;
4216 
4217     for (i = 0; i < d->hypot_cnt; i++) {
4218         canon_type_id = d->hypot_list[i];
4219         targ_type_id = d->hypot_map[canon_type_id];
4220         t_id = resolve_type_id(d, targ_type_id);
4221         c_id = resolve_type_id(d, canon_type_id);
4222         t_kind = btf_kind(btf__type_by_id(d->btf, t_id));
4223         c_kind = btf_kind(btf__type_by_id(d->btf, c_id));
4224         /*
4225          * Resolve FWD into STRUCT/UNION.
4226          * It's ok to resolve FWD into STRUCT/UNION that's not yet
4227          * mapped to canonical representative (as opposed to
4228          * STRUCT/UNION <--> STRUCT/UNION mapping logic below), because
4229          * eventually that struct is going to be mapped and all resolved
4230          * FWDs will automatically resolve to correct canonical
4231          * representative. This will happen before ref type deduping,
4232          * which critically depends on stability of these mapping. This
4233          * stability is not a requirement for STRUCT/UNION equivalence
4234          * checks, though.
4235          */
4236 
4237         /* if it's the split BTF case, we still need to point base FWD
4238          * to STRUCT/UNION in a split BTF, because FWDs from split BTF
4239          * will be resolved against base FWD. If we don't point base
4240          * canonical FWD to the resolved STRUCT/UNION, then all the
4241          * FWDs in split BTF won't be correctly resolved to a proper
4242          * STRUCT/UNION.
4243          */
4244         if (t_kind != BTF_KIND_FWD && c_kind == BTF_KIND_FWD)
4245             d->map[c_id] = t_id;
4246 
4247         /* if graph equivalence determined that we'd need to adjust
4248          * base canonical types, then we need to only point base FWDs
4249          * to STRUCTs/UNIONs and do no more modifications. For all
4250          * other purposes the type graphs were not equivalent.
4251          */
4252         if (d->hypot_adjust_canon)
4253             continue;
4254 
4255         if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD)
4256             d->map[t_id] = c_id;
4257 
4258         if ((t_kind == BTF_KIND_STRUCT || t_kind == BTF_KIND_UNION) &&
4259             c_kind != BTF_KIND_FWD &&
4260             is_type_mapped(d, c_id) &&
4261             !is_type_mapped(d, t_id)) {
4262             /*
4263              * as a perf optimization, we can map struct/union
4264              * that's part of type graph we just verified for
4265              * equivalence. We can do that for struct/union that has
4266              * canonical representative only, though.
4267              */
4268             d->map[t_id] = c_id;
4269         }
4270     }
4271 }
4272 
4273 /*
4274  * Deduplicate struct/union types.
4275  *
4276  * For each struct/union type its type signature hash is calculated, taking
4277  * into account type's name, size, number, order and names of fields, but
4278  * ignoring type ID's referenced from fields, because they might not be deduped
4279  * completely until after reference types deduplication phase. This type hash
4280  * is used to iterate over all potential canonical types, sharing same hash.
4281  * For each canonical candidate we check whether type graphs that they form
4282  * (through referenced types in fields and so on) are equivalent using algorithm
4283  * implemented in `btf_dedup_is_equiv`. If such equivalence is found and
4284  * BTF_KIND_FWD resolution is allowed, then hypothetical mapping
4285  * (btf_dedup->hypot_map) produced by aforementioned type graph equivalence
4286  * algorithm is used to record FWD -> STRUCT/UNION mapping. It's also used to
4287  * potentially map other structs/unions to their canonical representatives,
4288  * if such relationship hasn't yet been established. This speeds up algorithm
4289  * by eliminating some of the duplicate work.
4290  *
4291  * If no matching canonical representative was found, struct/union is marked
4292  * as canonical for itself and is added into btf_dedup->dedup_table hash map
4293  * for further look ups.
4294  */
4295 static int btf_dedup_struct_type(struct btf_dedup *d, __u32 type_id)
4296 {
4297     struct btf_type *cand_type, *t;
4298     struct hashmap_entry *hash_entry;
4299     /* if we don't find equivalent type, then we are canonical */
4300     __u32 new_id = type_id;
4301     __u16 kind;
4302     long h;
4303 
4304     /* already deduped or is in process of deduping (loop detected) */
4305     if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4306         return 0;
4307 
4308     t = btf_type_by_id(d->btf, type_id);
4309     kind = btf_kind(t);
4310 
4311     if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION)
4312         return 0;
4313 
4314     h = btf_hash_struct(t);
4315     for_each_dedup_cand(d, hash_entry, h) {
4316         __u32 cand_id = (__u32)(long)hash_entry->value;
4317         int eq;
4318 
4319         /*
4320          * Even though btf_dedup_is_equiv() checks for
4321          * btf_shallow_equal_struct() internally when checking two
4322          * structs (unions) for equivalence, we need to guard here
4323          * from picking matching FWD type as a dedup candidate.
4324          * This can happen due to hash collision. In such case just
4325          * relying on btf_dedup_is_equiv() would lead to potentially
4326          * creating a loop (FWD -> STRUCT and STRUCT -> FWD), because
4327          * FWD and compatible STRUCT/UNION are considered equivalent.
4328          */
4329         cand_type = btf_type_by_id(d->btf, cand_id);
4330         if (!btf_shallow_equal_struct(t, cand_type))
4331             continue;
4332 
4333         btf_dedup_clear_hypot_map(d);
4334         eq = btf_dedup_is_equiv(d, type_id, cand_id);
4335         if (eq < 0)
4336             return eq;
4337         if (!eq)
4338             continue;
4339         btf_dedup_merge_hypot_map(d);
4340         if (d->hypot_adjust_canon) /* not really equivalent */
4341             continue;
4342         new_id = cand_id;
4343         break;
4344     }
4345 
4346     d->map[type_id] = new_id;
4347     if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4348         return -ENOMEM;
4349 
4350     return 0;
4351 }
4352 
4353 static int btf_dedup_struct_types(struct btf_dedup *d)
4354 {
4355     int i, err;
4356 
4357     for (i = 0; i < d->btf->nr_types; i++) {
4358         err = btf_dedup_struct_type(d, d->btf->start_id + i);
4359         if (err)
4360             return err;
4361     }
4362     return 0;
4363 }
4364 
4365 /*
4366  * Deduplicate reference type.
4367  *
4368  * Once all primitive and struct/union types got deduplicated, we can easily
4369  * deduplicate all other (reference) BTF types. This is done in two steps:
4370  *
4371  * 1. Resolve all referenced type IDs into their canonical type IDs. This
4372  * resolution can be done either immediately for primitive or struct/union types
4373  * (because they were deduped in previous two phases) or recursively for
4374  * reference types. Recursion will always terminate at either primitive or
4375  * struct/union type, at which point we can "unwind" chain of reference types
4376  * one by one. There is no danger of encountering cycles because in C type
4377  * system the only way to form type cycle is through struct/union, so any chain
4378  * of reference types, even those taking part in a type cycle, will inevitably
4379  * reach struct/union at some point.
4380  *
4381  * 2. Once all referenced type IDs are resolved into canonical ones, BTF type
4382  * becomes "stable", in the sense that no further deduplication will cause
4383  * any changes to it. With that, it's now possible to calculate type's signature
4384  * hash (this time taking into account referenced type IDs) and loop over all
4385  * potential canonical representatives. If no match was found, current type
4386  * will become canonical representative of itself and will be added into
4387  * btf_dedup->dedup_table as another possible canonical representative.
4388  */
4389 static int btf_dedup_ref_type(struct btf_dedup *d, __u32 type_id)
4390 {
4391     struct hashmap_entry *hash_entry;
4392     __u32 new_id = type_id, cand_id;
4393     struct btf_type *t, *cand;
4394     /* if we don't find equivalent type, then we are representative type */
4395     int ref_type_id;
4396     long h;
4397 
4398     if (d->map[type_id] == BTF_IN_PROGRESS_ID)
4399         return -ELOOP;
4400     if (d->map[type_id] <= BTF_MAX_NR_TYPES)
4401         return resolve_type_id(d, type_id);
4402 
4403     t = btf_type_by_id(d->btf, type_id);
4404     d->map[type_id] = BTF_IN_PROGRESS_ID;
4405 
4406     switch (btf_kind(t)) {
4407     case BTF_KIND_CONST:
4408     case BTF_KIND_VOLATILE:
4409     case BTF_KIND_RESTRICT:
4410     case BTF_KIND_PTR:
4411     case BTF_KIND_TYPEDEF:
4412     case BTF_KIND_FUNC:
4413     case BTF_KIND_TYPE_TAG:
4414         ref_type_id = btf_dedup_ref_type(d, t->type);
4415         if (ref_type_id < 0)
4416             return ref_type_id;
4417         t->type = ref_type_id;
4418 
4419         h = btf_hash_common(t);
4420         for_each_dedup_cand(d, hash_entry, h) {
4421             cand_id = (__u32)(long)hash_entry->value;
4422             cand = btf_type_by_id(d->btf, cand_id);
4423             if (btf_equal_common(t, cand)) {
4424                 new_id = cand_id;
4425                 break;
4426             }
4427         }
4428         break;
4429 
4430     case BTF_KIND_DECL_TAG:
4431         ref_type_id = btf_dedup_ref_type(d, t->type);
4432         if (ref_type_id < 0)
4433             return ref_type_id;
4434         t->type = ref_type_id;
4435 
4436         h = btf_hash_int_decl_tag(t);
4437         for_each_dedup_cand(d, hash_entry, h) {
4438             cand_id = (__u32)(long)hash_entry->value;
4439             cand = btf_type_by_id(d->btf, cand_id);
4440             if (btf_equal_int_tag(t, cand)) {
4441                 new_id = cand_id;
4442                 break;
4443             }
4444         }
4445         break;
4446 
4447     case BTF_KIND_ARRAY: {
4448         struct btf_array *info = btf_array(t);
4449 
4450         ref_type_id = btf_dedup_ref_type(d, info->type);
4451         if (ref_type_id < 0)
4452             return ref_type_id;
4453         info->type = ref_type_id;
4454 
4455         ref_type_id = btf_dedup_ref_type(d, info->index_type);
4456         if (ref_type_id < 0)
4457             return ref_type_id;
4458         info->index_type = ref_type_id;
4459 
4460         h = btf_hash_array(t);
4461         for_each_dedup_cand(d, hash_entry, h) {
4462             cand_id = (__u32)(long)hash_entry->value;
4463             cand = btf_type_by_id(d->btf, cand_id);
4464             if (btf_equal_array(t, cand)) {
4465                 new_id = cand_id;
4466                 break;
4467             }
4468         }
4469         break;
4470     }
4471 
4472     case BTF_KIND_FUNC_PROTO: {
4473         struct btf_param *param;
4474         __u16 vlen;
4475         int i;
4476 
4477         ref_type_id = btf_dedup_ref_type(d, t->type);
4478         if (ref_type_id < 0)
4479             return ref_type_id;
4480         t->type = ref_type_id;
4481 
4482         vlen = btf_vlen(t);
4483         param = btf_params(t);
4484         for (i = 0; i < vlen; i++) {
4485             ref_type_id = btf_dedup_ref_type(d, param->type);
4486             if (ref_type_id < 0)
4487                 return ref_type_id;
4488             param->type = ref_type_id;
4489             param++;
4490         }
4491 
4492         h = btf_hash_fnproto(t);
4493         for_each_dedup_cand(d, hash_entry, h) {
4494             cand_id = (__u32)(long)hash_entry->value;
4495             cand = btf_type_by_id(d->btf, cand_id);
4496             if (btf_equal_fnproto(t, cand)) {
4497                 new_id = cand_id;
4498                 break;
4499             }
4500         }
4501         break;
4502     }
4503 
4504     default:
4505         return -EINVAL;
4506     }
4507 
4508     d->map[type_id] = new_id;
4509     if (type_id == new_id && btf_dedup_table_add(d, h, type_id))
4510         return -ENOMEM;
4511 
4512     return new_id;
4513 }
4514 
4515 static int btf_dedup_ref_types(struct btf_dedup *d)
4516 {
4517     int i, err;
4518 
4519     for (i = 0; i < d->btf->nr_types; i++) {
4520         err = btf_dedup_ref_type(d, d->btf->start_id + i);
4521         if (err < 0)
4522             return err;
4523     }
4524     /* we won't need d->dedup_table anymore */
4525     hashmap__free(d->dedup_table);
4526     d->dedup_table = NULL;
4527     return 0;
4528 }
4529 
4530 /*
4531  * Compact types.
4532  *
4533  * After we established for each type its corresponding canonical representative
4534  * type, we now can eliminate types that are not canonical and leave only
4535  * canonical ones layed out sequentially in memory by copying them over
4536  * duplicates. During compaction btf_dedup->hypot_map array is reused to store
4537  * a map from original type ID to a new compacted type ID, which will be used
4538  * during next phase to "fix up" type IDs, referenced from struct/union and
4539  * reference types.
4540  */
4541 static int btf_dedup_compact_types(struct btf_dedup *d)
4542 {
4543     __u32 *new_offs;
4544     __u32 next_type_id = d->btf->start_id;
4545     const struct btf_type *t;
4546     void *p;
4547     int i, id, len;
4548 
4549     /* we are going to reuse hypot_map to store compaction remapping */
4550     d->hypot_map[0] = 0;
4551     /* base BTF types are not renumbered */
4552     for (id = 1; id < d->btf->start_id; id++)
4553         d->hypot_map[id] = id;
4554     for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++)
4555         d->hypot_map[id] = BTF_UNPROCESSED_ID;
4556 
4557     p = d->btf->types_data;
4558 
4559     for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) {
4560         if (d->map[id] != id)
4561             continue;
4562 
4563         t = btf__type_by_id(d->btf, id);
4564         len = btf_type_size(t);
4565         if (len < 0)
4566             return len;
4567 
4568         memmove(p, t, len);
4569         d->hypot_map[id] = next_type_id;
4570         d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data;
4571         p += len;
4572         next_type_id++;
4573     }
4574 
4575     /* shrink struct btf's internal types index and update btf_header */
4576     d->btf->nr_types = next_type_id - d->btf->start_id;
4577     d->btf->type_offs_cap = d->btf->nr_types;
4578     d->btf->hdr->type_len = p - d->btf->types_data;
4579     new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap,
4580                        sizeof(*new_offs));
4581     if (d->btf->type_offs_cap && !new_offs)
4582         return -ENOMEM;
4583     d->btf->type_offs = new_offs;
4584     d->btf->hdr->str_off = d->btf->hdr->type_len;
4585     d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len;
4586     return 0;
4587 }
4588 
4589 /*
4590  * Figure out final (deduplicated and compacted) type ID for provided original
4591  * `type_id` by first resolving it into corresponding canonical type ID and
4592  * then mapping it to a deduplicated type ID, stored in btf_dedup->hypot_map,
4593  * which is populated during compaction phase.
4594  */
4595 static int btf_dedup_remap_type_id(__u32 *type_id, void *ctx)
4596 {
4597     struct btf_dedup *d = ctx;
4598     __u32 resolved_type_id, new_type_id;
4599 
4600     resolved_type_id = resolve_type_id(d, *type_id);
4601     new_type_id = d->hypot_map[resolved_type_id];
4602     if (new_type_id > BTF_MAX_NR_TYPES)
4603         return -EINVAL;
4604 
4605     *type_id = new_type_id;
4606     return 0;
4607 }
4608 
4609 /*
4610  * Remap referenced type IDs into deduped type IDs.
4611  *
4612  * After BTF types are deduplicated and compacted, their final type IDs may
4613  * differ from original ones. The map from original to a corresponding
4614  * deduped type ID is stored in btf_dedup->hypot_map and is populated during
4615  * compaction phase. During remapping phase we are rewriting all type IDs
4616  * referenced from any BTF type (e.g., struct fields, func proto args, etc) to
4617  * their final deduped type IDs.
4618  */
4619 static int btf_dedup_remap_types(struct btf_dedup *d)
4620 {
4621     int i, r;
4622 
4623     for (i = 0; i < d->btf->nr_types; i++) {
4624         struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i);
4625 
4626         r = btf_type_visit_type_ids(t, btf_dedup_remap_type_id, d);
4627         if (r)
4628             return r;
4629     }
4630 
4631     if (!d->btf_ext)
4632         return 0;
4633 
4634     r = btf_ext_visit_type_ids(d->btf_ext, btf_dedup_remap_type_id, d);
4635     if (r)
4636         return r;
4637 
4638     return 0;
4639 }
4640 
4641 /*
4642  * Probe few well-known locations for vmlinux kernel image and try to load BTF
4643  * data out of it to use for target BTF.
4644  */
4645 struct btf *btf__load_vmlinux_btf(void)
4646 {
4647     struct {
4648         const char *path_fmt;
4649         bool raw_btf;
4650     } locations[] = {
4651         /* try canonical vmlinux BTF through sysfs first */
4652         { "/sys/kernel/btf/vmlinux", true /* raw BTF */ },
4653         /* fall back to trying to find vmlinux ELF on disk otherwise */
4654         { "/boot/vmlinux-%1$s" },
4655         { "/lib/modules/%1$s/vmlinux-%1$s" },
4656         { "/lib/modules/%1$s/build/vmlinux" },
4657         { "/usr/lib/modules/%1$s/kernel/vmlinux" },
4658         { "/usr/lib/debug/boot/vmlinux-%1$s" },
4659         { "/usr/lib/debug/boot/vmlinux-%1$s.debug" },
4660         { "/usr/lib/debug/lib/modules/%1$s/vmlinux" },
4661     };
4662     char path[PATH_MAX + 1];
4663     struct utsname buf;
4664     struct btf *btf;
4665     int i, err;
4666 
4667     uname(&buf);
4668 
4669     for (i = 0; i < ARRAY_SIZE(locations); i++) {
4670         snprintf(path, PATH_MAX, locations[i].path_fmt, buf.release);
4671 
4672         if (access(path, R_OK))
4673             continue;
4674 
4675         if (locations[i].raw_btf)
4676             btf = btf__parse_raw(path);
4677         else
4678             btf = btf__parse_elf(path, NULL);
4679         err = libbpf_get_error(btf);
4680         pr_debug("loading kernel BTF '%s': %d\n", path, err);
4681         if (err)
4682             continue;
4683 
4684         return btf;
4685     }
4686 
4687     pr_warn("failed to find valid kernel BTF\n");
4688     return libbpf_err_ptr(-ESRCH);
4689 }
4690 
4691 struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
4692 
4693 struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf)
4694 {
4695     char path[80];
4696 
4697     snprintf(path, sizeof(path), "/sys/kernel/btf/%s", module_name);
4698     return btf__parse_split(path, vmlinux_btf);
4699 }
4700 
4701 int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx)
4702 {
4703     int i, n, err;
4704 
4705     switch (btf_kind(t)) {
4706     case BTF_KIND_INT:
4707     case BTF_KIND_FLOAT:
4708     case BTF_KIND_ENUM:
4709     case BTF_KIND_ENUM64:
4710         return 0;
4711 
4712     case BTF_KIND_FWD:
4713     case BTF_KIND_CONST:
4714     case BTF_KIND_VOLATILE:
4715     case BTF_KIND_RESTRICT:
4716     case BTF_KIND_PTR:
4717     case BTF_KIND_TYPEDEF:
4718     case BTF_KIND_FUNC:
4719     case BTF_KIND_VAR:
4720     case BTF_KIND_DECL_TAG:
4721     case BTF_KIND_TYPE_TAG:
4722         return visit(&t->type, ctx);
4723 
4724     case BTF_KIND_ARRAY: {
4725         struct btf_array *a = btf_array(t);
4726 
4727         err = visit(&a->type, ctx);
4728         err = err ?: visit(&a->index_type, ctx);
4729         return err;
4730     }
4731 
4732     case BTF_KIND_STRUCT:
4733     case BTF_KIND_UNION: {
4734         struct btf_member *m = btf_members(t);
4735 
4736         for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4737             err = visit(&m->type, ctx);
4738             if (err)
4739                 return err;
4740         }
4741         return 0;
4742     }
4743 
4744     case BTF_KIND_FUNC_PROTO: {
4745         struct btf_param *m = btf_params(t);
4746 
4747         err = visit(&t->type, ctx);
4748         if (err)
4749             return err;
4750         for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4751             err = visit(&m->type, ctx);
4752             if (err)
4753                 return err;
4754         }
4755         return 0;
4756     }
4757 
4758     case BTF_KIND_DATASEC: {
4759         struct btf_var_secinfo *m = btf_var_secinfos(t);
4760 
4761         for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4762             err = visit(&m->type, ctx);
4763             if (err)
4764                 return err;
4765         }
4766         return 0;
4767     }
4768 
4769     default:
4770         return -EINVAL;
4771     }
4772 }
4773 
4774 int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx)
4775 {
4776     int i, n, err;
4777 
4778     err = visit(&t->name_off, ctx);
4779     if (err)
4780         return err;
4781 
4782     switch (btf_kind(t)) {
4783     case BTF_KIND_STRUCT:
4784     case BTF_KIND_UNION: {
4785         struct btf_member *m = btf_members(t);
4786 
4787         for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4788             err = visit(&m->name_off, ctx);
4789             if (err)
4790                 return err;
4791         }
4792         break;
4793     }
4794     case BTF_KIND_ENUM: {
4795         struct btf_enum *m = btf_enum(t);
4796 
4797         for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4798             err = visit(&m->name_off, ctx);
4799             if (err)
4800                 return err;
4801         }
4802         break;
4803     }
4804     case BTF_KIND_ENUM64: {
4805         struct btf_enum64 *m = btf_enum64(t);
4806 
4807         for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4808             err = visit(&m->name_off, ctx);
4809             if (err)
4810                 return err;
4811         }
4812         break;
4813     }
4814     case BTF_KIND_FUNC_PROTO: {
4815         struct btf_param *m = btf_params(t);
4816 
4817         for (i = 0, n = btf_vlen(t); i < n; i++, m++) {
4818             err = visit(&m->name_off, ctx);
4819             if (err)
4820                 return err;
4821         }
4822         break;
4823     }
4824     default:
4825         break;
4826     }
4827 
4828     return 0;
4829 }
4830 
4831 int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx)
4832 {
4833     const struct btf_ext_info *seg;
4834     struct btf_ext_info_sec *sec;
4835     int i, err;
4836 
4837     seg = &btf_ext->func_info;
4838     for_each_btf_ext_sec(seg, sec) {
4839         struct bpf_func_info_min *rec;
4840 
4841         for_each_btf_ext_rec(seg, sec, i, rec) {
4842             err = visit(&rec->type_id, ctx);
4843             if (err < 0)
4844                 return err;
4845         }
4846     }
4847 
4848     seg = &btf_ext->core_relo_info;
4849     for_each_btf_ext_sec(seg, sec) {
4850         struct bpf_core_relo *rec;
4851 
4852         for_each_btf_ext_rec(seg, sec, i, rec) {
4853             err = visit(&rec->type_id, ctx);
4854             if (err < 0)
4855                 return err;
4856         }
4857     }
4858 
4859     return 0;
4860 }
4861 
4862 int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx)
4863 {
4864     const struct btf_ext_info *seg;
4865     struct btf_ext_info_sec *sec;
4866     int i, err;
4867 
4868     seg = &btf_ext->func_info;
4869     for_each_btf_ext_sec(seg, sec) {
4870         err = visit(&sec->sec_name_off, ctx);
4871         if (err)
4872             return err;
4873     }
4874 
4875     seg = &btf_ext->line_info;
4876     for_each_btf_ext_sec(seg, sec) {
4877         struct bpf_line_info_min *rec;
4878 
4879         err = visit(&sec->sec_name_off, ctx);
4880         if (err)
4881             return err;
4882 
4883         for_each_btf_ext_rec(seg, sec, i, rec) {
4884             err = visit(&rec->file_name_off, ctx);
4885             if (err)
4886                 return err;
4887             err = visit(&rec->line_off, ctx);
4888             if (err)
4889                 return err;
4890         }
4891     }
4892 
4893     seg = &btf_ext->core_relo_info;
4894     for_each_btf_ext_sec(seg, sec) {
4895         struct bpf_core_relo *rec;
4896 
4897         err = visit(&sec->sec_name_off, ctx);
4898         if (err)
4899             return err;
4900 
4901         for_each_btf_ext_rec(seg, sec, i, rec) {
4902             err = visit(&rec->access_str_off, ctx);
4903             if (err)
4904                 return err;
4905         }
4906     }
4907 
4908     return 0;
4909 }