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 meta_left = btf->raw_size - sizeof(*hdr); in btf_parse_hdr()
241 static int btf_parse_str_sec(struct btf *btf) in btf_parse_str_sec() argument
243 const struct btf_header *hdr = btf->hdr; in btf_parse_str_sec()
244 const char *start = btf->strs_data; in btf_parse_str_sec()
245 const char *end = start + btf->hdr->str_len; in btf_parse_str_sec()
362 static int btf_parse_type_sec(struct btf *btf) in btf_parse_type_sec() argument
364 struct btf_header *hdr = btf->hdr; in btf_parse_type_sec()
365 void *next_type = btf->types_data; in btf_parse_type_sec()
373 err = btf_add_type_idx_entry(btf, UINT_MAX); in btf_parse_type_sec()
380 if (btf->swapped_endian) in btf_parse_type_sec()
391 if (btf->swapped_endian && btf_bswap_type_rest(next_type)) in btf_parse_type_sec()
394 err = btf_add_type_idx_entry(btf, next_type - btf->types_data); in btf_parse_type_sec()
399 btf->nr_types++; in btf_parse_type_sec()
410 __u32 btf__get_nr_types(const struct btf *btf) in btf__get_nr_types() argument
412 return btf->nr_types; in btf__get_nr_types()
416 static struct btf_type *btf_type_by_id(struct btf *btf, __u32 type_id) in btf_type_by_id() argument
421 return btf->types_data + btf->type_offs[type_id]; in btf_type_by_id()
424 const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id) in btf__type_by_id() argument
426 if (type_id > btf->nr_types) in btf__type_by_id()
428 return btf_type_by_id((struct btf *)btf, type_id); in btf__type_by_id()
431 static int determine_ptr_size(const struct btf *btf) in determine_ptr_size() argument
437 for (i = 1; i <= btf->nr_types; i++) { in determine_ptr_size()
438 t = btf__type_by_id(btf, i); in determine_ptr_size()
442 name = btf__name_by_offset(btf, t->name_off); in determine_ptr_size()
457 static size_t btf_ptr_sz(const struct btf *btf) in btf_ptr_sz() argument
459 if (!btf->ptr_sz) in btf_ptr_sz()
460 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf_ptr_sz()
461 return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz; in btf_ptr_sz()
472 size_t btf__pointer_size(const struct btf *btf) in btf__pointer_size() argument
474 if (!btf->ptr_sz) in btf__pointer_size()
475 ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); in btf__pointer_size()
477 if (btf->ptr_sz < 0) in btf__pointer_size()
481 return btf->ptr_sz; in btf__pointer_size()
487 int btf__set_pointer_size(struct btf *btf, size_t ptr_sz) in btf__set_pointer_size() argument
491 btf->ptr_sz = ptr_sz; in btf__set_pointer_size()
506 enum btf_endianness btf__endianness(const struct btf *btf) in btf__endianness() argument
509 return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN; in btf__endianness()
511 return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN; in btf__endianness()
514 int btf__set_endianness(struct btf *btf, enum btf_endianness endian) in btf__set_endianness() argument
519 btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN); in btf__set_endianness()
520 if (!btf->swapped_endian) { in btf__set_endianness()
521 free(btf->raw_data_swapped); in btf__set_endianness()
522 btf->raw_data_swapped = NULL; in btf__set_endianness()
539 __s64 btf__resolve_size(const struct btf *btf, __u32 type_id) in btf__resolve_size() argument
547 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
559 size = btf_ptr_sz(btf); in btf__resolve_size()
579 t = btf__type_by_id(btf, type_id); in btf__resolve_size()
591 int btf__align_of(const struct btf *btf, __u32 id) in btf__align_of() argument
593 const struct btf_type *t = btf__type_by_id(btf, id); in btf__align_of()
599 return min(btf_ptr_sz(btf), (size_t)t->size); in btf__align_of()
601 return btf_ptr_sz(btf); in btf__align_of()
606 return btf__align_of(btf, t->type); in btf__align_of()
608 return btf__align_of(btf, btf_array(t)->type); in btf__align_of()
616 align = btf__align_of(btf, m->type); in btf__align_of()
630 int btf__resolve_type(const struct btf *btf, __u32 type_id) in btf__resolve_type() argument
635 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
640 t = btf__type_by_id(btf, type_id); in btf__resolve_type()
650 __s32 btf__find_by_name(const struct btf *btf, const char *type_name) in btf__find_by_name() argument
657 for (i = 1; i <= btf->nr_types; i++) { in btf__find_by_name()
658 const struct btf_type *t = btf__type_by_id(btf, i); in btf__find_by_name()
659 const char *name = btf__name_by_offset(btf, t->name_off); in btf__find_by_name()
668 __s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name, in btf__find_by_name_kind() argument
676 for (i = 1; i <= btf->nr_types; i++) { in btf__find_by_name_kind()
677 const struct btf_type *t = btf__type_by_id(btf, i); in btf__find_by_name_kind()
682 name = btf__name_by_offset(btf, t->name_off); in btf__find_by_name_kind()
690 static bool btf_is_modifiable(const struct btf *btf) in btf_is_modifiable() argument
692 return (void *)btf->hdr != btf->raw_data; in btf_is_modifiable()
695 void btf__free(struct btf *btf) in btf__free() argument
697 if (IS_ERR_OR_NULL(btf)) in btf__free()
700 if (btf->fd >= 0) in btf__free()
701 close(btf->fd); in btf__free()
703 if (btf_is_modifiable(btf)) { in btf__free()
710 free(btf->hdr); in btf__free()
711 free(btf->types_data); in btf__free()
712 free(btf->strs_data); in btf__free()
714 free(btf->raw_data); in btf__free()
715 free(btf->raw_data_swapped); in btf__free()
716 free(btf->type_offs); in btf__free()
717 free(btf); in btf__free()
720 struct btf *btf__new_empty(void) in btf__new_empty()
722 struct btf *btf; in btf__new_empty() local
724 btf = calloc(1, sizeof(*btf)); in btf__new_empty()
725 if (!btf) in btf__new_empty()
728 btf->fd = -1; in btf__new_empty()
729 btf->ptr_sz = sizeof(void *); in btf__new_empty()
730 btf->swapped_endian = false; in btf__new_empty()
733 btf->raw_size = sizeof(struct btf_header) + 1; in btf__new_empty()
734 btf->raw_data = calloc(1, btf->raw_size); in btf__new_empty()
735 if (!btf->raw_data) { in btf__new_empty()
736 free(btf); in btf__new_empty()
740 btf->hdr = btf->raw_data; in btf__new_empty()
741 btf->hdr->hdr_len = sizeof(struct btf_header); in btf__new_empty()
742 btf->hdr->magic = BTF_MAGIC; in btf__new_empty()
743 btf->hdr->version = BTF_VERSION; in btf__new_empty()
745 btf->types_data = btf->raw_data + btf->hdr->hdr_len; in btf__new_empty()
746 btf->strs_data = btf->raw_data + btf->hdr->hdr_len; in btf__new_empty()
747 btf->hdr->str_len = 1; /* empty string at offset 0 */ in btf__new_empty()
749 return btf; in btf__new_empty()
752 struct btf *btf__new(const void *data, __u32 size) in btf__new()
754 struct btf *btf; in btf__new() local
757 btf = calloc(1, sizeof(struct btf)); in btf__new()
758 if (!btf) in btf__new()
761 btf->raw_data = malloc(size); in btf__new()
762 if (!btf->raw_data) { in btf__new()
766 memcpy(btf->raw_data, data, size); in btf__new()
767 btf->raw_size = size; in btf__new()
769 btf->hdr = btf->raw_data; in btf__new()
770 err = btf_parse_hdr(btf); in btf__new()
774 btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off; in btf__new()
775 btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off; in btf__new()
777 err = btf_parse_str_sec(btf); in btf__new()
778 err = err ?: btf_parse_type_sec(btf); in btf__new()
782 btf->fd = -1; in btf__new()
786 btf__free(btf); in btf__new()
790 return btf; in btf__new()
793 struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext) in btf__parse_elf()
797 struct btf *btf = NULL; in btf__parse_elf() local
871 btf = btf__new(btf_data->d_buf, btf_data->d_size); in btf__parse_elf()
872 if (IS_ERR(btf)) in btf__parse_elf()
877 btf__set_pointer_size(btf, 4); in btf__parse_elf()
880 btf__set_pointer_size(btf, 8); in btf__parse_elf()
906 if (IS_ERR(btf)) in btf__parse_elf()
907 return btf; in btf__parse_elf()
909 btf__free(btf); in btf__parse_elf()
913 return btf; in btf__parse_elf()
916 struct btf *btf__parse_raw(const char *path) in btf__parse_raw()
918 struct btf *btf = NULL; in btf__parse_raw() local
970 btf = btf__new(data, sz); in btf__parse_raw()
976 return err ? ERR_PTR(err) : btf; in btf__parse_raw()
979 struct btf *btf__parse(const char *path, struct btf_ext **btf_ext) in btf__parse()
981 struct btf *btf; in btf__parse() local
986 btf = btf__parse_raw(path); in btf__parse()
987 if (!IS_ERR(btf) || PTR_ERR(btf) != -EPROTO) in btf__parse()
988 return btf; in btf__parse()
1001 static int btf_fixup_datasec(struct bpf_object *obj, struct btf *btf, in btf_fixup_datasec() argument
1005 const char *name = btf__name_by_offset(btf, t->name_off); in btf_fixup_datasec()
1031 t_var = btf__type_by_id(btf, vsi->type); in btf_fixup_datasec()
1042 name = btf__name_by_offset(btf, t_var->name_off); in btf_fixup_datasec()
1063 int btf__finalize_data(struct bpf_object *obj, struct btf *btf) in btf__finalize_data() argument
1068 for (i = 1; i <= btf->nr_types; i++) { in btf__finalize_data()
1069 struct btf_type *t = btf_type_by_id(btf, i); in btf__finalize_data()
1077 err = btf_fixup_datasec(obj, btf, t); in btf__finalize_data()
1086 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian);
1088 int btf__load(struct btf *btf) in btf__load() argument
1095 if (btf->fd >= 0) in btf__load()
1107 raw_data = btf_get_raw_data(btf, &raw_size, false); in btf__load()
1113 btf->raw_size = raw_size; in btf__load()
1114 btf->raw_data = raw_data; in btf__load()
1116 btf->fd = bpf_load_btf(raw_data, raw_size, log_buf, log_buf_size, false); in btf__load()
1117 if (btf->fd < 0) { in btf__load()
1137 int btf__fd(const struct btf *btf) in btf__fd() argument
1139 return btf->fd; in btf__fd()
1142 void btf__set_fd(struct btf *btf, int fd) in btf__set_fd() argument
1144 btf->fd = fd; in btf__set_fd()
1147 static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian) in btf_get_raw_data() argument
1149 struct btf_header *hdr = btf->hdr; in btf_get_raw_data()
1155 data = swap_endian ? btf->raw_data_swapped : btf->raw_data; in btf_get_raw_data()
1157 *size = btf->raw_size; in btf_get_raw_data()
1172 memcpy(p, btf->types_data, hdr->type_len); in btf_get_raw_data()
1174 for (i = 1; i <= btf->nr_types; i++) { in btf_get_raw_data()
1175 t = p + btf->type_offs[i]; in btf_get_raw_data()
1187 memcpy(p, btf->strs_data, hdr->str_len); in btf_get_raw_data()
1197 const void *btf__get_raw_data(const struct btf *btf_ro, __u32 *size) in btf__get_raw_data()
1199 struct btf *btf = (struct btf *)btf_ro; in btf__get_raw_data() local
1203 data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian); in btf__get_raw_data()
1207 btf->raw_size = data_sz; in btf__get_raw_data()
1208 if (btf->swapped_endian) in btf__get_raw_data()
1209 btf->raw_data_swapped = data; in btf__get_raw_data()
1211 btf->raw_data = data; in btf__get_raw_data()
1216 const char *btf__str_by_offset(const struct btf *btf, __u32 offset) in btf__str_by_offset() argument
1218 if (offset < btf->hdr->str_len) in btf__str_by_offset()
1219 return btf->strs_data + offset; in btf__str_by_offset()
1224 const char *btf__name_by_offset(const struct btf *btf, __u32 offset) in btf__name_by_offset() argument
1226 return btf__str_by_offset(btf, offset); in btf__name_by_offset()
1229 int btf__get_from_id(__u32 id, struct btf **btf) in btf__get_from_id() argument
1239 *btf = NULL; in btf__get_from_id()
1257 btf_info.btf = ptr_to_u64(ptr); in btf__get_from_id()
1271 btf_info.btf = ptr_to_u64(ptr); in btf__get_from_id()
1280 *btf = btf__new((__u8 *)(long)btf_info.btf, btf_info.btf_size); in btf__get_from_id()
1281 if (IS_ERR(*btf)) { in btf__get_from_id()
1282 err = PTR_ERR(*btf); in btf__get_from_id()
1283 *btf = NULL; in btf__get_from_id()
1293 int btf__get_map_kv_tids(const struct btf *btf, const char *map_name, in btf__get_map_kv_tids() argument
1311 container_id = btf__find_by_name(btf, container_name); in btf__get_map_kv_tids()
1318 container_type = btf__type_by_id(btf, container_id); in btf__get_map_kv_tids()
1334 key_size = btf__resolve_size(btf, key->type); in btf__get_map_kv_tids()
1346 value_size = btf__resolve_size(btf, value->type); in btf__get_map_kv_tids()
1366 struct btf *btf = ctx; in strs_hash_fn() local
1367 const char *str = btf->strs_data + (long)key; in strs_hash_fn()
1374 struct btf *btf = ctx; in strs_hash_equal_fn() local
1375 const char *str1 = btf->strs_data + (long)key1; in strs_hash_equal_fn()
1376 const char *str2 = btf->strs_data + (long)key2; in strs_hash_equal_fn()
1381 static void btf_invalidate_raw_data(struct btf *btf) in btf_invalidate_raw_data() argument
1383 if (btf->raw_data) { in btf_invalidate_raw_data()
1384 free(btf->raw_data); in btf_invalidate_raw_data()
1385 btf->raw_data = NULL; in btf_invalidate_raw_data()
1387 if (btf->raw_data_swapped) { in btf_invalidate_raw_data()
1388 free(btf->raw_data_swapped); in btf_invalidate_raw_data()
1389 btf->raw_data_swapped = NULL; in btf_invalidate_raw_data()
1397 static int btf_ensure_modifiable(struct btf *btf) in btf_ensure_modifiable() argument
1404 if (btf_is_modifiable(btf)) { in btf_ensure_modifiable()
1406 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1411 hdr = malloc(btf->hdr->hdr_len); in btf_ensure_modifiable()
1412 types = malloc(btf->hdr->type_len); in btf_ensure_modifiable()
1413 strs = malloc(btf->hdr->str_len); in btf_ensure_modifiable()
1417 memcpy(hdr, btf->hdr, btf->hdr->hdr_len); in btf_ensure_modifiable()
1418 memcpy(types, btf->types_data, btf->hdr->type_len); in btf_ensure_modifiable()
1419 memcpy(strs, btf->strs_data, btf->hdr->str_len); in btf_ensure_modifiable()
1422 hash = hashmap__new(strs_hash_fn, strs_hash_equal_fn, btf); in btf_ensure_modifiable()
1429 strs_end = strs + btf->hdr->str_len; in btf_ensure_modifiable()
1442 btf->hdr = hdr; in btf_ensure_modifiable()
1443 btf->types_data = types; in btf_ensure_modifiable()
1444 btf->types_data_cap = btf->hdr->type_len; in btf_ensure_modifiable()
1445 btf->strs_data = strs; in btf_ensure_modifiable()
1446 btf->strs_data_cap = btf->hdr->str_len; in btf_ensure_modifiable()
1447 btf->strs_hash = hash; in btf_ensure_modifiable()
1451 btf->strs_deduped = btf->hdr->str_len <= 1; in btf_ensure_modifiable()
1454 btf_invalidate_raw_data(btf); in btf_ensure_modifiable()
1466 static void *btf_add_str_mem(struct btf *btf, size_t add_sz) in btf_add_str_mem() argument
1468 return btf_add_mem(&btf->strs_data, &btf->strs_data_cap, 1, in btf_add_str_mem()
1469 btf->hdr->str_len, BTF_MAX_STR_OFFSET, add_sz); in btf_add_str_mem()
1478 int btf__find_str(struct btf *btf, const char *s) in btf__find_str() argument
1484 if (btf_ensure_modifiable(btf)) in btf__find_str()
1489 p = btf_add_str_mem(btf, len); in btf__find_str()
1493 new_off = btf->hdr->str_len; in btf__find_str()
1496 if (hashmap__find(btf->strs_hash, (void *)new_off, (void **)&old_off)) in btf__find_str()
1507 int btf__add_str(struct btf *btf, const char *s) in btf__add_str() argument
1513 if (btf_ensure_modifiable(btf)) in btf__add_str()
1525 p = btf_add_str_mem(btf, len); in btf__add_str()
1529 new_off = btf->hdr->str_len; in btf__add_str()
1536 err = hashmap__insert(btf->strs_hash, (void *)new_off, (void *)new_off, in btf__add_str()
1543 btf->hdr->str_len += len; /* new unique string, adjust data length */ in btf__add_str()
1547 static void *btf_add_type_mem(struct btf *btf, size_t add_sz) in btf_add_type_mem() argument
1549 return btf_add_mem(&btf->types_data, &btf->types_data_cap, 1, in btf_add_type_mem()
1550 btf->hdr->type_len, UINT_MAX, add_sz); in btf_add_type_mem()
1572 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding) in btf__add_int() argument
1587 if (btf_ensure_modifiable(btf)) in btf__add_int()
1591 t = btf_add_type_mem(btf, sz); in btf__add_int()
1599 name_off = btf__add_str(btf, name); in btf__add_int()
1609 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_int()
1613 btf->hdr->type_len += sz; in btf__add_int()
1614 btf->hdr->str_off += sz; in btf__add_int()
1615 btf->nr_types++; in btf__add_int()
1616 return btf->nr_types; in btf__add_int()
1631 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id) in btf_add_ref_kind() argument
1639 if (btf_ensure_modifiable(btf)) in btf_add_ref_kind()
1643 t = btf_add_type_mem(btf, sz); in btf_add_ref_kind()
1648 name_off = btf__add_str(btf, name); in btf_add_ref_kind()
1657 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf_add_ref_kind()
1661 btf->hdr->type_len += sz; in btf_add_ref_kind()
1662 btf->hdr->str_off += sz; in btf_add_ref_kind()
1663 btf->nr_types++; in btf_add_ref_kind()
1664 return btf->nr_types; in btf_add_ref_kind()
1674 int btf__add_ptr(struct btf *btf, int ref_type_id) in btf__add_ptr() argument
1676 return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id); in btf__add_ptr()
1688 int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems) in btf__add_array() argument
1697 if (btf_ensure_modifiable(btf)) in btf__add_array()
1701 t = btf_add_type_mem(btf, sz); in btf__add_array()
1714 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_array()
1718 btf->hdr->type_len += sz; in btf__add_array()
1719 btf->hdr->str_off += sz; in btf__add_array()
1720 btf->nr_types++; in btf__add_array()
1721 return btf->nr_types; in btf__add_array()
1725 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz) in btf_add_composite() argument
1730 if (btf_ensure_modifiable(btf)) in btf_add_composite()
1734 t = btf_add_type_mem(btf, sz); in btf_add_composite()
1739 name_off = btf__add_str(btf, name); in btf_add_composite()
1751 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf_add_composite()
1755 btf->hdr->type_len += sz; in btf_add_composite()
1756 btf->hdr->str_off += sz; in btf_add_composite()
1757 btf->nr_types++; in btf_add_composite()
1758 return btf->nr_types; in btf_add_composite()
1773 int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_struct() argument
1775 return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz); in btf__add_struct()
1791 int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_union() argument
1793 return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz); in btf__add_union()
1806 int btf__add_field(struct btf *btf, const char *name, int type_id, in btf__add_field() argument
1815 if (btf->nr_types == 0) in btf__add_field()
1817 t = btf_type_by_id(btf, btf->nr_types); in btf__add_field()
1833 if (btf_ensure_modifiable(btf)) in btf__add_field()
1837 m = btf_add_type_mem(btf, sz); in btf__add_field()
1842 name_off = btf__add_str(btf, name); in btf__add_field()
1852 t = btf_type_by_id(btf, btf->nr_types); in btf__add_field()
1856 btf->hdr->type_len += sz; in btf__add_field()
1857 btf->hdr->str_off += sz; in btf__add_field()
1874 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_enum() argument
1883 if (btf_ensure_modifiable(btf)) in btf__add_enum()
1887 t = btf_add_type_mem(btf, sz); in btf__add_enum()
1892 name_off = btf__add_str(btf, name); in btf__add_enum()
1902 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_enum()
1906 btf->hdr->type_len += sz; in btf__add_enum()
1907 btf->hdr->str_off += sz; in btf__add_enum()
1908 btf->nr_types++; in btf__add_enum()
1909 return btf->nr_types; in btf__add_enum()
1920 int btf__add_enum_value(struct btf *btf, const char *name, __s64 value) in btf__add_enum_value() argument
1927 if (btf->nr_types == 0) in btf__add_enum_value()
1929 t = btf_type_by_id(btf, btf->nr_types); in btf__add_enum_value()
1940 if (btf_ensure_modifiable(btf)) in btf__add_enum_value()
1944 v = btf_add_type_mem(btf, sz); in btf__add_enum_value()
1948 name_off = btf__add_str(btf, name); in btf__add_enum_value()
1956 t = btf_type_by_id(btf, btf->nr_types); in btf__add_enum_value()
1959 btf->hdr->type_len += sz; in btf__add_enum_value()
1960 btf->hdr->str_off += sz; in btf__add_enum_value()
1973 int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind) in btf__add_fwd() argument
1984 id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0); in btf__add_fwd()
1987 t = btf_type_by_id(btf, id); in btf__add_fwd()
1995 return btf__add_enum(btf, name, sizeof(int)); in btf__add_fwd()
2009 int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id) in btf__add_typedef() argument
2014 return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id); in btf__add_typedef()
2024 int btf__add_volatile(struct btf *btf, int ref_type_id) in btf__add_volatile() argument
2026 return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id); in btf__add_volatile()
2036 int btf__add_const(struct btf *btf, int ref_type_id) in btf__add_const() argument
2038 return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id); in btf__add_const()
2048 int btf__add_restrict(struct btf *btf, int ref_type_id) in btf__add_restrict() argument
2050 return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id); in btf__add_restrict()
2061 int btf__add_func(struct btf *btf, const char *name, in btf__add_func() argument
2072 id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id); in btf__add_func()
2074 struct btf_type *t = btf_type_by_id(btf, id); in btf__add_func()
2093 int btf__add_func_proto(struct btf *btf, int ret_type_id) in btf__add_func_proto() argument
2101 if (btf_ensure_modifiable(btf)) in btf__add_func_proto()
2105 t = btf_add_type_mem(btf, sz); in btf__add_func_proto()
2116 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_func_proto()
2120 btf->hdr->type_len += sz; in btf__add_func_proto()
2121 btf->hdr->str_off += sz; in btf__add_func_proto()
2122 btf->nr_types++; in btf__add_func_proto()
2123 return btf->nr_types; in btf__add_func_proto()
2134 int btf__add_func_param(struct btf *btf, const char *name, int type_id) in btf__add_func_param() argument
2144 if (btf->nr_types == 0) in btf__add_func_param()
2146 t = btf_type_by_id(btf, btf->nr_types); in btf__add_func_param()
2151 if (btf_ensure_modifiable(btf)) in btf__add_func_param()
2155 p = btf_add_type_mem(btf, sz); in btf__add_func_param()
2160 name_off = btf__add_str(btf, name); in btf__add_func_param()
2169 t = btf_type_by_id(btf, btf->nr_types); in btf__add_func_param()
2172 btf->hdr->type_len += sz; in btf__add_func_param()
2173 btf->hdr->str_off += sz; in btf__add_func_param()
2187 int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id) in btf__add_var() argument
2203 if (btf_ensure_modifiable(btf)) in btf__add_var()
2207 t = btf_add_type_mem(btf, sz); in btf__add_var()
2211 name_off = btf__add_str(btf, name); in btf__add_var()
2222 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_var()
2226 btf->hdr->type_len += sz; in btf__add_var()
2227 btf->hdr->str_off += sz; in btf__add_var()
2228 btf->nr_types++; in btf__add_var()
2229 return btf->nr_types; in btf__add_var()
2244 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz) in btf__add_datasec() argument
2253 if (btf_ensure_modifiable(btf)) in btf__add_datasec()
2257 t = btf_add_type_mem(btf, sz); in btf__add_datasec()
2261 name_off = btf__add_str(btf, name); in btf__add_datasec()
2270 err = btf_add_type_idx_entry(btf, btf->hdr->type_len); in btf__add_datasec()
2274 btf->hdr->type_len += sz; in btf__add_datasec()
2275 btf->hdr->str_off += sz; in btf__add_datasec()
2276 btf->nr_types++; in btf__add_datasec()
2277 return btf->nr_types; in btf__add_datasec()
2290 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
2297 if (btf->nr_types == 0) in btf__add_datasec_var_info()
2299 t = btf_type_by_id(btf, btf->nr_types); in btf__add_datasec_var_info()
2307 if (btf_ensure_modifiable(btf)) in btf__add_datasec_var_info()
2311 v = btf_add_type_mem(btf, sz); in btf__add_datasec_var_info()
2320 t = btf_type_by_id(btf, btf->nr_types); in btf__add_datasec_var_info()
2323 btf->hdr->type_len += sz; in btf__add_datasec_var_info()
2324 btf->hdr->str_off += sz; in btf__add_datasec_var_info()
2561 static int btf_ext_reloc_info(const struct btf *btf, in btf_ext_reloc_info() argument
2578 info_sec_name = btf__name_by_offset(btf, sinfo->sec_name_off); in btf_ext_reloc_info()
2609 int btf_ext__reloc_func_info(const struct btf *btf, in btf_ext__reloc_func_info() argument
2614 return btf_ext_reloc_info(btf, &btf_ext->func_info, sec_name, in btf_ext__reloc_func_info()
2618 int btf_ext__reloc_line_info(const struct btf *btf, in btf_ext__reloc_line_info() argument
2623 return btf_ext_reloc_info(btf, &btf_ext->line_info, sec_name, in btf_ext__reloc_line_info()
2639 static struct btf_dedup *btf_dedup_new(struct btf *btf, struct btf_ext *btf_ext,
2786 int btf__dedup(struct btf *btf, struct btf_ext *btf_ext, in btf__dedup() argument
2789 struct btf_dedup *d = btf_dedup_new(btf, btf_ext, opts); in btf__dedup()
2797 if (btf_ensure_modifiable(btf)) in btf__dedup()
2841 struct btf *btf; member
2951 static struct btf_dedup *btf_dedup_new(struct btf *btf, struct btf_ext *btf_ext, in btf_dedup_new() argument
2966 d->btf = btf; in btf_dedup_new()
2976 d->map = malloc(sizeof(__u32) * (1 + btf->nr_types)); in btf_dedup_new()
2983 for (i = 1; i <= btf->nr_types; i++) { in btf_dedup_new()
2984 struct btf_type *t = btf_type_by_id(d->btf, i); in btf_dedup_new()
2993 d->hypot_map = malloc(sizeof(__u32) * (1 + btf->nr_types)); in btf_dedup_new()
2998 for (i = 0; i <= btf->nr_types; i++) in btf_dedup_new()
3022 for (i = 1; i <= d->btf->nr_types; i++) { in btf_for_each_str_off()
3023 t = btf_type_by_id(d->btf, i); in btf_for_each_str_off()
3177 char *start = d->btf->strs_data; in btf_dedup_strings()
3178 char *end = start + d->btf->hdr->str_len; in btf_dedup_strings()
3189 if (d->btf->strs_deduped) in btf_dedup_strings()
3214 tmp_strs = malloc(d->btf->hdr->str_len); in btf_dedup_strings()
3271 d->btf->hdr->str_len = p - tmp_strs; in btf_dedup_strings()
3272 memmove(start, tmp_strs, d->btf->hdr->str_len); in btf_dedup_strings()
3273 end = start + d->btf->hdr->str_len; in btf_dedup_strings()
3283 d->btf->hdr->str_len = end - start; in btf_dedup_strings()
3284 d->btf->strs_deduped = true; in btf_dedup_strings()
3561 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_prim_type()
3588 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3600 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3623 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_prim_type()
3646 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_prim_types()
3682 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
3688 if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) in resolve_fwd_id()
3816 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_is_equiv()
3817 canon_type = btf_type_by_id(d->btf, canon_id); in btf_dedup_is_equiv()
3968 t_kind = btf_kind(btf__type_by_id(d->btf, t_id)); in btf_dedup_merge_hypot_map()
3969 c_kind = btf_kind(btf__type_by_id(d->btf, c_id)); in btf_dedup_merge_hypot_map()
4037 t = btf_type_by_id(d->btf, type_id); in btf_dedup_struct_type()
4058 cand_type = btf_type_by_id(d->btf, cand_id); in btf_dedup_struct_type()
4084 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_struct_types()
4130 t = btf_type_by_id(d->btf, type_id); in btf_dedup_ref_type()
4148 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4172 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4204 cand = btf_type_by_id(d->btf, cand_id); in btf_dedup_ref_type()
4228 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_ref_types()
4259 for (i = 1; i <= d->btf->nr_types; i++) in btf_dedup_compact_types()
4262 p = d->btf->types_data; in btf_dedup_compact_types()
4264 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_compact_types()
4268 len = btf_type_size(btf__type_by_id(d->btf, i)); in btf_dedup_compact_types()
4272 memmove(p, btf__type_by_id(d->btf, i), len); in btf_dedup_compact_types()
4274 d->btf->type_offs[next_type_id] = p - d->btf->types_data; in btf_dedup_compact_types()
4280 d->btf->nr_types = next_type_id - 1; in btf_dedup_compact_types()
4281 d->btf->type_offs_cap = d->btf->nr_types + 1; in btf_dedup_compact_types()
4282 d->btf->hdr->type_len = p - d->btf->types_data; in btf_dedup_compact_types()
4283 new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap, in btf_dedup_compact_types()
4287 d->btf->type_offs = new_offs; in btf_dedup_compact_types()
4288 d->btf->hdr->str_off = d->btf->hdr->type_len; in btf_dedup_compact_types()
4289 d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len; in btf_dedup_compact_types()
4322 struct btf_type *t = btf_type_by_id(d->btf, type_id); in btf_dedup_remap_type()
4417 for (i = 1; i <= d->btf->nr_types; i++) { in btf_dedup_remap_types()
4429 struct btf *libbpf_find_kernel_btf(void) in libbpf_find_kernel_btf()
4448 struct btf *btf; in libbpf_find_kernel_btf() local
4460 btf = btf__parse_raw(path); in libbpf_find_kernel_btf()
4462 btf = btf__parse_elf(path, NULL); in libbpf_find_kernel_btf()
4465 path, IS_ERR(btf) ? PTR_ERR(btf) : 0); in libbpf_find_kernel_btf()
4466 if (IS_ERR(btf)) in libbpf_find_kernel_btf()
4469 return btf; in libbpf_find_kernel_btf()