Lines Matching +full:name +full:- +full:prefix

1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
8 * following name syntax:
14 * func - lookup BTF_KIND_FUNC symbol with <symbol> name
20 * struct - lookup BTF_KIND_STRUCT symbol with <symbol> name
26 * union - lookup BTF_KIND_UNION symbol with <symbol> name
32 * typedef - lookup BTF_KIND_TYPEDEF symbol with <symbol> name
38 * set - store symbol size into first 4 bytes and sort following
49 * set8 - store symbol size into first 4 bytes and sort following
78 #include <subcmd/parse-options.h>
94 char *name; member
162 static bool is_btf_id(const char *name) in is_btf_id() argument
164 return name && !strncmp(name, BTF_ID, sizeof(BTF_ID) - 1); in is_btf_id()
167 static struct btf_id *btf_id__find(struct rb_root *root, const char *name) in btf_id__find() argument
169 struct rb_node *p = root->rb_node; in btf_id__find()
175 cmp = strcmp(id->name, name); in btf_id__find()
177 p = p->rb_left; in btf_id__find()
179 p = p->rb_right; in btf_id__find()
187 btf_id__add(struct rb_root *root, char *name, bool unique) in btf_id__add() argument
189 struct rb_node **p = &root->rb_node; in btf_id__add()
197 cmp = strcmp(id->name, name); in btf_id__add()
199 p = &(*p)->rb_left; in btf_id__add()
201 p = &(*p)->rb_right; in btf_id__add()
208 pr_debug("adding symbol %s\n", name); in btf_id__add()
209 id->name = name; in btf_id__add()
210 rb_link_node(&id->rb_node, parent, p); in btf_id__add()
211 rb_insert_color(&id->rb_node, root); in btf_id__add()
224 int pos = sizeof("__") - 1; in get_id()
239 p--; in get_id()
249 static struct btf_id *add_set(struct object *obj, char *name, bool is_set8) in add_set() argument
253 * name = ^ in add_set()
256 char *id = name + (is_set8 ? sizeof(BTF_SET8 "__") : sizeof(BTF_SET "__")) - 1; in add_set()
257 int len = strlen(name); in add_set()
259 if (id >= name + len) { in add_set()
260 pr_err("FAILED to parse set name: %s\n", name); in add_set()
264 return btf_id__add(&obj->sets, id, true); in add_set()
267 static struct btf_id *add_symbol(struct rb_root *root, char *name, size_t size) in add_symbol() argument
271 id = get_id(name + size); in add_symbol()
273 pr_err("FAILED to parse symbol name: %s\n", name); in add_symbol()
299 if (!(sh->sh_flags & SHF_COMPRESSED)) in compressed_section_fix()
302 if (sh->sh_addralign == expected) in compressed_section_fix()
305 pr_debug2(" - fixing wrong alignment sh_addralign %u, expected %u\n", in compressed_section_fix()
306 sh->sh_addralign, expected); in compressed_section_fix()
308 sh->sh_addralign = expected; in compressed_section_fix()
312 elf_errmsg(-1)); in compressed_section_fix()
313 return -1; in compressed_section_fix()
326 fd = open(obj->path, O_RDWR, 0666); in elf_collect()
327 if (fd == -1) { in elf_collect()
329 obj->path, strerror(errno)); in elf_collect()
330 return -1; in elf_collect()
339 elf_errmsg(-1)); in elf_collect()
340 return -1; in elf_collect()
343 obj->efile.fd = fd; in elf_collect()
344 obj->efile.elf = elf; in elf_collect()
350 return -1; in elf_collect()
360 char *name; in elf_collect() local
365 return -1; in elf_collect()
368 name = elf_strptr(elf, shdrstrndx, sh.sh_name); in elf_collect()
369 if (!name) { in elf_collect()
370 pr_err("FAILED get section(%d) name\n", idx); in elf_collect()
371 return -1; in elf_collect()
377 idx, name); in elf_collect()
378 return -1; in elf_collect()
382 idx, name, (unsigned long) data->d_size, in elf_collect()
387 obj->efile.symbols = data; in elf_collect()
388 obj->efile.symbols_shndx = idx; in elf_collect()
389 obj->efile.strtabidx = sh.sh_link; in elf_collect()
390 } else if (!strcmp(name, BTF_IDS_SECTION)) { in elf_collect()
391 obj->efile.idlist = data; in elf_collect()
392 obj->efile.idlist_shndx = idx; in elf_collect()
393 obj->efile.idlist_addr = sh.sh_addr; in elf_collect()
397 return -1; in elf_collect()
408 char *name; in symbols_collect() local
410 scn = elf_getscn(obj->efile.elf, obj->efile.symbols_shndx); in symbols_collect()
412 return -1; in symbols_collect()
415 return -1; in symbols_collect()
424 char *prefix; in symbols_collect() local
428 if (!gelf_getsym(obj->efile.symbols, i, &sym)) in symbols_collect()
429 return -1; in symbols_collect()
431 if (sym.st_shndx != obj->efile.idlist_shndx) in symbols_collect()
434 name = elf_strptr(obj->efile.elf, obj->efile.strtabidx, in symbols_collect()
437 if (!is_btf_id(name)) in symbols_collect()
442 * prefix = ^ in symbols_collect()
444 prefix = name + sizeof(BTF_ID) - 1; in symbols_collect()
447 if (!strncmp(prefix, BTF_STRUCT, sizeof(BTF_STRUCT) - 1)) { in symbols_collect()
448 obj->nr_structs++; in symbols_collect()
449 id = add_symbol(&obj->structs, prefix, sizeof(BTF_STRUCT) - 1); in symbols_collect()
451 } else if (!strncmp(prefix, BTF_UNION, sizeof(BTF_UNION) - 1)) { in symbols_collect()
452 obj->nr_unions++; in symbols_collect()
453 id = add_symbol(&obj->unions, prefix, sizeof(BTF_UNION) - 1); in symbols_collect()
455 } else if (!strncmp(prefix, BTF_TYPEDEF, sizeof(BTF_TYPEDEF) - 1)) { in symbols_collect()
456 obj->nr_typedefs++; in symbols_collect()
457 id = add_symbol(&obj->typedefs, prefix, sizeof(BTF_TYPEDEF) - 1); in symbols_collect()
459 } else if (!strncmp(prefix, BTF_FUNC, sizeof(BTF_FUNC) - 1)) { in symbols_collect()
460 obj->nr_funcs++; in symbols_collect()
461 id = add_symbol(&obj->funcs, prefix, sizeof(BTF_FUNC) - 1); in symbols_collect()
463 } else if (!strncmp(prefix, BTF_SET8, sizeof(BTF_SET8) - 1)) { in symbols_collect()
464 id = add_set(obj, prefix, true); in symbols_collect()
468 * that - 1. in symbols_collect()
471 id->cnt = sym.st_size / sizeof(uint64_t) - 1; in symbols_collect()
472 id->is_set8 = true; in symbols_collect()
475 } else if (!strncmp(prefix, BTF_SET, sizeof(BTF_SET) - 1)) { in symbols_collect()
476 id = add_set(obj, prefix, false); in symbols_collect()
480 * that - 1. in symbols_collect()
483 id->cnt = sym.st_size / sizeof(int) - 1; in symbols_collect()
484 id->is_set = true; in symbols_collect()
487 pr_err("FAILED unsupported prefix %s\n", prefix); in symbols_collect()
488 return -1; in symbols_collect()
492 return -ENOMEM; in symbols_collect()
494 if (id->addr_cnt >= ADDR_CNT) { in symbols_collect()
496 id->name); in symbols_collect()
497 return -1; in symbols_collect()
499 id->addr[id->addr_cnt++] = sym.st_value; in symbols_collect()
507 int nr_typedefs = obj->nr_typedefs; in symbols_resolve()
508 int nr_structs = obj->nr_structs; in symbols_resolve()
509 int nr_unions = obj->nr_unions; in symbols_resolve()
510 int nr_funcs = obj->nr_funcs; in symbols_resolve()
516 if (obj->base_btf_path) { in symbols_resolve()
517 base_btf = btf__parse(obj->base_btf_path, NULL); in symbols_resolve()
521 obj->base_btf_path, strerror(-err)); in symbols_resolve()
522 return -1; in symbols_resolve()
526 btf = btf__parse_split(obj->btf ?: obj->path, base_btf); in symbols_resolve()
530 obj->btf ?: obj->path, strerror(-err)); in symbols_resolve()
534 err = -1; in symbols_resolve()
556 root = &obj->funcs; in symbols_resolve()
559 root = &obj->structs; in symbols_resolve()
562 root = &obj->unions; in symbols_resolve()
565 root = &obj->typedefs; in symbols_resolve()
569 str = btf__name_by_offset(btf, type->name_off); in symbols_resolve()
571 pr_err("FAILED: malformed BTF, can't resolve name for ID %d\n", in symbols_resolve()
578 if (id->id) { in symbols_resolve()
579 pr_info("WARN: multiple IDs found for '%s': %d, %d - using %d\n", in symbols_resolve()
580 str, id->id, type_id, id->id); in symbols_resolve()
582 id->id = type_id; in symbols_resolve()
583 (*nr)--; in symbols_resolve()
597 Elf_Data *data = obj->efile.idlist; in id_patch()
598 int *ptr = data->d_buf; in id_patch()
601 /* For set, set8, id->id may be 0 */ in id_patch()
602 if (!id->id && !id->is_set && !id->is_set8) in id_patch()
603 pr_err("WARN: resolve_btfids: unresolved symbol %s\n", id->name); in id_patch()
605 for (i = 0; i < id->addr_cnt; i++) { in id_patch()
606 unsigned long addr = id->addr[i]; in id_patch()
607 unsigned long idx = addr - obj->efile.idlist_addr; in id_patch()
610 idx, id->id, id->name); in id_patch()
612 if (idx >= data->d_size) { in id_patch()
614 idx, data->d_size); in id_patch()
615 return -1; in id_patch()
619 ptr[idx] = id->id; in id_patch()
635 return -1; in __symbols_patch()
646 return *a - *b; in cmp_id()
651 Elf_Data *data = obj->efile.idlist; in sets_patch()
652 int *ptr = data->d_buf; in sets_patch()
655 next = rb_first(&obj->sets); in sets_patch()
663 addr = id->addr[0]; in sets_patch()
664 idx = addr - obj->efile.idlist_addr; in sets_patch()
667 if (id->addr_cnt != 1) { in sets_patch()
669 id->name); in sets_patch()
670 return -1; in sets_patch()
674 base = &ptr[idx] + (id->is_set8 ? 2 : 1); in sets_patch()
678 (idx + 1) * sizeof(int), cnt, id->name); in sets_patch()
680 qsort(base, cnt, id->is_set8 ? sizeof(uint64_t) : sizeof(int), cmp_id); in sets_patch()
691 if (__symbols_patch(obj, &obj->structs) || in symbols_patch()
692 __symbols_patch(obj, &obj->unions) || in symbols_patch()
693 __symbols_patch(obj, &obj->typedefs) || in symbols_patch()
694 __symbols_patch(obj, &obj->funcs) || in symbols_patch()
695 __symbols_patch(obj, &obj->sets)) in symbols_patch()
696 return -1; in symbols_patch()
699 return -1; in symbols_patch()
702 obj->efile.idlist->d_type = ELF_T_WORD; in symbols_patch()
704 elf_flagdata(obj->efile.idlist, ELF_C_SET, ELF_F_DIRTY); in symbols_patch()
706 err = elf_update(obj->efile.elf, ELF_C_WRITE); in symbols_patch()
709 elf_errmsg(-1)); in symbols_patch()
713 err >= 0 ? "ok" : "failed", obj->path); in symbols_patch()
714 return err < 0 ? -1 : 0; in symbols_patch()
726 .idlist_shndx = -1, in main()
727 .symbols_shndx = -1, in main()
744 int err = -1; in main()
760 if (obj.efile.idlist_shndx == -1 || in main()
761 obj.efile.symbols_shndx == -1) { in main()