Lines Matching refs:btf
31 struct btf { struct
97 struct btf *base_btf; argument
192 static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt) in btf_add_type_offs_mem() argument
194 return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32), in btf_add_type_offs_mem()
195 btf->nr_types, BTF_MAX_NR_TYPES, add_cnt); in btf_add_type_offs_mem()
198 static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off) in btf_add_type_idx_entry() argument
202 p = btf_add_type_offs_mem(btf, 1); in btf_add_type_idx_entry()
220 static int btf_parse_hdr(struct btf *btf) in btf_parse_hdr() argument
222 struct btf_header *hdr = btf->hdr; in btf_parse_hdr()
225 if (btf->raw_size < sizeof(struct btf_header)) { in btf_parse_hdr()
231 btf->swapped_endian = true; in btf_parse_hdr()
243 if (btf->raw_size < hdr->hdr_len) { in btf_parse_hdr()
245 hdr->hdr_len, btf->raw_size); in btf_parse_hdr()
249 meta_left = btf->raw_size - hdr->hdr_len; in btf_parse_hdr()
251 pr_debug("Invalid BTF total size: %u\n", btf->raw_size); in btf_parse_hdr()
269 static int btf_parse_str_sec(struct btf *btf) in btf_parse_str_sec() argument
271 const struct btf_header *hdr = btf->hdr; in btf_parse_str_sec()
272 const char *start = btf->strs_data; in btf_parse_str_sec()
273 const char *end = start + btf->hdr->str_len; in btf_parse_str_sec()
275 if (btf->base_btf && hdr->str_len == 0) in btf_parse_str_sec()
281 if (!btf->base_btf && start[0]) { in btf_parse_str_sec()
413 static int btf_parse_type_sec(struct btf *btf) in btf_parse_type_sec() argument
415 struct btf_header *hdr = btf->hdr; in btf_parse_type_sec()
416 void *next_type = btf->types_data; in btf_parse_type_sec()
421 if (btf->swapped_endian) in btf_parse_type_sec()
428 pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types); in btf_parse_type_sec()
432 if (btf->swapped_endian && btf_bswap_type_rest(next_type)) in btf_parse_type_sec()
435 err = btf_add_type_idx_entry(btf, next_type - btf->types_data); in btf_parse_type_sec()
440 btf->nr_types++; in btf_parse_type_sec()
451 __u32 btf__type_cnt(const struct btf *btf) in btf__type_cnt() argument
453 return btf->start_id + btf->nr_types; in btf__type_cnt()
456 const struct btf *btf__base_btf(const struct btf *btf) in btf__base_btf() argument
458 return btf->base_btf; in btf__base_btf()
462 struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id) in btf_type_by_id() argument
466 if (type_id < btf->start_id) in btf_type_by_id()
467 return btf_type_by_id(btf->base_btf, type_id); in btf_type_by_id()
468 return btf->types_data + btf->type_offs[type_id - btf->start_id]; in btf_type_by_id()
471 const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id) in btf__type_by_id() argument
473 if (type_id >= btf->start_id + btf->nr_types) in btf__type_by_id()
475 return btf_type_by_id((struct btf *)btf, type_id); in btf__type_by_id()
478 static int determine_ptr_size(const struct btf *btf) in determine_ptr_size() argument
497 if (btf->base_btf && btf->base_btf->ptr_sz > 0) in determine_ptr_size()
498 return btf->base_btf->ptr_sz; in determine_ptr_size()
500 n = btf__type_cnt(btf); in determine_ptr_size()
502 t = btf__type_by_id(btf, i); in determine_ptr_size()
509 name = btf__name_by_offset(btf, t->name_off); in determine_ptr_size()
522 static size_t btf_ptr_sz(const struct btf *btf) in btf_ptr_sz() argument
524 if (!btf->ptr_sz) in btf_ptr_sz()
525 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf_ptr_sz()
526 return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz; in btf_ptr_sz()
537 size_t btf__pointer_size(const struct btf *btf) in btf__pointer_size() argument
539 if (!btf->ptr_sz) in btf__pointer_size()
540 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf__pointer_size()
542 if (btf->ptr_sz < 0) in btf__pointer_size()
546 return btf->ptr_sz; in btf__pointer_size()
552 int btf__set_pointer_size(struct btf *btf, size_t ptr_sz) in btf__set_pointer_size() argument
556 btf->ptr_sz = ptr_sz; in btf__set_pointer_size()
571 enum btf_endianness btf__endianness(const struct btf *btf) in btf__endianness() argument
574 return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN; in btf__endianness()
576 return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN; in btf__endianness()
579 int btf__set_endianness(struct btf *btf, enum btf_endianness endian) in btf__set_endianness() argument
584 btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN); in btf__set_endianness()
585 if (!btf->swapped_endian) { in btf__set_endianness()
586 free(btf->raw_data_swapped); in btf__set_endianness()
587 btf->raw_data_swapped = NULL; in btf__set_endianness()
604 __s64 btf__resolve_size(const struct btf *btf, __u32 type_id) in btf__resolve_size() argument
612 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
625 size = btf_ptr_sz(btf); in btf__resolve_size()
647 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
659 int btf__align_of(const struct btf *btf, __u32 id) in btf__align_of() argument
661 const struct btf_type *t = btf__type_by_id(btf, id); in btf__align_of()
669 return min(btf_ptr_sz(btf), (size_t)t->size); in btf__align_of()
671 return btf_ptr_sz(btf); in btf__align_of()
677 return btf__align_of(btf, t->type); in btf__align_of()
679 return btf__align_of(btf, btf_array(t)->type); in btf__align_of()
687 align = btf__align_of(btf, m->type); in btf__align_of()
714 int btf__resolve_type(const struct btf *btf, __u32 type_id) in btf__resolve_type() argument
719 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
724 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
734 __s32 btf__find_by_name(const struct btf *btf, const char *type_name) in btf__find_by_name() argument
736 __u32 i, nr_types = btf__type_cnt(btf); in btf__find_by_name()
742 const struct btf_type *t = btf__type_by_id(btf, i); in btf__find_by_name()
743 const char *name = btf__name_by_offset(btf, t->name_off); in btf__find_by_name()
752 static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id, in btf_find_by_name_kind() argument
755 __u32 i, nr_types = btf__type_cnt(btf); in btf_find_by_name_kind()
761 const struct btf_type *t = btf__type_by_id(btf, i); in btf_find_by_name_kind()
766 name = btf__name_by_offset(btf, t->name_off); in btf_find_by_name_kind()
774 __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, in btf__find_by_name_kind_own() argument
777 return btf_find_by_name_kind(btf, btf->start_id, type_name, kind); in btf__find_by_name_kind_own()
780 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name, in btf__find_by_name_kind() argument
783 return btf_find_by_name_kind(btf, 1, type_name, kind); in btf__find_by_name_kind()
786 static bool btf_is_modifiable(const struct btf *btf) in btf_is_modifiable() argument
788 return (void *)btf->hdr != btf->raw_data; in btf_is_modifiable()
791 void btf__free(struct btf *btf) in btf__free() argument
793 if (IS_ERR_OR_NULL(btf)) in btf__free()
796 if (btf->fd >= 0) in btf__free()
797 close(btf->fd); in btf__free()
799 if (btf_is_modifiable(btf)) { in btf__free()
806 free(btf->hdr); in btf__free()
807 free(btf->types_data); in btf__free()
808 strset__free(btf->strs_set); in btf__free()
810 free(btf->raw_data); in btf__free()
811 free(btf->raw_data_swapped); in btf__free()
812 free(btf->type_offs); in btf__free()
813 free(btf); in btf__free()
816 static struct btf *btf_new_empty(struct btf *base_btf) in btf_new_empty()
818 struct btf *btf; in btf_new_empty() local
820 btf = calloc(1, sizeof(*btf)); in btf_new_empty()
821 if (!btf) in btf_new_empty()
824 btf->nr_types = 0; in btf_new_empty()
825 btf->start_id = 1; in btf_new_empty()
826 btf->start_str_off = 0; in btf_new_empty()
827 btf->fd = -1; in btf_new_empty()
828 btf->ptr_sz = sizeof(void *); in btf_new_empty()
829 btf->swapped_endian = false; in btf_new_empty()
832 btf->base_btf = base_btf; in btf_new_empty()
833 btf->start_id = btf__type_cnt(base_btf); in btf_new_empty()
834 btf->start_str_off = base_btf->hdr->str_len; in btf_new_empty()
838 btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1); in btf_new_empty()
839 btf->raw_data = calloc(1, btf->raw_size); in btf_new_empty()
840 if (!btf->raw_data) { in btf_new_empty()
841 free(btf); in btf_new_empty()
845 btf->hdr = btf->raw_data; in btf_new_empty()
846 btf->hdr->hdr_len = sizeof(struct btf_header); in btf_new_empty()
847 btf->hdr->magic = BTF_MAGIC; in btf_new_empty()
848 btf->hdr->version = BTF_VERSION; in btf_new_empty()
850 btf->types_data = btf->raw_data + btf->hdr->hdr_len; in btf_new_empty()
851 btf->strs_data = btf->raw_data + btf->hdr->hdr_len; in btf_new_empty()
852 btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */ in btf_new_empty()
854 return btf; in btf_new_empty()
857 struct btf *btf__new_empty(void) in btf__new_empty()
862 struct btf *btf__new_empty_split(struct btf *base_btf) in btf__new_empty_split()
867 static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf) in btf_new()
869 struct btf *btf; in btf_new() local
872 btf = calloc(1, sizeof(struct btf)); in btf_new()
873 if (!btf) in btf_new()
876 btf->nr_types = 0; in btf_new()
877 btf->start_id = 1; in btf_new()
878 btf->start_str_off = 0; in btf_new()
879 btf->fd = -1; in btf_new()
882 btf->base_btf = base_btf; in btf_new()
883 btf->start_id = btf__type_cnt(base_btf); in btf_new()
884 btf->start_str_off = base_btf->hdr->str_len; in btf_new()
887 btf->raw_data = malloc(size); in btf_new()
888 if (!btf->raw_data) { in btf_new()
892 memcpy(btf->raw_data, data, size); in btf_new()
893 btf->raw_size = size; in btf_new()
895 btf->hdr = btf->raw_data; in btf_new()
896 err = btf_parse_hdr(btf); in btf_new()
900 btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off; in btf_new()
901 btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off; in btf_new()
903 err = btf_parse_str_sec(btf); in btf_new()
904 err = err ?: btf_parse_type_sec(btf); in btf_new()
910 btf__free(btf); in btf_new()
914 return btf; in btf_new()
917 struct btf *btf__new(const void *data, __u32 size) in btf__new()
922 static struct btf *btf_parse_elf(const char *path, struct btf *base_btf, in btf_parse_elf()
927 struct btf *btf = NULL; in btf_parse_elf() local
1008 btf = btf_new(btf_data->d_buf, btf_data->d_size, base_btf); in btf_parse_elf()
1009 err = libbpf_get_error(btf); in btf_parse_elf()
1015 btf__set_pointer_size(btf, 4); in btf_parse_elf()
1018 btf__set_pointer_size(btf, 8); in btf_parse_elf()
1039 return btf; in btf_parse_elf()
1043 btf__free(btf); in btf_parse_elf()
1048 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext) in btf__parse_elf()
1053 struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf) in btf__parse_elf_split()
1058 static struct btf *btf_parse_raw(const char *path, struct btf *base_btf) in btf_parse_raw()
1060 struct btf *btf = NULL; in btf_parse_raw() local
1112 btf = btf_new(data, sz, base_btf); in btf_parse_raw()
1118 return err ? ERR_PTR(err) : btf; in btf_parse_raw()
1121 struct btf *btf__parse_raw(const char *path) in btf__parse_raw()
1126 struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf) in btf__parse_raw_split()
1131 static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext) in btf_parse()
1133 struct btf *btf; in btf_parse() local
1139 btf = btf_parse_raw(path, base_btf); in btf_parse()
1140 err = libbpf_get_error(btf); in btf_parse()
1142 return btf; in btf_parse()
1148 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext) in btf__parse()
1153 struct btf *btf__parse_split(const char *path, struct btf *base_btf) in btf__parse_split()
1158 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1160 int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level) in btf_load_into_kernel() argument
1168 if (btf->fd >= 0) in btf_load_into_kernel()
1174 raw_data = btf_get_raw_data(btf, &raw_size, false); in btf_load_into_kernel()
1179 btf->raw_size = raw_size; in btf_load_into_kernel()
1180 btf->raw_data = raw_data; in btf_load_into_kernel()
1210 btf->fd = bpf_btf_load(raw_data, raw_size, &opts); in btf_load_into_kernel()
1211 if (btf->fd < 0) { in btf_load_into_kernel()
1235 int btf__load_into_kernel(struct btf *btf) in btf__load_into_kernel() argument
1237 return btf_load_into_kernel(btf, NULL, 0, 0); in btf__load_into_kernel()
1240 int btf__fd(const struct btf *btf) in btf__fd() argument
1242 return btf->fd; in btf__fd()
1245 void btf__set_fd(struct btf *btf, int fd) in btf__set_fd() argument
1247 btf->fd = fd; in btf__set_fd()
1250 static const void *btf_strs_data(const struct btf *btf) in btf_strs_data() argument
1252 return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set); in btf_strs_data()
1255 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian) in btf_get_raw_data() argument
1257 struct btf_header *hdr = btf->hdr; in btf_get_raw_data()
1263 data = swap_endian ? btf->raw_data_swapped : btf->raw_data; in btf_get_raw_data()
1265 *size = btf->raw_size; in btf_get_raw_data()
1280 memcpy(p, btf->types_data, hdr->type_len); in btf_get_raw_data()
1282 for (i = 0; i < btf->nr_types; i++) { in btf_get_raw_data()
1283 t = p + btf->type_offs[i]; in btf_get_raw_data()
1295 memcpy(p, btf_strs_data(btf), hdr->str_len); in btf_get_raw_data()
1305 const void *btf__raw_data(const struct btf *btf_ro, __u32 *size) in btf__raw_data()
1307 struct btf *btf = (struct btf *)btf_ro; in btf__raw_data() local
1311 data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian); in btf__raw_data()
1315 btf->raw_size = data_sz; in btf__raw_data()
1316 if (btf->swapped_endian) in btf__raw_data()
1317 btf->raw_data_swapped = data; in btf__raw_data()
1319 btf->raw_data = data; in btf__raw_data()
1325 const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1327 const char *btf__str_by_offset(const struct btf *btf, __u32 offset) in btf__str_by_offset() argument
1329 if (offset < btf->start_str_off) in btf__str_by_offset()
1330 return btf__str_by_offset(btf->base_btf, offset); in btf__str_by_offset()
1331 else if (offset - btf->start_str_off < btf->hdr->str_len) in btf__str_by_offset()
1332 return btf_strs_data(btf) + (offset - btf->start_str_off); in btf__str_by_offset()
1337 const char *btf__name_by_offset(const struct btf *btf, __u32 offset) in btf__name_by_offset() argument
1339 return btf__str_by_offset(btf, offset); in btf__name_by_offset()
1342 struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf) in btf_get_from_fd()
1347 struct btf *btf; in btf_get_from_fd() local
1361 btf_info.btf = ptr_to_u64(ptr); in btf_get_from_fd()
1371 btf = ERR_PTR(-ENOMEM); in btf_get_from_fd()
1378 btf_info.btf = ptr_to_u64(ptr); in btf_get_from_fd()
1385 btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG); in btf_get_from_fd()
1389 btf = btf_new(ptr, btf_info.btf_size, base_btf); in btf_get_from_fd()
1393 return btf; in btf_get_from_fd()
1396 struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf) in btf__load_from_kernel_by_id_split()
1398 struct btf *btf; in btf__load_from_kernel_by_id_split() local
1405 btf = btf_get_from_fd(btf_fd, base_btf); in btf__load_from_kernel_by_id_split()
1408 return libbpf_ptr(btf); in btf__load_from_kernel_by_id_split()
1411 struct btf *btf__load_from_kernel_by_id(__u32 id) in btf__load_from_kernel_by_id()
1416 static void btf_invalidate_raw_data(struct btf *btf) in btf_invalidate_raw_data() argument
1418 if (btf->raw_data) { in btf_invalidate_raw_data()
1419 free(btf->raw_data); in btf_invalidate_raw_data()
1420 btf->raw_data = NULL; in btf_invalidate_raw_data()
1422 if (btf->raw_data_swapped) { in btf_invalidate_raw_data()
1423 free(btf->raw_data_swapped); in btf_invalidate_raw_data()
1424 btf->raw_data_swapped = NULL; in btf_invalidate_raw_data()
1432 static int btf_ensure_modifiable(struct btf *btf) in btf_ensure_modifiable() argument
1438 if (btf_is_modifiable(btf)) { in btf_ensure_modifiable()
1440 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1445 hdr = malloc(btf->hdr->hdr_len); in btf_ensure_modifiable()
1446 types = malloc(btf->hdr->type_len); in btf_ensure_modifiable()
1450 memcpy(hdr, btf->hdr, btf->hdr->hdr_len); in btf_ensure_modifiable()
1451 memcpy(types, btf->types_data, btf->hdr->type_len); in btf_ensure_modifiable()
1454 set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len); in btf_ensure_modifiable()
1461 btf->hdr = hdr; in btf_ensure_modifiable()
1462 btf->types_data = types; in btf_ensure_modifiable()
1463 btf->types_data_cap = btf->hdr->type_len; in btf_ensure_modifiable()
1464 btf->strs_data = NULL; in btf_ensure_modifiable()
1465 btf->strs_set = set; in btf_ensure_modifiable()
1469 if (btf->hdr->str_len == 0) in btf_ensure_modifiable()
1470 btf->strs_deduped = true; in btf_ensure_modifiable()
1471 if (!btf->base_btf && btf->hdr->str_len == 1) in btf_ensure_modifiable()
1472 btf->strs_deduped = true; in btf_ensure_modifiable()
1475 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1492 int btf__find_str(struct btf *btf, const char *s) in btf__find_str() argument
1496 if (btf->base_btf) { in btf__find_str()
1497 off = btf__find_str(btf->base_btf, s); in btf__find_str()
1503 if (btf_ensure_modifiable(btf)) in btf__find_str()
1506 off = strset__find_str(btf->strs_set, s); in btf__find_str()
1510 return btf->start_str_off + off; in btf__find_str()
1518 int btf__add_str(struct btf *btf, const char *s) in btf__add_str() argument
1522 if (btf->base_btf) { in btf__add_str()
1523 off = btf__find_str(btf->base_btf, s); in btf__add_str()
1528 if (btf_ensure_modifiable(btf)) in btf__add_str()
1531 off = strset__add_str(btf->strs_set, s); in btf__add_str()
1535 btf->hdr->str_len = strset__data_size(btf->strs_set); in btf__add_str()
1537 return btf->start_str_off + off; in btf__add_str()
1540 static void *btf_add_type_mem(struct btf *btf, size_t add_sz) in btf_add_type_mem() argument
1542 return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1, in btf_add_type_mem()
1543 btf->hdr->type_len, UINT_MAX, add_sz); in btf_add_type_mem()
1551 static int btf_commit_type(struct btf *btf, int data_sz) in btf_commit_type() argument
1555 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf_commit_type()
1559 btf->hdr->type_len += data_sz; in btf_commit_type()
1560 btf->hdr->str_off += data_sz; in btf_commit_type()
1561 btf->nr_types++; in btf_commit_type()
1562 return btf->start_id + btf->nr_types - 1; in btf_commit_type()
1566 const struct btf *src;
1567 struct btf *dst;
1603 int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type) in btf__add_type() argument
1605 struct btf_pipe p = { .src = src_btf, .dst = btf }; in btf__add_type()
1614 if (btf_ensure_modifiable(btf)) in btf__add_type()
1617 t = btf_add_type_mem(btf, sz); in btf__add_type()
1627 return btf_commit_type(btf, sz); in btf__add_type()
1632 struct btf *btf = ctx; in btf_rewrite_type_ids() local
1641 *type_id += btf->start_id + btf->nr_types - 1; in btf_rewrite_type_ids()
1648 int btf__add_btf(struct btf *btf, const struct btf *src_btf) in btf__add_btf() argument
1650 struct btf_pipe p = { .src = src_btf, .dst = btf }; in btf__add_btf()
1660 if (btf_ensure_modifiable(btf)) in btf__add_btf()
1666 old_strs_len = btf->hdr->str_len; in btf__add_btf()
1672 t = btf_add_type_mem(btf, data_sz); in btf__add_btf()
1677 off = btf_add_type_offs_mem(btf, cnt); in btf__add_btf()
1698 *off = t - btf->types_data; in btf__add_btf()
1706 err = btf_type_visit_type_ids(t, btf_rewrite_type_ids, btf); in btf__add_btf()
1723 btf->hdr->type_len += data_sz; in btf__add_btf()
1724 btf->hdr->str_off += data_sz; in btf__add_btf()
1725 btf->nr_types += cnt; in btf__add_btf()
1730 return btf->start_id + btf->nr_types - cnt; in btf__add_btf()
1735 memset(btf->types_data + btf->hdr->type_len, 0, data_sz); in btf__add_btf()
1736 memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len); in btf__add_btf()
1741 btf->hdr->str_len = old_strs_len; in btf__add_btf()
1757 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding) in btf__add_int() argument
1772 if (btf_ensure_modifiable(btf)) in btf__add_int()
1776 t = btf_add_type_mem(btf, sz); in btf__add_int()
1784 name_off = btf__add_str(btf, name); in btf__add_int()
1794 return btf_commit_type(btf, sz); in btf__add_int()
1805 int btf__add_float(struct btf *btf, const char *name, size_t byte_sz) in btf__add_float() argument
1819 if (btf_ensure_modifiable(btf)) in btf__add_float()
1823 t = btf_add_type_mem(btf, sz); in btf__add_float()
1827 name_off = btf__add_str(btf, name); in btf__add_float()
1835 return btf_commit_type(btf, sz); in btf__add_float()
1850 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id) in btf_add_ref_kind() argument
1858 if (btf_ensure_modifiable(btf)) in btf_add_ref_kind()
1862 t = btf_add_type_mem(btf, sz); in btf_add_ref_kind()
1867 name_off = btf__add_str(btf, name); in btf_add_ref_kind()
1876 return btf_commit_type(btf, sz); in btf_add_ref_kind()
1886 int btf__add_ptr(struct btf *btf, int ref_type_id) in btf__add_ptr() argument
1888 return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id); in btf__add_ptr()
1900 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems) in btf__add_array() argument
1909 if (btf_ensure_modifiable(btf)) in btf__add_array()
1913 t = btf_add_type_mem(btf, sz); in btf__add_array()
1926 return btf_commit_type(btf, sz); in btf__add_array()
1930 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz) in btf_add_composite() argument
1935 if (btf_ensure_modifiable(btf)) in btf_add_composite()
1939 t = btf_add_type_mem(btf, sz); in btf_add_composite()
1944 name_off = btf__add_str(btf, name); in btf_add_composite()
1956 return btf_commit_type(btf, sz); in btf_add_composite()
1971 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_struct() argument
1973 return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz); in btf__add_struct()
1989 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_union() argument
1991 return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz); in btf__add_union()
1994 static struct btf_type *btf_last_type(struct btf *btf) in btf_last_type() argument
1996 return btf_type_by_id(btf, btf__type_cnt(btf) - 1); in btf_last_type()
2009 int btf__add_field(struct btf *btf, const char *name, int type_id, in btf__add_field() argument
2018 if (btf->nr_types == 0) in btf__add_field()
2020 t = btf_last_type(btf); in btf__add_field()
2036 if (btf_ensure_modifiable(btf)) in btf__add_field()
2040 m = btf_add_type_mem(btf, sz); in btf__add_field()
2045 name_off = btf__add_str(btf, name); in btf__add_field()
2055 t = btf_last_type(btf); in btf__add_field()
2059 btf->hdr->type_len += sz; in btf__add_field()
2060 btf->hdr->str_off += sz; in btf__add_field()
2064 static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz, in btf_add_enum_common() argument
2074 if (btf_ensure_modifiable(btf)) in btf_add_enum_common()
2078 t = btf_add_type_mem(btf, sz); in btf_add_enum_common()
2083 name_off = btf__add_str(btf, name); in btf_add_enum_common()
2093 return btf_commit_type(btf, sz); in btf_add_enum_common()
2109 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_enum() argument
2115 return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM); in btf__add_enum()
2126 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value) in btf__add_enum_value() argument
2133 if (btf->nr_types == 0) in btf__add_enum_value()
2135 t = btf_last_type(btf); in btf__add_enum_value()
2146 if (btf_ensure_modifiable(btf)) in btf__add_enum_value()
2150 v = btf_add_type_mem(btf, sz); in btf__add_enum_value()
2154 name_off = btf__add_str(btf, name); in btf__add_enum_value()
2162 t = btf_last_type(btf); in btf__add_enum_value()
2169 btf->hdr->type_len += sz; in btf__add_enum_value()
2170 btf->hdr->str_off += sz; in btf__add_enum_value()
2188 int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz, in btf__add_enum64() argument
2191 return btf_add_enum_common(btf, name, byte_sz, is_signed, in btf__add_enum64()
2203 int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value) in btf__add_enum64_value() argument
2210 if (btf->nr_types == 0) in btf__add_enum64_value()
2212 t = btf_last_type(btf); in btf__add_enum64_value()
2221 if (btf_ensure_modifiable(btf)) in btf__add_enum64_value()
2225 v = btf_add_type_mem(btf, sz); in btf__add_enum64_value()
2229 name_off = btf__add_str(btf, name); in btf__add_enum64_value()
2238 t = btf_last_type(btf); in btf__add_enum64_value()
2241 btf->hdr->type_len += sz; in btf__add_enum64_value()
2242 btf->hdr->str_off += sz; in btf__add_enum64_value()
2255 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind) in btf__add_fwd() argument
2266 id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0); in btf__add_fwd()
2269 t = btf_type_by_id(btf, id); in btf__add_fwd()
2277 return btf__add_enum(btf, name, sizeof(int)); in btf__add_fwd()
2291 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id) in btf__add_typedef() argument
2296 return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id); in btf__add_typedef()
2306 int btf__add_volatile(struct btf *btf, int ref_type_id) in btf__add_volatile() argument
2308 return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id); in btf__add_volatile()
2318 int btf__add_const(struct btf *btf, int ref_type_id) in btf__add_const() argument
2320 return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id); in btf__add_const()
2330 int btf__add_restrict(struct btf *btf, int ref_type_id) in btf__add_restrict() argument
2332 return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id); in btf__add_restrict()
2343 int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id) in btf__add_type_tag() argument
2348 return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id); in btf__add_type_tag()
2359 int btf__add_func(struct btf *btf, const char *name, in btf__add_func() argument
2370 id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id); in btf__add_func()
2372 struct btf_type *t = btf_type_by_id(btf, id); in btf__add_func()
2391 int btf__add_func_proto(struct btf *btf, int ret_type_id) in btf__add_func_proto() argument
2399 if (btf_ensure_modifiable(btf)) in btf__add_func_proto()
2403 t = btf_add_type_mem(btf, sz); in btf__add_func_proto()
2414 return btf_commit_type(btf, sz); in btf__add_func_proto()
2425 int btf__add_func_param(struct btf *btf, const char *name, int type_id) in btf__add_func_param() argument
2435 if (btf->nr_types == 0) in btf__add_func_param()
2437 t = btf_last_type(btf); in btf__add_func_param()
2442 if (btf_ensure_modifiable(btf)) in btf__add_func_param()
2446 p = btf_add_type_mem(btf, sz); in btf__add_func_param()
2451 name_off = btf__add_str(btf, name); in btf__add_func_param()
2460 t = btf_last_type(btf); in btf__add_func_param()
2463 btf->hdr->type_len += sz; in btf__add_func_param()
2464 btf->hdr->str_off += sz; in btf__add_func_param()
2478 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id) in btf__add_var() argument
2494 if (btf_ensure_modifiable(btf)) in btf__add_var()
2498 t = btf_add_type_mem(btf, sz); in btf__add_var()
2502 name_off = btf__add_str(btf, name); in btf__add_var()
2513 return btf_commit_type(btf, sz); in btf__add_var()
2528 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_datasec() argument
2537 if (btf_ensure_modifiable(btf)) in btf__add_datasec()
2541 t = btf_add_type_mem(btf, sz); in btf__add_datasec()
2545 name_off = btf__add_str(btf, name); in btf__add_datasec()
2554 return btf_commit_type(btf, sz); in btf__add_datasec()
2567 int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz) in btf__add_datasec_var_info() argument
2574 if (btf->nr_types == 0) in btf__add_datasec_var_info()
2576 t = btf_last_type(btf); in btf__add_datasec_var_info()
2584 if (btf_ensure_modifiable(btf)) in btf__add_datasec_var_info()
2588 v = btf_add_type_mem(btf, sz); in btf__add_datasec_var_info()
2597 t = btf_last_type(btf); in btf__add_datasec_var_info()
2600 btf->hdr->type_len += sz; in btf__add_datasec_var_info()
2601 btf->hdr->str_off += sz; in btf__add_datasec_var_info()
2615 int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, in btf__add_decl_tag() argument
2627 if (btf_ensure_modifiable(btf)) in btf__add_decl_tag()
2631 t = btf_add_type_mem(btf, sz); in btf__add_decl_tag()
2635 value_off = btf__add_str(btf, value); in btf__add_decl_tag()
2644 return btf_commit_type(btf, sz); in btf__add_decl_tag()
2890 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
3039 int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts) in btf__dedup() argument
3047 d = btf_dedup_new(btf, opts); in btf__dedup()
3053 if (btf_ensure_modifiable(btf)) { in btf__dedup()
3109 struct btf *btf; member
3215 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts) in btf_dedup_new() argument
3227 d->btf = btf; in btf_dedup_new()
3237 type_cnt = btf__type_cnt(btf); in btf_dedup_new()
3246 struct btf_type *t = btf_type_by_id(d->btf, i); in btf_dedup_new()
3280 for (i = 0; i < d->btf->nr_types; i++) { in btf_for_each_str_off()
3281 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); in btf_for_each_str_off()
3306 if (str_off == 0 || str_off < d->btf->start_str_off) in strs_dedup_remap_str_off()
3309 s = btf__str_by_offset(d->btf, str_off); in strs_dedup_remap_str_off()
3310 if (d->btf->base_btf) { in strs_dedup_remap_str_off()
3311 err = btf__find_str(d->btf->base_btf, s); in strs_dedup_remap_str_off()
3324 *str_off_ptr = d->btf->start_str_off + off; in strs_dedup_remap_str_off()
3343 if (d->btf->strs_deduped) in btf_dedup_strings()
3352 if (!d->btf->base_btf) { in btf_dedup_strings()
3367 strset__free(d->btf->strs_set); in btf_dedup_strings()
3368 d->btf->hdr->str_len = strset__data_size(d->strs_set); in btf_dedup_strings()
3369 d->btf->strs_set = d->strs_set; in btf_dedup_strings()
3371 d->btf->strs_deduped = true; in btf_dedup_strings()
3682 if (!d->btf->base_btf) in btf_dedup_prep()
3685 for (type_id = 1; type_id < d->btf->start_id; type_id++) { in btf_dedup_prep()
3686 t = btf_type_by_id(d->btf, type_id); in btf_dedup_prep()
3744 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_prim_type()
3773 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3786 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3808 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3831 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_prim_types()
3832 err = btf_dedup_prim_type(d, d->btf->start_id + i); in btf_dedup_prim_types()
3867 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
3873 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
3890 t1 = btf_type_by_id(d->btf, id1); in btf_dedup_identical_arrays()
3891 t2 = btf_type_by_id(d->btf, id2); in btf_dedup_identical_arrays()
3905 t1 = btf_type_by_id(d->btf, id1); in btf_dedup_identical_structs()
3906 t2 = btf_type_by_id(d->btf, id2); in btf_dedup_identical_structs()
4063 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_is_equiv()
4064 canon_type = btf_type_by_id(d->btf, canon_id); in btf_dedup_is_equiv()
4084 if (fwd_kind == real_kind && canon_id < d->btf->start_id) in btf_dedup_is_equiv()
4216 t_kind = btf_kind(btf__type_by_id(d->btf, t_id)); in btf_dedup_merge_hypot_map()
4217 c_kind = btf_kind(btf__type_by_id(d->btf, c_id)); in btf_dedup_merge_hypot_map()
4302 t = btf_type_by_id(d->btf, type_id); in btf_dedup_struct_type()
4323 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_struct_type()
4351 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_struct_types()
4352 err = btf_dedup_struct_type(d, d->btf->start_id + i); in btf_dedup_struct_types()
4397 t = btf_type_by_id(d->btf, type_id); in btf_dedup_ref_type()
4416 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4433 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4457 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4489 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4513 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_ref_types()
4514 err = btf_dedup_ref_type(d, d->btf->start_id + i); in btf_dedup_ref_types()
4531 __u32 nr_types = btf__type_cnt(d->btf); in btf_dedup_fill_unique_names_map()
4542 t = btf_type_by_id(d->btf, type_id); in btf_dedup_fill_unique_names_map()
4565 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_resolve_fwd()
4585 cand_t = btf_type_by_id(d->btf, cand_id); in btf_dedup_resolve_fwd()
4641 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_resolve_fwds()
4642 err = btf_dedup_resolve_fwd(d, names_map, d->btf->start_id + i); in btf_dedup_resolve_fwds()
4666 __u32 next_type_id = d->btf->start_id; in btf_dedup_compact_types()
4674 for (id = 1; id < d->btf->start_id; id++) in btf_dedup_compact_types()
4676 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) in btf_dedup_compact_types()
4679 p = d->btf->types_data; in btf_dedup_compact_types()
4681 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) { in btf_dedup_compact_types()
4685 t = btf__type_by_id(d->btf, id); in btf_dedup_compact_types()
4692 d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data; in btf_dedup_compact_types()
4698 d->btf->nr_types = next_type_id - d->btf->start_id; in btf_dedup_compact_types()
4699 d->btf->type_offs_cap = d->btf->nr_types; in btf_dedup_compact_types()
4700 d->btf->hdr->type_len = p - d->btf->types_data; in btf_dedup_compact_types()
4701 new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap, in btf_dedup_compact_types()
4703 if (d->btf->type_offs_cap && !new_offs) in btf_dedup_compact_types()
4705 d->btf->type_offs = new_offs; in btf_dedup_compact_types()
4706 d->btf->hdr->str_off = d->btf->hdr->type_len; in btf_dedup_compact_types()
4707 d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len; in btf_dedup_compact_types()
4745 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_remap_types()
4746 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); in btf_dedup_remap_types()
4767 struct btf *btf__load_vmlinux_btf(void) in btf__load_vmlinux_btf()
4783 struct btf *btf; in btf__load_vmlinux_btf() local
4794 btf = btf__parse(path, NULL); in btf__load_vmlinux_btf()
4795 err = libbpf_get_error(btf); in btf__load_vmlinux_btf()
4800 return btf; in btf__load_vmlinux_btf()
4807 struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
4809 struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf) in btf__load_module_btf()