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()
701 int btf__resolve_type(const struct btf *btf, __u32 type_id) in btf__resolve_type() argument
706 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
711 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
721 __s32 btf__find_by_name(const struct btf *btf, const char *type_name) in btf__find_by_name() argument
723 __u32 i, nr_types = btf__type_cnt(btf); in btf__find_by_name()
729 const struct btf_type *t = btf__type_by_id(btf, i); in btf__find_by_name()
730 const char *name = btf__name_by_offset(btf, t->name_off); in btf__find_by_name()
739 static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id, in btf_find_by_name_kind() argument
742 __u32 i, nr_types = btf__type_cnt(btf); in btf_find_by_name_kind()
748 const struct btf_type *t = btf__type_by_id(btf, i); in btf_find_by_name_kind()
753 name = btf__name_by_offset(btf, t->name_off); in btf_find_by_name_kind()
761 __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, in btf__find_by_name_kind_own() argument
764 return btf_find_by_name_kind(btf, btf->start_id, type_name, kind); in btf__find_by_name_kind_own()
767 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name, in btf__find_by_name_kind() argument
770 return btf_find_by_name_kind(btf, 1, type_name, kind); in btf__find_by_name_kind()
773 static bool btf_is_modifiable(const struct btf *btf) in btf_is_modifiable() argument
775 return (void *)btf->hdr != btf->raw_data; in btf_is_modifiable()
778 void btf__free(struct btf *btf) in btf__free() argument
780 if (IS_ERR_OR_NULL(btf)) in btf__free()
783 if (btf->fd >= 0) in btf__free()
784 close(btf->fd); in btf__free()
786 if (btf_is_modifiable(btf)) { in btf__free()
793 free(btf->hdr); in btf__free()
794 free(btf->types_data); in btf__free()
795 strset__free(btf->strs_set); in btf__free()
797 free(btf->raw_data); in btf__free()
798 free(btf->raw_data_swapped); in btf__free()
799 free(btf->type_offs); in btf__free()
800 free(btf); in btf__free()
803 static struct btf *btf_new_empty(struct btf *base_btf) in btf_new_empty()
805 struct btf *btf; in btf_new_empty() local
807 btf = calloc(1, sizeof(*btf)); in btf_new_empty()
808 if (!btf) in btf_new_empty()
811 btf->nr_types = 0; in btf_new_empty()
812 btf->start_id = 1; in btf_new_empty()
813 btf->start_str_off = 0; in btf_new_empty()
814 btf->fd = -1; in btf_new_empty()
815 btf->ptr_sz = sizeof(void *); in btf_new_empty()
816 btf->swapped_endian = false; in btf_new_empty()
819 btf->base_btf = base_btf; in btf_new_empty()
820 btf->start_id = btf__type_cnt(base_btf); in btf_new_empty()
821 btf->start_str_off = base_btf->hdr->str_len; in btf_new_empty()
825 btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1); in btf_new_empty()
826 btf->raw_data = calloc(1, btf->raw_size); in btf_new_empty()
827 if (!btf->raw_data) { in btf_new_empty()
828 free(btf); in btf_new_empty()
832 btf->hdr = btf->raw_data; in btf_new_empty()
833 btf->hdr->hdr_len = sizeof(struct btf_header); in btf_new_empty()
834 btf->hdr->magic = BTF_MAGIC; in btf_new_empty()
835 btf->hdr->version = BTF_VERSION; in btf_new_empty()
837 btf->types_data = btf->raw_data + btf->hdr->hdr_len; in btf_new_empty()
838 btf->strs_data = btf->raw_data + btf->hdr->hdr_len; in btf_new_empty()
839 btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */ in btf_new_empty()
841 return btf; in btf_new_empty()
844 struct btf *btf__new_empty(void) in btf__new_empty()
849 struct btf *btf__new_empty_split(struct btf *base_btf) in btf__new_empty_split()
854 static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf) in btf_new()
856 struct btf *btf; in btf_new() local
859 btf = calloc(1, sizeof(struct btf)); in btf_new()
860 if (!btf) in btf_new()
863 btf->nr_types = 0; in btf_new()
864 btf->start_id = 1; in btf_new()
865 btf->start_str_off = 0; in btf_new()
866 btf->fd = -1; in btf_new()
869 btf->base_btf = base_btf; in btf_new()
870 btf->start_id = btf__type_cnt(base_btf); in btf_new()
871 btf->start_str_off = base_btf->hdr->str_len; in btf_new()
874 btf->raw_data = malloc(size); in btf_new()
875 if (!btf->raw_data) { in btf_new()
879 memcpy(btf->raw_data, data, size); in btf_new()
880 btf->raw_size = size; in btf_new()
882 btf->hdr = btf->raw_data; in btf_new()
883 err = btf_parse_hdr(btf); in btf_new()
887 btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off; in btf_new()
888 btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off; in btf_new()
890 err = btf_parse_str_sec(btf); in btf_new()
891 err = err ?: btf_parse_type_sec(btf); in btf_new()
897 btf__free(btf); in btf_new()
901 return btf; in btf_new()
904 struct btf *btf__new(const void *data, __u32 size) in btf__new()
909 static struct btf *btf_parse_elf(const char *path, struct btf *base_btf, in btf_parse_elf()
914 struct btf *btf = NULL; in btf_parse_elf() local
996 btf = btf_new(btf_data->d_buf, btf_data->d_size, base_btf); in btf_parse_elf()
997 err = libbpf_get_error(btf); in btf_parse_elf()
1003 btf__set_pointer_size(btf, 4); in btf_parse_elf()
1006 btf__set_pointer_size(btf, 8); in btf_parse_elf()
1027 return btf; in btf_parse_elf()
1031 btf__free(btf); in btf_parse_elf()
1036 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext) in btf__parse_elf()
1041 struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf) in btf__parse_elf_split()
1046 static struct btf *btf_parse_raw(const char *path, struct btf *base_btf) in btf_parse_raw()
1048 struct btf *btf = NULL; in btf_parse_raw() local
1100 btf = btf_new(data, sz, base_btf); in btf_parse_raw()
1106 return err ? ERR_PTR(err) : btf; in btf_parse_raw()
1109 struct btf *btf__parse_raw(const char *path) in btf__parse_raw()
1114 struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf) in btf__parse_raw_split()
1119 static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext) in btf_parse()
1121 struct btf *btf; in btf_parse() local
1127 btf = btf_parse_raw(path, base_btf); in btf_parse()
1128 err = libbpf_get_error(btf); in btf_parse()
1130 return btf; in btf_parse()
1136 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext) in btf__parse()
1141 struct btf *btf__parse_split(const char *path, struct btf *base_btf) in btf__parse_split()
1146 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1148 int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level) in btf_load_into_kernel() argument
1156 if (btf->fd >= 0) in btf_load_into_kernel()
1162 raw_data = btf_get_raw_data(btf, &raw_size, false); in btf_load_into_kernel()
1167 btf->raw_size = raw_size; in btf_load_into_kernel()
1168 btf->raw_data = raw_data; in btf_load_into_kernel()
1198 btf->fd = bpf_btf_load(raw_data, raw_size, &opts); in btf_load_into_kernel()
1199 if (btf->fd < 0) { in btf_load_into_kernel()
1223 int btf__load_into_kernel(struct btf *btf) in btf__load_into_kernel() argument
1225 return btf_load_into_kernel(btf, NULL, 0, 0); in btf__load_into_kernel()
1228 int btf__fd(const struct btf *btf) in btf__fd() argument
1230 return btf->fd; in btf__fd()
1233 void btf__set_fd(struct btf *btf, int fd) in btf__set_fd() argument
1235 btf->fd = fd; in btf__set_fd()
1238 static const void *btf_strs_data(const struct btf *btf) in btf_strs_data() argument
1240 return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set); in btf_strs_data()
1243 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian) in btf_get_raw_data() argument
1245 struct btf_header *hdr = btf->hdr; in btf_get_raw_data()
1251 data = swap_endian ? btf->raw_data_swapped : btf->raw_data; in btf_get_raw_data()
1253 *size = btf->raw_size; in btf_get_raw_data()
1268 memcpy(p, btf->types_data, hdr->type_len); in btf_get_raw_data()
1270 for (i = 0; i < btf->nr_types; i++) { in btf_get_raw_data()
1271 t = p + btf->type_offs[i]; in btf_get_raw_data()
1283 memcpy(p, btf_strs_data(btf), hdr->str_len); in btf_get_raw_data()
1293 const void *btf__raw_data(const struct btf *btf_ro, __u32 *size) in btf__raw_data()
1295 struct btf *btf = (struct btf *)btf_ro; in btf__raw_data() local
1299 data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian); in btf__raw_data()
1303 btf->raw_size = data_sz; in btf__raw_data()
1304 if (btf->swapped_endian) in btf__raw_data()
1305 btf->raw_data_swapped = data; in btf__raw_data()
1307 btf->raw_data = data; in btf__raw_data()
1313 const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
1315 const char *btf__str_by_offset(const struct btf *btf, __u32 offset) in btf__str_by_offset() argument
1317 if (offset < btf->start_str_off) in btf__str_by_offset()
1318 return btf__str_by_offset(btf->base_btf, offset); in btf__str_by_offset()
1319 else if (offset - btf->start_str_off < btf->hdr->str_len) in btf__str_by_offset()
1320 return btf_strs_data(btf) + (offset - btf->start_str_off); in btf__str_by_offset()
1325 const char *btf__name_by_offset(const struct btf *btf, __u32 offset) in btf__name_by_offset() argument
1327 return btf__str_by_offset(btf, offset); in btf__name_by_offset()
1330 struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf) in btf_get_from_fd()
1335 struct btf *btf; in btf_get_from_fd() local
1349 btf_info.btf = ptr_to_u64(ptr); in btf_get_from_fd()
1359 btf = ERR_PTR(-ENOMEM); in btf_get_from_fd()
1366 btf_info.btf = ptr_to_u64(ptr); in btf_get_from_fd()
1373 btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG); in btf_get_from_fd()
1377 btf = btf_new(ptr, btf_info.btf_size, base_btf); in btf_get_from_fd()
1381 return btf; in btf_get_from_fd()
1384 struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf) in btf__load_from_kernel_by_id_split()
1386 struct btf *btf; in btf__load_from_kernel_by_id_split() local
1393 btf = btf_get_from_fd(btf_fd, base_btf); in btf__load_from_kernel_by_id_split()
1396 return libbpf_ptr(btf); in btf__load_from_kernel_by_id_split()
1399 struct btf *btf__load_from_kernel_by_id(__u32 id) in btf__load_from_kernel_by_id()
1404 static void btf_invalidate_raw_data(struct btf *btf) in btf_invalidate_raw_data() argument
1406 if (btf->raw_data) { in btf_invalidate_raw_data()
1407 free(btf->raw_data); in btf_invalidate_raw_data()
1408 btf->raw_data = NULL; in btf_invalidate_raw_data()
1410 if (btf->raw_data_swapped) { in btf_invalidate_raw_data()
1411 free(btf->raw_data_swapped); in btf_invalidate_raw_data()
1412 btf->raw_data_swapped = NULL; in btf_invalidate_raw_data()
1420 static int btf_ensure_modifiable(struct btf *btf) in btf_ensure_modifiable() argument
1426 if (btf_is_modifiable(btf)) { in btf_ensure_modifiable()
1428 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1433 hdr = malloc(btf->hdr->hdr_len); in btf_ensure_modifiable()
1434 types = malloc(btf->hdr->type_len); in btf_ensure_modifiable()
1438 memcpy(hdr, btf->hdr, btf->hdr->hdr_len); in btf_ensure_modifiable()
1439 memcpy(types, btf->types_data, btf->hdr->type_len); in btf_ensure_modifiable()
1442 set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len); in btf_ensure_modifiable()
1449 btf->hdr = hdr; in btf_ensure_modifiable()
1450 btf->types_data = types; in btf_ensure_modifiable()
1451 btf->types_data_cap = btf->hdr->type_len; in btf_ensure_modifiable()
1452 btf->strs_data = NULL; in btf_ensure_modifiable()
1453 btf->strs_set = set; in btf_ensure_modifiable()
1457 if (btf->hdr->str_len == 0) in btf_ensure_modifiable()
1458 btf->strs_deduped = true; in btf_ensure_modifiable()
1459 if (!btf->base_btf && btf->hdr->str_len == 1) in btf_ensure_modifiable()
1460 btf->strs_deduped = true; in btf_ensure_modifiable()
1463 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1480 int btf__find_str(struct btf *btf, const char *s) in btf__find_str() argument
1484 if (btf->base_btf) { in btf__find_str()
1485 off = btf__find_str(btf->base_btf, s); in btf__find_str()
1491 if (btf_ensure_modifiable(btf)) in btf__find_str()
1494 off = strset__find_str(btf->strs_set, s); in btf__find_str()
1498 return btf->start_str_off + off; in btf__find_str()
1506 int btf__add_str(struct btf *btf, const char *s) in btf__add_str() argument
1510 if (btf->base_btf) { in btf__add_str()
1511 off = btf__find_str(btf->base_btf, s); in btf__add_str()
1516 if (btf_ensure_modifiable(btf)) in btf__add_str()
1519 off = strset__add_str(btf->strs_set, s); in btf__add_str()
1523 btf->hdr->str_len = strset__data_size(btf->strs_set); in btf__add_str()
1525 return btf->start_str_off + off; in btf__add_str()
1528 static void *btf_add_type_mem(struct btf *btf, size_t add_sz) in btf_add_type_mem() argument
1530 return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1, in btf_add_type_mem()
1531 btf->hdr->type_len, UINT_MAX, add_sz); in btf_add_type_mem()
1539 static int btf_commit_type(struct btf *btf, int data_sz) in btf_commit_type() argument
1543 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf_commit_type()
1547 btf->hdr->type_len += data_sz; in btf_commit_type()
1548 btf->hdr->str_off += data_sz; in btf_commit_type()
1549 btf->nr_types++; in btf_commit_type()
1550 return btf->start_id + btf->nr_types - 1; in btf_commit_type()
1554 const struct btf *src;
1555 struct btf *dst;
1591 int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type) in btf__add_type() argument
1593 struct btf_pipe p = { .src = src_btf, .dst = btf }; in btf__add_type()
1602 if (btf_ensure_modifiable(btf)) in btf__add_type()
1605 t = btf_add_type_mem(btf, sz); in btf__add_type()
1615 return btf_commit_type(btf, sz); in btf__add_type()
1620 struct btf *btf = ctx; in btf_rewrite_type_ids() local
1629 *type_id += btf->start_id + btf->nr_types - 1; in btf_rewrite_type_ids()
1636 int btf__add_btf(struct btf *btf, const struct btf *src_btf) in btf__add_btf() argument
1638 struct btf_pipe p = { .src = src_btf, .dst = btf }; in btf__add_btf()
1648 if (btf_ensure_modifiable(btf)) in btf__add_btf()
1654 old_strs_len = btf->hdr->str_len; in btf__add_btf()
1660 t = btf_add_type_mem(btf, data_sz); in btf__add_btf()
1665 off = btf_add_type_offs_mem(btf, cnt); in btf__add_btf()
1686 *off = t - btf->types_data; in btf__add_btf()
1694 err = btf_type_visit_type_ids(t, btf_rewrite_type_ids, btf); in btf__add_btf()
1711 btf->hdr->type_len += data_sz; in btf__add_btf()
1712 btf->hdr->str_off += data_sz; in btf__add_btf()
1713 btf->nr_types += cnt; in btf__add_btf()
1718 return btf->start_id + btf->nr_types - cnt; in btf__add_btf()
1723 memset(btf->types_data + btf->hdr->type_len, 0, data_sz); in btf__add_btf()
1724 memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len); in btf__add_btf()
1728 btf->hdr->str_len = old_strs_len; in btf__add_btf()
1744 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding) in btf__add_int() argument
1759 if (btf_ensure_modifiable(btf)) in btf__add_int()
1763 t = btf_add_type_mem(btf, sz); in btf__add_int()
1771 name_off = btf__add_str(btf, name); in btf__add_int()
1781 return btf_commit_type(btf, sz); in btf__add_int()
1792 int btf__add_float(struct btf *btf, const char *name, size_t byte_sz) in btf__add_float() argument
1806 if (btf_ensure_modifiable(btf)) in btf__add_float()
1810 t = btf_add_type_mem(btf, sz); in btf__add_float()
1814 name_off = btf__add_str(btf, name); in btf__add_float()
1822 return btf_commit_type(btf, sz); in btf__add_float()
1837 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id) in btf_add_ref_kind() argument
1845 if (btf_ensure_modifiable(btf)) in btf_add_ref_kind()
1849 t = btf_add_type_mem(btf, sz); in btf_add_ref_kind()
1854 name_off = btf__add_str(btf, name); in btf_add_ref_kind()
1863 return btf_commit_type(btf, sz); in btf_add_ref_kind()
1873 int btf__add_ptr(struct btf *btf, int ref_type_id) in btf__add_ptr() argument
1875 return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id); in btf__add_ptr()
1887 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems) in btf__add_array() argument
1896 if (btf_ensure_modifiable(btf)) in btf__add_array()
1900 t = btf_add_type_mem(btf, sz); in btf__add_array()
1913 return btf_commit_type(btf, sz); in btf__add_array()
1917 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz) in btf_add_composite() argument
1922 if (btf_ensure_modifiable(btf)) in btf_add_composite()
1926 t = btf_add_type_mem(btf, sz); in btf_add_composite()
1931 name_off = btf__add_str(btf, name); in btf_add_composite()
1943 return btf_commit_type(btf, sz); in btf_add_composite()
1958 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_struct() argument
1960 return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz); in btf__add_struct()
1976 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_union() argument
1978 return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz); in btf__add_union()
1981 static struct btf_type *btf_last_type(struct btf *btf) in btf_last_type() argument
1983 return btf_type_by_id(btf, btf__type_cnt(btf) - 1); in btf_last_type()
1996 int btf__add_field(struct btf *btf, const char *name, int type_id, in btf__add_field() argument
2005 if (btf->nr_types == 0) in btf__add_field()
2007 t = btf_last_type(btf); in btf__add_field()
2023 if (btf_ensure_modifiable(btf)) in btf__add_field()
2027 m = btf_add_type_mem(btf, sz); in btf__add_field()
2032 name_off = btf__add_str(btf, name); in btf__add_field()
2042 t = btf_last_type(btf); in btf__add_field()
2046 btf->hdr->type_len += sz; in btf__add_field()
2047 btf->hdr->str_off += sz; in btf__add_field()
2051 static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz, in btf_add_enum_common() argument
2061 if (btf_ensure_modifiable(btf)) in btf_add_enum_common()
2065 t = btf_add_type_mem(btf, sz); in btf_add_enum_common()
2070 name_off = btf__add_str(btf, name); in btf_add_enum_common()
2080 return btf_commit_type(btf, sz); in btf_add_enum_common()
2096 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_enum() argument
2102 return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM); in btf__add_enum()
2113 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value) in btf__add_enum_value() argument
2120 if (btf->nr_types == 0) in btf__add_enum_value()
2122 t = btf_last_type(btf); in btf__add_enum_value()
2133 if (btf_ensure_modifiable(btf)) in btf__add_enum_value()
2137 v = btf_add_type_mem(btf, sz); in btf__add_enum_value()
2141 name_off = btf__add_str(btf, name); in btf__add_enum_value()
2149 t = btf_last_type(btf); in btf__add_enum_value()
2156 btf->hdr->type_len += sz; in btf__add_enum_value()
2157 btf->hdr->str_off += sz; in btf__add_enum_value()
2175 int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz, in btf__add_enum64() argument
2178 return btf_add_enum_common(btf, name, byte_sz, is_signed, in btf__add_enum64()
2190 int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value) in btf__add_enum64_value() argument
2197 if (btf->nr_types == 0) in btf__add_enum64_value()
2199 t = btf_last_type(btf); in btf__add_enum64_value()
2208 if (btf_ensure_modifiable(btf)) in btf__add_enum64_value()
2212 v = btf_add_type_mem(btf, sz); in btf__add_enum64_value()
2216 name_off = btf__add_str(btf, name); in btf__add_enum64_value()
2225 t = btf_last_type(btf); in btf__add_enum64_value()
2228 btf->hdr->type_len += sz; in btf__add_enum64_value()
2229 btf->hdr->str_off += sz; in btf__add_enum64_value()
2242 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind) in btf__add_fwd() argument
2253 id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0); in btf__add_fwd()
2256 t = btf_type_by_id(btf, id); in btf__add_fwd()
2264 return btf__add_enum(btf, name, sizeof(int)); in btf__add_fwd()
2278 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id) in btf__add_typedef() argument
2283 return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id); in btf__add_typedef()
2293 int btf__add_volatile(struct btf *btf, int ref_type_id) in btf__add_volatile() argument
2295 return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id); in btf__add_volatile()
2305 int btf__add_const(struct btf *btf, int ref_type_id) in btf__add_const() argument
2307 return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id); in btf__add_const()
2317 int btf__add_restrict(struct btf *btf, int ref_type_id) in btf__add_restrict() argument
2319 return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id); in btf__add_restrict()
2330 int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id) in btf__add_type_tag() argument
2335 return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id); in btf__add_type_tag()
2346 int btf__add_func(struct btf *btf, const char *name, in btf__add_func() argument
2357 id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id); in btf__add_func()
2359 struct btf_type *t = btf_type_by_id(btf, id); in btf__add_func()
2378 int btf__add_func_proto(struct btf *btf, int ret_type_id) in btf__add_func_proto() argument
2386 if (btf_ensure_modifiable(btf)) in btf__add_func_proto()
2390 t = btf_add_type_mem(btf, sz); in btf__add_func_proto()
2401 return btf_commit_type(btf, sz); in btf__add_func_proto()
2412 int btf__add_func_param(struct btf *btf, const char *name, int type_id) in btf__add_func_param() argument
2422 if (btf->nr_types == 0) in btf__add_func_param()
2424 t = btf_last_type(btf); in btf__add_func_param()
2429 if (btf_ensure_modifiable(btf)) in btf__add_func_param()
2433 p = btf_add_type_mem(btf, sz); in btf__add_func_param()
2438 name_off = btf__add_str(btf, name); in btf__add_func_param()
2447 t = btf_last_type(btf); in btf__add_func_param()
2450 btf->hdr->type_len += sz; in btf__add_func_param()
2451 btf->hdr->str_off += sz; in btf__add_func_param()
2465 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id) in btf__add_var() argument
2481 if (btf_ensure_modifiable(btf)) in btf__add_var()
2485 t = btf_add_type_mem(btf, sz); in btf__add_var()
2489 name_off = btf__add_str(btf, name); in btf__add_var()
2500 return btf_commit_type(btf, sz); in btf__add_var()
2515 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_datasec() argument
2524 if (btf_ensure_modifiable(btf)) in btf__add_datasec()
2528 t = btf_add_type_mem(btf, sz); in btf__add_datasec()
2532 name_off = btf__add_str(btf, name); in btf__add_datasec()
2541 return btf_commit_type(btf, sz); in btf__add_datasec()
2554 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
2561 if (btf->nr_types == 0) in btf__add_datasec_var_info()
2563 t = btf_last_type(btf); in btf__add_datasec_var_info()
2571 if (btf_ensure_modifiable(btf)) in btf__add_datasec_var_info()
2575 v = btf_add_type_mem(btf, sz); in btf__add_datasec_var_info()
2584 t = btf_last_type(btf); in btf__add_datasec_var_info()
2587 btf->hdr->type_len += sz; in btf__add_datasec_var_info()
2588 btf->hdr->str_off += sz; in btf__add_datasec_var_info()
2602 int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, in btf__add_decl_tag() argument
2614 if (btf_ensure_modifiable(btf)) in btf__add_decl_tag()
2618 t = btf_add_type_mem(btf, sz); in btf__add_decl_tag()
2622 value_off = btf__add_str(btf, value); in btf__add_decl_tag()
2631 return btf_commit_type(btf, sz); in btf__add_decl_tag()
2877 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts);
3024 int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts) in btf__dedup() argument
3032 d = btf_dedup_new(btf, opts); in btf__dedup()
3038 if (btf_ensure_modifiable(btf)) { in btf__dedup()
3089 struct btf *btf; member
3196 static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts) in btf_dedup_new() argument
3208 d->btf = btf; in btf_dedup_new()
3218 type_cnt = btf__type_cnt(btf); in btf_dedup_new()
3227 struct btf_type *t = btf_type_by_id(d->btf, i); in btf_dedup_new()
3261 for (i = 0; i < d->btf->nr_types; i++) { in btf_for_each_str_off()
3262 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); in btf_for_each_str_off()
3287 if (str_off == 0 || str_off < d->btf->start_str_off) in strs_dedup_remap_str_off()
3290 s = btf__str_by_offset(d->btf, str_off); in strs_dedup_remap_str_off()
3291 if (d->btf->base_btf) { in strs_dedup_remap_str_off()
3292 err = btf__find_str(d->btf->base_btf, s); in strs_dedup_remap_str_off()
3305 *str_off_ptr = d->btf->start_str_off + off; in strs_dedup_remap_str_off()
3324 if (d->btf->strs_deduped) in btf_dedup_strings()
3333 if (!d->btf->base_btf) { in btf_dedup_strings()
3348 strset__free(d->btf->strs_set); in btf_dedup_strings()
3349 d->btf->hdr->str_len = strset__data_size(d->strs_set); in btf_dedup_strings()
3350 d->btf->strs_set = d->strs_set; in btf_dedup_strings()
3352 d->btf->strs_deduped = true; in btf_dedup_strings()
3666 if (!d->btf->base_btf) in btf_dedup_prep()
3669 for (type_id = 1; type_id < d->btf->start_id; type_id++) { in btf_dedup_prep()
3670 t = btf_type_by_id(d->btf, type_id); in btf_dedup_prep()
3728 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_prim_type()
3757 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3769 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3790 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3812 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3835 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_prim_types()
3836 err = btf_dedup_prim_type(d, d->btf->start_id + i); in btf_dedup_prim_types()
3871 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
3877 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
3894 t1 = btf_type_by_id(d->btf, id1); in btf_dedup_identical_arrays()
3895 t2 = btf_type_by_id(d->btf, id2); in btf_dedup_identical_arrays()
3909 t1 = btf_type_by_id(d->btf, id1); in btf_dedup_identical_structs()
3910 t2 = btf_type_by_id(d->btf, id2); in btf_dedup_identical_structs()
4065 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_is_equiv()
4066 canon_type = btf_type_by_id(d->btf, canon_id); in btf_dedup_is_equiv()
4086 if (fwd_kind == real_kind && canon_id < d->btf->start_id) in btf_dedup_is_equiv()
4220 t_kind = btf_kind(btf__type_by_id(d->btf, t_id)); in btf_dedup_merge_hypot_map()
4221 c_kind = btf_kind(btf__type_by_id(d->btf, c_id)); in btf_dedup_merge_hypot_map()
4306 t = btf_type_by_id(d->btf, type_id); in btf_dedup_struct_type()
4327 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_struct_type()
4355 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_struct_types()
4356 err = btf_dedup_struct_type(d, d->btf->start_id + i); in btf_dedup_struct_types()
4401 t = btf_type_by_id(d->btf, type_id); in btf_dedup_ref_type()
4420 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4437 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4461 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4493 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4517 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_ref_types()
4518 err = btf_dedup_ref_type(d, d->btf->start_id + i); in btf_dedup_ref_types()
4542 __u32 next_type_id = d->btf->start_id; in btf_dedup_compact_types()
4550 for (id = 1; id < d->btf->start_id; id++) in btf_dedup_compact_types()
4552 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) in btf_dedup_compact_types()
4555 p = d->btf->types_data; in btf_dedup_compact_types()
4557 for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) { in btf_dedup_compact_types()
4561 t = btf__type_by_id(d->btf, id); in btf_dedup_compact_types()
4568 d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data; in btf_dedup_compact_types()
4574 d->btf->nr_types = next_type_id - d->btf->start_id; in btf_dedup_compact_types()
4575 d->btf->type_offs_cap = d->btf->nr_types; in btf_dedup_compact_types()
4576 d->btf->hdr->type_len = p - d->btf->types_data; in btf_dedup_compact_types()
4577 new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap, in btf_dedup_compact_types()
4579 if (d->btf->type_offs_cap && !new_offs) in btf_dedup_compact_types()
4581 d->btf->type_offs = new_offs; in btf_dedup_compact_types()
4582 d->btf->hdr->str_off = d->btf->hdr->type_len; in btf_dedup_compact_types()
4583 d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len; in btf_dedup_compact_types()
4621 for (i = 0; i < d->btf->nr_types; i++) { in btf_dedup_remap_types()
4622 struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); in btf_dedup_remap_types()
4643 struct btf *btf__load_vmlinux_btf(void) in btf__load_vmlinux_btf()
4659 struct btf *btf; in btf__load_vmlinux_btf() local
4670 btf = btf__parse(path, NULL); in btf__load_vmlinux_btf()
4671 err = libbpf_get_error(btf); in btf__load_vmlinux_btf()
4676 return btf; in btf__load_vmlinux_btf()
4683 struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf")));
4685 struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf) in btf__load_module_btf()