Lines Matching +full:input +full:- +full:style
1 // SPDX-License-Identifier: GPL-2.0
22 #include "subcmd/run-command.h"
34 if (dso->symsrc_filename) in dso__name()
35 dso_name = dso->symsrc_filename; in dso__name()
37 dso_name = dso->long_name; in dso__name()
42 if (!strncmp(dso_name, "/tmp/perf-", 10)) in dso__name()
55 return -1; in inline_list__append()
57 ilist->symbol = symbol; in inline_list__append()
58 ilist->srcline = srcline; in inline_list__append()
61 list_add_tail(&ilist->list, &node->val); in inline_list__append()
63 list_add(&ilist->list, &node->val); in inline_list__append()
68 /* basename version that takes a const input string */
108 if (base_sym && strcmp(funcname, base_sym->name) == 0) { in new_inline_sym()
114 assert(!base_sym->inlined); in new_inline_sym()
117 inline_sym = symbol__new(base_sym ? base_sym->start : 0, in new_inline_sym()
118 base_sym ? (base_sym->end - base_sym->start) : 0, in new_inline_sym()
119 base_sym ? base_sym->binding : 0, in new_inline_sym()
120 base_sym ? base_sym->type : 0, in new_inline_sym()
123 inline_sym->inlined = 1; in new_inline_sym()
142 const char *input; member
166 return -1; in bfd_error()
198 a2l->syms = syms; in slurp_symtab()
209 if (a2l->found) in find_address_in_section()
220 pc = a2l->addr; in find_address_in_section()
235 a2l->found = bfd_find_nearest_line(abfd, section, a2l->syms, pc - vma, in find_address_in_section()
236 &a2l->filename, &a2l->funcname, in find_address_in_section()
237 &a2l->line); in find_address_in_section()
239 if (a2l->filename && !strlen(a2l->filename)) in find_address_in_section()
240 a2l->filename = NULL; in find_address_in_section()
259 a2l->abfd = abfd; in addr2line_init()
260 a2l->input = strdup(path); in addr2line_init()
261 if (a2l->input == NULL) in addr2line_init()
271 zfree((char **)&a2l->input); in addr2line_init()
280 if (a2l->abfd) in addr2line_cleanup()
281 bfd_close(a2l->abfd); in addr2line_cleanup()
282 zfree((char **)&a2l->input); in addr2line_cleanup()
283 zfree(&a2l->syms); in addr2line_cleanup()
291 struct a2l_data *a2l = dso->a2l; in inline_list__append_dso_a2l()
292 struct symbol *inline_sym = new_inline_sym(dso, sym, a2l->funcname); in inline_list__append_dso_a2l()
295 if (a2l->filename) in inline_list__append_dso_a2l()
296 srcline = srcline_from_fileline(a2l->filename, a2l->line); in inline_list__append_dso_a2l()
307 struct a2l_data *a2l = dso->a2l; in addr2line()
310 dso->a2l = addr2line_init(dso_name); in addr2line()
311 a2l = dso->a2l; in addr2line()
320 a2l->addr = addr; in addr2line()
321 a2l->found = false; in addr2line()
323 bfd_map_over_sections(a2l->abfd, find_address_in_section, a2l); in addr2line()
325 if (!a2l->found) in addr2line()
334 while (bfd_find_inliner_info(a2l->abfd, &a2l->filename, in addr2line()
335 &a2l->funcname, &a2l->line) && in addr2line()
338 if (a2l->filename && !strlen(a2l->filename)) in addr2line()
339 a2l->filename = NULL; in addr2line()
351 *file = a2l->filename ? strdup(a2l->filename) : NULL; in addr2line()
356 *line = a2l->line; in addr2line()
363 struct a2l_data *a2l = dso->a2l; in dso__free_a2l()
370 dso->a2l = NULL; in dso__free_a2l()
398 if (a2l->pid != -1) { in addr2line_subprocess_cleanup()
399 kill(a2l->pid, SIGKILL); in addr2line_subprocess_cleanup()
401 a2l->pid = -1; in addr2line_subprocess_cleanup()
402 close(a2l->in); in addr2line_subprocess_cleanup()
403 close(a2l->out); in addr2line_subprocess_cleanup()
414 "-e", binary_path, in addr2line_subprocess_init()
415 "-a", "-i", "-f", NULL in addr2line_subprocess_init()
425 a2l->pid = -1; in addr2line_subprocess_init()
426 a2l->in = -1; in addr2line_subprocess_init()
427 a2l->out = -1; in addr2line_subprocess_init()
428 a2l->no_stderr = 1; in addr2line_subprocess_init()
430 a2l->argv = argv; in addr2line_subprocess_init()
432 a2l->argv = NULL; /* it's not used after start_command; avoid dangling pointers */ in addr2line_subprocess_init()
453 static enum a2l_style style; in addr2line_configure() local
461 if (write(a2l->in, ",\n", 2) != 2) in addr2line_configure()
464 io__init(&io, a2l->out, buf, sizeof(buf)); in addr2line_configure()
467 style = LLVM; in addr2line_configure()
470 pr_debug("Detected LLVM addr2line style\n"); in addr2line_configure()
472 style = GNU_BINUTILS; in addr2line_configure()
475 pr_debug("Detected binutils addr2line style\n"); in addr2line_configure()
486 pr_debug("Unknown/broken addr2line style\n"); in addr2line_configure()
494 lines--; in addr2line_configure()
499 return style; in addr2line_configure()
503 enum a2l_style style, in read_addr2line_record() argument
513 * -1 ==> error in read_addr2line_record()
514 * 0 ==> sentinel (or other ill-formed) record read in read_addr2line_record()
520 int ret = -1; in read_addr2line_record()
533 * - for the first line an address like 0x1234, in read_addr2line_record()
534 * - the binutils sentinel 0x0000000000000000, in read_addr2line_record()
535 * - the llvm-addr2line the sentinel ',' character, in read_addr2line_record()
536 * - the function name line for an inlined function. in read_addr2line_record()
542 if (style == LLVM && line_len == 2 && line[0] == ',') { in read_addr2line_record()
543 /* Found the llvm-addr2line sentinel character. */ in read_addr2line_record()
546 } else if (style == GNU_BINUTILS && (!first || addr != 0)) { in read_addr2line_record()
600 style == GNU_BINUTILS) { in read_addr2line_record()
641 struct child_process *a2l = dso->a2l; in addr2line()
645 int record_status = -1; in addr2line()
658 dso->a2l = addr2line_subprocess_init(symbol_conf.addr2line_path, dso_name); in addr2line()
659 a2l = dso->a2l; in addr2line()
677 * for llvm-addr2line, so that we can detect when it has finished giving in addr2line()
681 written = len > 0 ? write(a2l->in, buf, len) : -1; in addr2line()
687 io__init(&io, a2l->out, buf, sizeof(buf)); in addr2line()
691 case -1: in addr2line()
701 * binutils, also force a non-zero address as we're no longer in addr2line()
707 case -1: in addr2line()
746 * info. This isn't the first record and force the address to non-zero in addr2line()
773 dso->a2l = NULL; in addr2line()
781 struct child_process *a2l = dso->a2l; in dso__free_a2l()
788 dso->a2l = NULL; in dso__free_a2l()
804 INIT_LIST_HEAD(&node->val); in addr2inlines()
805 node->addr = addr; in addr2inlines()
826 if (!dso->has_srcline) in __get_srcline()
843 dso->a2l_fails = 0; in __get_srcline()
848 if (dso->a2l_fails && ++dso->a2l_fails > A2L_FAIL_LIMIT) { in __get_srcline()
849 dso->has_srcline = 0; in __get_srcline()
855 strndup(sym->name, sym->namelen) : SRCLINE_UNKNOWN; in __get_srcline()
858 if (asprintf(&srcline, "%s+%" PRIu64, show_sym ? sym->name : "", in __get_srcline()
859 ip - sym->start) < 0) in __get_srcline()
861 } else if (asprintf(&srcline, "%s[%" PRIx64 "]", dso->short_name, addr) < 0) in __get_srcline()
872 if (!dso->has_srcline) in get_srcline_split()
882 dso->a2l_fails = 0; in get_srcline_split()
886 if (dso->a2l_fails && ++dso->a2l_fails > A2L_FAIL_LIMIT) { in get_srcline_split()
887 dso->has_srcline = 0; in get_srcline_split()
919 struct rb_node **p = &tree->rb_root.rb_node; in srcline__tree_insert()
930 node->addr = addr; in srcline__tree_insert()
931 node->srcline = srcline; in srcline__tree_insert()
936 if (addr < i->addr) in srcline__tree_insert()
937 p = &(*p)->rb_left; in srcline__tree_insert()
939 p = &(*p)->rb_right; in srcline__tree_insert()
943 rb_link_node(&node->rb_node, parent, p); in srcline__tree_insert()
944 rb_insert_color_cached(&node->rb_node, tree, leftmost); in srcline__tree_insert()
949 struct rb_node *n = tree->rb_root.rb_node; in srcline__tree_find()
955 if (addr < i->addr) in srcline__tree_find()
956 n = n->rb_left; in srcline__tree_find()
957 else if (addr > i->addr) in srcline__tree_find()
958 n = n->rb_right; in srcline__tree_find()
960 return i->srcline; in srcline__tree_find()
973 next = rb_next(&pos->rb_node); in srcline__tree_delete()
974 rb_erase_cached(&pos->rb_node, tree); in srcline__tree_delete()
975 zfree_srcline(&pos->srcline); in srcline__tree_delete()
996 list_for_each_entry_safe(ilist, tmp, &node->val, list) { in inline_node__delete()
997 list_del_init(&ilist->list); in inline_node__delete()
998 zfree_srcline(&ilist->srcline); in inline_node__delete()
1000 if (ilist->symbol && ilist->symbol->inlined) in inline_node__delete()
1001 symbol__delete(ilist->symbol); in inline_node__delete()
1011 struct rb_node **p = &tree->rb_root.rb_node; in inlines__tree_insert()
1013 const u64 addr = inlines->addr; in inlines__tree_insert()
1020 if (addr < i->addr) in inlines__tree_insert()
1021 p = &(*p)->rb_left; in inlines__tree_insert()
1023 p = &(*p)->rb_right; in inlines__tree_insert()
1027 rb_link_node(&inlines->rb_node, parent, p); in inlines__tree_insert()
1028 rb_insert_color_cached(&inlines->rb_node, tree, leftmost); in inlines__tree_insert()
1033 struct rb_node *n = tree->rb_root.rb_node; in inlines__tree_find()
1039 if (addr < i->addr) in inlines__tree_find()
1040 n = n->rb_left; in inlines__tree_find()
1041 else if (addr > i->addr) in inlines__tree_find()
1042 n = n->rb_right; in inlines__tree_find()
1057 next = rb_next(&pos->rb_node); in inlines__tree_delete()
1058 rb_erase_cached(&pos->rb_node, tree); in inlines__tree_delete()