• Home
  • Raw
  • Download

Lines Matching refs:btf

30 struct btf {  struct
166 static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off) in btf_add_type_idx_entry() argument
170 p = btf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32), in btf_add_type_idx_entry()
171 btf->nr_types + 1, BTF_MAX_NR_TYPES, 1); in btf_add_type_idx_entry()
189 static int btf_parse_hdr(struct btf *btf) in btf_parse_hdr() argument
191 struct btf_header *hdr = btf->hdr; in btf_parse_hdr()
194 if (btf->raw_size < sizeof(struct btf_header)) { in btf_parse_hdr()
200 btf->swapped_endian = true; in btf_parse_hdr()
212 if (btf->raw_size < hdr->hdr_len) { in btf_parse_hdr()
214 hdr->hdr_len, btf->raw_size); in btf_parse_hdr()
218 meta_left = btf->raw_size - hdr->hdr_len; in btf_parse_hdr()
220 pr_debug("Invalid BTF total size: %u\n", btf->raw_size); in btf_parse_hdr()
238 static int btf_parse_str_sec(struct btf *btf) in btf_parse_str_sec() argument
240 const struct btf_header *hdr = btf->hdr; in btf_parse_str_sec()
241 const char *start = btf->strs_data; in btf_parse_str_sec()
242 const char *end = start + btf->hdr->str_len; in btf_parse_str_sec()
359 static int btf_parse_type_sec(struct btf *btf) in btf_parse_type_sec() argument
361 struct btf_header *hdr = btf->hdr; in btf_parse_type_sec()
362 void *next_type = btf->types_data; in btf_parse_type_sec()
370 err = btf_add_type_idx_entry(btf, UINT_MAX); in btf_parse_type_sec()
377 if (btf->swapped_endian) in btf_parse_type_sec()
388 if (btf->swapped_endian && btf_bswap_type_rest(next_type)) in btf_parse_type_sec()
391 err = btf_add_type_idx_entry(btf, next_type - btf->types_data); in btf_parse_type_sec()
396 btf->nr_types++; in btf_parse_type_sec()
407 __u32 btf__get_nr_types(const struct btf *btf) in btf__get_nr_types() argument
409 return btf->nr_types; in btf__get_nr_types()
413 static struct btf_type *btf_type_by_id(struct btf *btf, __u32 type_id) in btf_type_by_id() argument
418 return btf->types_data + btf->type_offs[type_id]; in btf_type_by_id()
421 const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id) in btf__type_by_id() argument
423 if (type_id > btf->nr_types) in btf__type_by_id()
425 return btf_type_by_id((struct btf *)btf, type_id); in btf__type_by_id()
428 static int determine_ptr_size(const struct btf *btf) in determine_ptr_size() argument
434 for (i = 1; i <= btf->nr_types; i++) { in determine_ptr_size()
435 t = btf__type_by_id(btf, i); in determine_ptr_size()
439 name = btf__name_by_offset(btf, t->name_off); in determine_ptr_size()
454 static size_t btf_ptr_sz(const struct btf *btf) in btf_ptr_sz() argument
456 if (!btf->ptr_sz) in btf_ptr_sz()
457 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf_ptr_sz()
458 return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz; in btf_ptr_sz()
469 size_t btf__pointer_size(const struct btf *btf) in btf__pointer_size() argument
471 if (!btf->ptr_sz) in btf__pointer_size()
472 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf__pointer_size()
474 if (btf->ptr_sz < 0) in btf__pointer_size()
478 return btf->ptr_sz; in btf__pointer_size()
484 int btf__set_pointer_size(struct btf *btf, size_t ptr_sz) in btf__set_pointer_size() argument
488 btf->ptr_sz = ptr_sz; in btf__set_pointer_size()
503 enum btf_endianness btf__endianness(const struct btf *btf) in btf__endianness() argument
506 return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN; in btf__endianness()
508 return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN; in btf__endianness()
511 int btf__set_endianness(struct btf *btf, enum btf_endianness endian) in btf__set_endianness() argument
516 btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN); in btf__set_endianness()
517 if (!btf->swapped_endian) { in btf__set_endianness()
518 free(btf->raw_data_swapped); in btf__set_endianness()
519 btf->raw_data_swapped = NULL; in btf__set_endianness()
536 __s64 btf__resolve_size(const struct btf *btf, __u32 type_id) in btf__resolve_size() argument
544 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
556 size = btf_ptr_sz(btf); in btf__resolve_size()
576 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
588 int btf__align_of(const struct btf *btf, __u32 id) in btf__align_of() argument
590 const struct btf_type *t = btf__type_by_id(btf, id); in btf__align_of()
596 return min(btf_ptr_sz(btf), (size_t)t->size); in btf__align_of()
598 return btf_ptr_sz(btf); in btf__align_of()
603 return btf__align_of(btf, t->type); in btf__align_of()
605 return btf__align_of(btf, btf_array(t)->type); in btf__align_of()
613 align = btf__align_of(btf, m->type); in btf__align_of()
627 int btf__resolve_type(const struct btf *btf, __u32 type_id) in btf__resolve_type() argument
632 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
637 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
647 __s32 btf__find_by_name(const struct btf *btf, const char *type_name) in btf__find_by_name() argument
654 for (i = 1; i <= btf->nr_types; i++) { in btf__find_by_name()
655 const struct btf_type *t = btf__type_by_id(btf, i); in btf__find_by_name()
656 const char *name = btf__name_by_offset(btf, t->name_off); in btf__find_by_name()
665 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name, in btf__find_by_name_kind() argument
673 for (i = 1; i <= btf->nr_types; i++) { in btf__find_by_name_kind()
674 const struct btf_type *t = btf__type_by_id(btf, i); in btf__find_by_name_kind()
679 name = btf__name_by_offset(btf, t->name_off); in btf__find_by_name_kind()
687 static bool btf_is_modifiable(const struct btf *btf) in btf_is_modifiable() argument
689 return (void *)btf->hdr != btf->raw_data; in btf_is_modifiable()
692 void btf__free(struct btf *btf) in btf__free() argument
694 if (IS_ERR_OR_NULL(btf)) in btf__free()
697 if (btf->fd >= 0) in btf__free()
698 close(btf->fd); in btf__free()
700 if (btf_is_modifiable(btf)) { in btf__free()
707 free(btf->hdr); in btf__free()
708 free(btf->types_data); in btf__free()
709 free(btf->strs_data); in btf__free()
711 free(btf->raw_data); in btf__free()
712 free(btf->raw_data_swapped); in btf__free()
713 free(btf->type_offs); in btf__free()
714 free(btf); in btf__free()
717 struct btf *btf__new_empty(void) in btf__new_empty()
719 struct btf *btf; in btf__new_empty() local
721 btf = calloc(1, sizeof(*btf)); in btf__new_empty()
722 if (!btf) in btf__new_empty()
725 btf->fd = -1; in btf__new_empty()
726 btf->ptr_sz = sizeof(void *); in btf__new_empty()
727 btf->swapped_endian = false; in btf__new_empty()
730 btf->raw_size = sizeof(struct btf_header) + 1; in btf__new_empty()
731 btf->raw_data = calloc(1, btf->raw_size); in btf__new_empty()
732 if (!btf->raw_data) { in btf__new_empty()
733 free(btf); in btf__new_empty()
737 btf->hdr = btf->raw_data; in btf__new_empty()
738 btf->hdr->hdr_len = sizeof(struct btf_header); in btf__new_empty()
739 btf->hdr->magic = BTF_MAGIC; in btf__new_empty()
740 btf->hdr->version = BTF_VERSION; in btf__new_empty()
742 btf->types_data = btf->raw_data + btf->hdr->hdr_len; in btf__new_empty()
743 btf->strs_data = btf->raw_data + btf->hdr->hdr_len; in btf__new_empty()
744 btf->hdr->str_len = 1; /* empty string at offset 0 */ in btf__new_empty()
746 return btf; in btf__new_empty()
749 struct btf *btf__new(const void *data, __u32 size) in btf__new()
751 struct btf *btf; in btf__new() local
754 btf = calloc(1, sizeof(struct btf)); in btf__new()
755 if (!btf) in btf__new()
758 btf->raw_data = malloc(size); in btf__new()
759 if (!btf->raw_data) { in btf__new()
763 memcpy(btf->raw_data, data, size); in btf__new()
764 btf->raw_size = size; in btf__new()
766 btf->hdr = btf->raw_data; in btf__new()
767 err = btf_parse_hdr(btf); in btf__new()
771 btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off; in btf__new()
772 btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off; in btf__new()
774 err = btf_parse_str_sec(btf); in btf__new()
775 err = err ?: btf_parse_type_sec(btf); in btf__new()
779 btf->fd = -1; in btf__new()
783 btf__free(btf); in btf__new()
787 return btf; in btf__new()
790 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext) in btf__parse_elf()
794 struct btf *btf = NULL; in btf__parse_elf() local
868 btf = btf__new(btf_data->d_buf, btf_data->d_size); in btf__parse_elf()
869 if (IS_ERR(btf)) in btf__parse_elf()
874 btf__set_pointer_size(btf, 4); in btf__parse_elf()
877 btf__set_pointer_size(btf, 8); in btf__parse_elf()
903 if (IS_ERR(btf)) in btf__parse_elf()
904 return btf; in btf__parse_elf()
906 btf__free(btf); in btf__parse_elf()
910 return btf; in btf__parse_elf()
913 struct btf *btf__parse_raw(const char *path) in btf__parse_raw()
915 struct btf *btf = NULL; in btf__parse_raw() local
967 btf = btf__new(data, sz); in btf__parse_raw()
973 return err ? ERR_PTR(err) : btf; in btf__parse_raw()
976 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext) in btf__parse()
978 struct btf *btf; in btf__parse() local
983 btf = btf__parse_raw(path); in btf__parse()
984 if (!IS_ERR(btf) || PTR_ERR(btf) != -EPROTO) in btf__parse()
985 return btf; in btf__parse()
998 static int btf_fixup_datasec(struct bpf_object *obj, struct btf *btf, in btf_fixup_datasec() argument
1002 const char *name = btf__name_by_offset(btf, t->name_off); in btf_fixup_datasec()
1028 t_var = btf__type_by_id(btf, vsi->type); in btf_fixup_datasec()
1039 name = btf__name_by_offset(btf, t_var->name_off); in btf_fixup_datasec()
1060 int btf__finalize_data(struct bpf_object *obj, struct btf *btf) in btf__finalize_data() argument
1065 for (i = 1; i <= btf->nr_types; i++) { in btf__finalize_data()
1066 struct btf_type *t = btf_type_by_id(btf, i); in btf__finalize_data()
1074 err = btf_fixup_datasec(obj, btf, t); in btf__finalize_data()
1083 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1085 int btf__load(struct btf *btf) in btf__load() argument
1092 if (btf->fd >= 0) in btf__load()
1104 raw_data = btf_get_raw_data(btf, &raw_size, false); in btf__load()
1110 btf->raw_size = raw_size; in btf__load()
1111 btf->raw_data = raw_data; in btf__load()
1113 btf->fd = bpf_load_btf(raw_data, raw_size, log_buf, log_buf_size, false); in btf__load()
1114 if (btf->fd < 0) { in btf__load()
1134 int btf__fd(const struct btf *btf) in btf__fd() argument
1136 return btf->fd; in btf__fd()
1139 void btf__set_fd(struct btf *btf, int fd) in btf__set_fd() argument
1141 btf->fd = fd; in btf__set_fd()
1144 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian) in btf_get_raw_data() argument
1146 struct btf_header *hdr = btf->hdr; in btf_get_raw_data()
1152 data = swap_endian ? btf->raw_data_swapped : btf->raw_data; in btf_get_raw_data()
1154 *size = btf->raw_size; in btf_get_raw_data()
1169 memcpy(p, btf->types_data, hdr->type_len); in btf_get_raw_data()
1171 for (i = 1; i <= btf->nr_types; i++) { in btf_get_raw_data()
1172 t = p + btf->type_offs[i]; in btf_get_raw_data()
1184 memcpy(p, btf->strs_data, hdr->str_len); in btf_get_raw_data()
1194 const void *btf__get_raw_data(const struct btf *btf_ro, __u32 *size) in btf__get_raw_data()
1196 struct btf *btf = (struct btf *)btf_ro; in btf__get_raw_data() local
1200 data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian); in btf__get_raw_data()
1204 btf->raw_size = data_sz; in btf__get_raw_data()
1205 if (btf->swapped_endian) in btf__get_raw_data()
1206 btf->raw_data_swapped = data; in btf__get_raw_data()
1208 btf->raw_data = data; in btf__get_raw_data()
1213 const char *btf__str_by_offset(const struct btf *btf, __u32 offset) in btf__str_by_offset() argument
1215 if (offset < btf->hdr->str_len) in btf__str_by_offset()
1216 return btf->strs_data + offset; in btf__str_by_offset()
1221 const char *btf__name_by_offset(const struct btf *btf, __u32 offset) in btf__name_by_offset() argument
1223 return btf__str_by_offset(btf, offset); in btf__name_by_offset()
1226 int btf__get_from_id(__u32 id, struct btf **btf) in btf__get_from_id() argument
1236 *btf = NULL; in btf__get_from_id()
1254 btf_info.btf = ptr_to_u64(ptr); in btf__get_from_id()
1268 btf_info.btf = ptr_to_u64(ptr); in btf__get_from_id()
1277 *btf = btf__new((__u8 *)(long)btf_info.btf, btf_info.btf_size); in btf__get_from_id()
1278 if (IS_ERR(*btf)) { in btf__get_from_id()
1279 err = PTR_ERR(*btf); in btf__get_from_id()
1280 *btf = NULL; in btf__get_from_id()
1290 int btf__get_map_kv_tids(const struct btf *btf, const char *map_name, in btf__get_map_kv_tids() argument
1308 container_id = btf__find_by_name(btf, container_name); in btf__get_map_kv_tids()
1315 container_type = btf__type_by_id(btf, container_id); in btf__get_map_kv_tids()
1331 key_size = btf__resolve_size(btf, key->type); in btf__get_map_kv_tids()
1343 value_size = btf__resolve_size(btf, value->type); in btf__get_map_kv_tids()
1363 struct btf *btf = ctx; in strs_hash_fn() local
1364 const char *str = btf->strs_data + (long)key; in strs_hash_fn()
1371 struct btf *btf = ctx; in strs_hash_equal_fn() local
1372 const char *str1 = btf->strs_data + (long)key1; in strs_hash_equal_fn()
1373 const char *str2 = btf->strs_data + (long)key2; in strs_hash_equal_fn()
1378 static void btf_invalidate_raw_data(struct btf *btf) in btf_invalidate_raw_data() argument
1380 if (btf->raw_data) { in btf_invalidate_raw_data()
1381 free(btf->raw_data); in btf_invalidate_raw_data()
1382 btf->raw_data = NULL; in btf_invalidate_raw_data()
1384 if (btf->raw_data_swapped) { in btf_invalidate_raw_data()
1385 free(btf->raw_data_swapped); in btf_invalidate_raw_data()
1386 btf->raw_data_swapped = NULL; in btf_invalidate_raw_data()
1394 static int btf_ensure_modifiable(struct btf *btf) in btf_ensure_modifiable() argument
1401 if (btf_is_modifiable(btf)) { in btf_ensure_modifiable()
1403 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1408 hdr = malloc(btf->hdr->hdr_len); in btf_ensure_modifiable()
1409 types = malloc(btf->hdr->type_len); in btf_ensure_modifiable()
1410 strs = malloc(btf->hdr->str_len); in btf_ensure_modifiable()
1414 memcpy(hdr, btf->hdr, btf->hdr->hdr_len); in btf_ensure_modifiable()
1415 memcpy(types, btf->types_data, btf->hdr->type_len); in btf_ensure_modifiable()
1416 memcpy(strs, btf->strs_data, btf->hdr->str_len); in btf_ensure_modifiable()
1419 hash = hashmap__new(strs_hash_fn, strs_hash_equal_fn, btf); in btf_ensure_modifiable()
1426 strs_end = strs + btf->hdr->str_len; in btf_ensure_modifiable()
1439 btf->hdr = hdr; in btf_ensure_modifiable()
1440 btf->types_data = types; in btf_ensure_modifiable()
1441 btf->types_data_cap = btf->hdr->type_len; in btf_ensure_modifiable()
1442 btf->strs_data = strs; in btf_ensure_modifiable()
1443 btf->strs_data_cap = btf->hdr->str_len; in btf_ensure_modifiable()
1444 btf->strs_hash = hash; in btf_ensure_modifiable()
1448 btf->strs_deduped = btf->hdr->str_len <= 1; in btf_ensure_modifiable()
1451 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1463 static void *btf_add_str_mem(struct btf *btf, size_t add_sz) in btf_add_str_mem() argument
1465 return btf_add_mem(&btf->strs_data, &btf->strs_data_cap, 1, in btf_add_str_mem()
1466 btf->hdr->str_len, BTF_MAX_STR_OFFSET, add_sz); in btf_add_str_mem()
1475 int btf__find_str(struct btf *btf, const char *s) in btf__find_str() argument
1481 if (btf_ensure_modifiable(btf)) in btf__find_str()
1486 p = btf_add_str_mem(btf, len); in btf__find_str()
1490 new_off = btf->hdr->str_len; in btf__find_str()
1493 if (hashmap__find(btf->strs_hash, (void *)new_off, (void **)&old_off)) in btf__find_str()
1504 int btf__add_str(struct btf *btf, const char *s) in btf__add_str() argument
1510 if (btf_ensure_modifiable(btf)) in btf__add_str()
1522 p = btf_add_str_mem(btf, len); in btf__add_str()
1526 new_off = btf->hdr->str_len; in btf__add_str()
1533 err = hashmap__insert(btf->strs_hash, (void *)new_off, (void *)new_off, in btf__add_str()
1540 btf->hdr->str_len += len; /* new unique string, adjust data length */ in btf__add_str()
1544 static void *btf_add_type_mem(struct btf *btf, size_t add_sz) in btf_add_type_mem() argument
1546 return btf_add_mem(&btf->types_data, &btf->types_data_cap, 1, in btf_add_type_mem()
1547 btf->hdr->type_len, UINT_MAX, add_sz); in btf_add_type_mem()
1569 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding) in btf__add_int() argument
1584 if (btf_ensure_modifiable(btf)) in btf__add_int()
1588 t = btf_add_type_mem(btf, sz); in btf__add_int()
1596 name_off = btf__add_str(btf, name); in btf__add_int()
1606 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_int()
1610 btf->hdr->type_len += sz; in btf__add_int()
1611 btf->hdr->str_off += sz; in btf__add_int()
1612 btf->nr_types++; in btf__add_int()
1613 return btf->nr_types; in btf__add_int()
1628 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id) in btf_add_ref_kind() argument
1636 if (btf_ensure_modifiable(btf)) in btf_add_ref_kind()
1640 t = btf_add_type_mem(btf, sz); in btf_add_ref_kind()
1645 name_off = btf__add_str(btf, name); in btf_add_ref_kind()
1654 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf_add_ref_kind()
1658 btf->hdr->type_len += sz; in btf_add_ref_kind()
1659 btf->hdr->str_off += sz; in btf_add_ref_kind()
1660 btf->nr_types++; in btf_add_ref_kind()
1661 return btf->nr_types; in btf_add_ref_kind()
1671 int btf__add_ptr(struct btf *btf, int ref_type_id) in btf__add_ptr() argument
1673 return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id); in btf__add_ptr()
1685 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems) in btf__add_array() argument
1694 if (btf_ensure_modifiable(btf)) in btf__add_array()
1698 t = btf_add_type_mem(btf, sz); in btf__add_array()
1711 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_array()
1715 btf->hdr->type_len += sz; in btf__add_array()
1716 btf->hdr->str_off += sz; in btf__add_array()
1717 btf->nr_types++; in btf__add_array()
1718 return btf->nr_types; in btf__add_array()
1722 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz) in btf_add_composite() argument
1727 if (btf_ensure_modifiable(btf)) in btf_add_composite()
1731 t = btf_add_type_mem(btf, sz); in btf_add_composite()
1736 name_off = btf__add_str(btf, name); in btf_add_composite()
1748 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf_add_composite()
1752 btf->hdr->type_len += sz; in btf_add_composite()
1753 btf->hdr->str_off += sz; in btf_add_composite()
1754 btf->nr_types++; in btf_add_composite()
1755 return btf->nr_types; in btf_add_composite()
1770 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_struct() argument
1772 return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz); in btf__add_struct()
1788 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_union() argument
1790 return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz); in btf__add_union()
1803 int btf__add_field(struct btf *btf, const char *name, int type_id, in btf__add_field() argument
1812 if (btf->nr_types == 0) in btf__add_field()
1814 t = btf_type_by_id(btf, btf->nr_types); in btf__add_field()
1830 if (btf_ensure_modifiable(btf)) in btf__add_field()
1834 m = btf_add_type_mem(btf, sz); in btf__add_field()
1839 name_off = btf__add_str(btf, name); in btf__add_field()
1849 t = btf_type_by_id(btf, btf->nr_types); in btf__add_field()
1853 btf->hdr->type_len += sz; in btf__add_field()
1854 btf->hdr->str_off += sz; in btf__add_field()
1871 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_enum() argument
1880 if (btf_ensure_modifiable(btf)) in btf__add_enum()
1884 t = btf_add_type_mem(btf, sz); in btf__add_enum()
1889 name_off = btf__add_str(btf, name); in btf__add_enum()
1899 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_enum()
1903 btf->hdr->type_len += sz; in btf__add_enum()
1904 btf->hdr->str_off += sz; in btf__add_enum()
1905 btf->nr_types++; in btf__add_enum()
1906 return btf->nr_types; in btf__add_enum()
1917 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value) in btf__add_enum_value() argument
1924 if (btf->nr_types == 0) in btf__add_enum_value()
1926 t = btf_type_by_id(btf, btf->nr_types); in btf__add_enum_value()
1937 if (btf_ensure_modifiable(btf)) in btf__add_enum_value()
1941 v = btf_add_type_mem(btf, sz); in btf__add_enum_value()
1945 name_off = btf__add_str(btf, name); in btf__add_enum_value()
1953 t = btf_type_by_id(btf, btf->nr_types); in btf__add_enum_value()
1956 btf->hdr->type_len += sz; in btf__add_enum_value()
1957 btf->hdr->str_off += sz; in btf__add_enum_value()
1970 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind) in btf__add_fwd() argument
1981 id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0); in btf__add_fwd()
1984 t = btf_type_by_id(btf, id); in btf__add_fwd()
1992 return btf__add_enum(btf, name, sizeof(int)); in btf__add_fwd()
2006 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id) in btf__add_typedef() argument
2011 return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id); in btf__add_typedef()
2021 int btf__add_volatile(struct btf *btf, int ref_type_id) in btf__add_volatile() argument
2023 return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id); in btf__add_volatile()
2033 int btf__add_const(struct btf *btf, int ref_type_id) in btf__add_const() argument
2035 return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id); in btf__add_const()
2045 int btf__add_restrict(struct btf *btf, int ref_type_id) in btf__add_restrict() argument
2047 return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id); in btf__add_restrict()
2058 int btf__add_func(struct btf *btf, const char *name, in btf__add_func() argument
2069 id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id); in btf__add_func()
2071 struct btf_type *t = btf_type_by_id(btf, id); in btf__add_func()
2090 int btf__add_func_proto(struct btf *btf, int ret_type_id) in btf__add_func_proto() argument
2098 if (btf_ensure_modifiable(btf)) in btf__add_func_proto()
2102 t = btf_add_type_mem(btf, sz); in btf__add_func_proto()
2113 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_func_proto()
2117 btf->hdr->type_len += sz; in btf__add_func_proto()
2118 btf->hdr->str_off += sz; in btf__add_func_proto()
2119 btf->nr_types++; in btf__add_func_proto()
2120 return btf->nr_types; in btf__add_func_proto()
2131 int btf__add_func_param(struct btf *btf, const char *name, int type_id) in btf__add_func_param() argument
2141 if (btf->nr_types == 0) in btf__add_func_param()
2143 t = btf_type_by_id(btf, btf->nr_types); in btf__add_func_param()
2148 if (btf_ensure_modifiable(btf)) in btf__add_func_param()
2152 p = btf_add_type_mem(btf, sz); in btf__add_func_param()
2157 name_off = btf__add_str(btf, name); in btf__add_func_param()
2166 t = btf_type_by_id(btf, btf->nr_types); in btf__add_func_param()
2169 btf->hdr->type_len += sz; in btf__add_func_param()
2170 btf->hdr->str_off += sz; in btf__add_func_param()
2184 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id) in btf__add_var() argument
2200 if (btf_ensure_modifiable(btf)) in btf__add_var()
2204 t = btf_add_type_mem(btf, sz); in btf__add_var()
2208 name_off = btf__add_str(btf, name); in btf__add_var()
2219 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_var()
2223 btf->hdr->type_len += sz; in btf__add_var()
2224 btf->hdr->str_off += sz; in btf__add_var()
2225 btf->nr_types++; in btf__add_var()
2226 return btf->nr_types; in btf__add_var()
2241 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_datasec() argument
2250 if (btf_ensure_modifiable(btf)) in btf__add_datasec()
2254 t = btf_add_type_mem(btf, sz); in btf__add_datasec()
2258 name_off = btf__add_str(btf, name); in btf__add_datasec()
2267 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_datasec()
2271 btf->hdr->type_len += sz; in btf__add_datasec()
2272 btf->hdr->str_off += sz; in btf__add_datasec()
2273 btf->nr_types++; in btf__add_datasec()
2274 return btf->nr_types; in btf__add_datasec()
2287 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
2294 if (btf->nr_types == 0) in btf__add_datasec_var_info()
2296 t = btf_type_by_id(btf, btf->nr_types); in btf__add_datasec_var_info()
2304 if (btf_ensure_modifiable(btf)) in btf__add_datasec_var_info()
2308 v = btf_add_type_mem(btf, sz); in btf__add_datasec_var_info()
2317 t = btf_type_by_id(btf, btf->nr_types); in btf__add_datasec_var_info()
2320 btf->hdr->type_len += sz; in btf__add_datasec_var_info()
2321 btf->hdr->str_off += sz; in btf__add_datasec_var_info()
2558 static int btf_ext_reloc_info(const struct btf *btf, in btf_ext_reloc_info() argument
2575 info_sec_name = btf__name_by_offset(btf, sinfo->sec_name_off); in btf_ext_reloc_info()
2606 int btf_ext__reloc_func_info(const struct btf *btf, in btf_ext__reloc_func_info() argument
2611 return btf_ext_reloc_info(btf, &btf_ext->func_info, sec_name, in btf_ext__reloc_func_info()
2615 int btf_ext__reloc_line_info(const struct btf *btf, in btf_ext__reloc_line_info() argument
2620 return btf_ext_reloc_info(btf, &btf_ext->line_info, sec_name, in btf_ext__reloc_line_info()
2636 static struct btf_dedup *btf_dedup_new(struct btf *btf, struct btf_ext *btf_ext,
2783 int btf__dedup(struct btf *btf, struct btf_ext *btf_ext, in btf__dedup() argument
2786 struct btf_dedup *d = btf_dedup_new(btf, btf_ext, opts); in btf__dedup()
2794 if (btf_ensure_modifiable(btf)) in btf__dedup()
2838 struct btf *btf; member
2948 static struct btf_dedup *btf_dedup_new(struct btf *btf, struct btf_ext *btf_ext, in btf_dedup_new() argument
2963 d->btf = btf; in btf_dedup_new()
2973 d->map = malloc(sizeof(__u32) * (1 + btf->nr_types)); in btf_dedup_new()
2980 for (i = 1; i <= btf->nr_types; i++) { in btf_dedup_new()
2981 struct btf_type *t = btf_type_by_id(d->btf, i); in btf_dedup_new()
2990 d->hypot_map = malloc(sizeof(__u32) * (1 + btf->nr_types)); in btf_dedup_new()
2995 for (i = 0; i <= btf->nr_types; i++) in btf_dedup_new()
3019 for (i = 1; i <= d->btf->nr_types; i++) { in btf_for_each_str_off()
3020 t = btf_type_by_id(d->btf, i); in btf_for_each_str_off()
3174 char *start = d->btf->strs_data; in btf_dedup_strings()
3175 char *end = start + d->btf->hdr->str_len; in btf_dedup_strings()
3186 if (d->btf->strs_deduped) in btf_dedup_strings()
3211 tmp_strs = malloc(d->btf->hdr->str_len); in btf_dedup_strings()
3268 d->btf->hdr->str_len = p - tmp_strs; in btf_dedup_strings()
3269 memmove(start, tmp_strs, d->btf->hdr->str_len); in btf_dedup_strings()
3270 end = start + d->btf->hdr->str_len; in btf_dedup_strings()
3280 d->btf->hdr->str_len = end - start; in btf_dedup_strings()
3281 d->btf->strs_deduped = true; in btf_dedup_strings()
3558 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_prim_type()
3585 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3597 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3620 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3643 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_prim_types()
3679 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
3685 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
3813 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_is_equiv()
3814 canon_type = btf_type_by_id(d->btf, canon_id); in btf_dedup_is_equiv()
3965 t_kind = btf_kind(btf__type_by_id(d->btf, t_id)); in btf_dedup_merge_hypot_map()
3966 c_kind = btf_kind(btf__type_by_id(d->btf, c_id)); in btf_dedup_merge_hypot_map()
4034 t = btf_type_by_id(d->btf, type_id); in btf_dedup_struct_type()
4055 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_struct_type()
4081 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_struct_types()
4127 t = btf_type_by_id(d->btf, type_id); in btf_dedup_ref_type()
4145 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4169 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4201 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4225 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_ref_types()
4256 for (i = 1; i <= d->btf->nr_types; i++) in btf_dedup_compact_types()
4259 p = d->btf->types_data; in btf_dedup_compact_types()
4261 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_compact_types()
4265 len = btf_type_size(btf__type_by_id(d->btf, i)); in btf_dedup_compact_types()
4269 memmove(p, btf__type_by_id(d->btf, i), len); in btf_dedup_compact_types()
4271 d->btf->type_offs[next_type_id] = p - d->btf->types_data; in btf_dedup_compact_types()
4277 d->btf->nr_types = next_type_id - 1; in btf_dedup_compact_types()
4278 d->btf->type_offs_cap = d->btf->nr_types + 1; in btf_dedup_compact_types()
4279 d->btf->hdr->type_len = p - d->btf->types_data; in btf_dedup_compact_types()
4280 new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap, in btf_dedup_compact_types()
4284 d->btf->type_offs = new_offs; in btf_dedup_compact_types()
4285 d->btf->hdr->str_off = d->btf->hdr->type_len; in btf_dedup_compact_types()
4286 d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len; in btf_dedup_compact_types()
4319 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_remap_type()
4414 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_remap_types()
4426 struct btf *libbpf_find_kernel_btf(void) in libbpf_find_kernel_btf()
4445 struct btf *btf; in libbpf_find_kernel_btf() local
4457 btf = btf__parse_raw(path); in libbpf_find_kernel_btf()
4459 btf = btf__parse_elf(path, NULL); in libbpf_find_kernel_btf()
4462 path, IS_ERR(btf) ? PTR_ERR(btf) : 0); in libbpf_find_kernel_btf()
4463 if (IS_ERR(btf)) in libbpf_find_kernel_btf()
4466 return btf; in libbpf_find_kernel_btf()