Lines Matching refs:a2l

163 static int slurp_symtab(bfd *abfd, struct a2l_data *a2l)  in slurp_symtab()  argument
192 a2l->syms = syms; in slurp_symtab()
200 struct a2l_data *a2l = data; in find_address_in_section() local
203 if (a2l->found) in find_address_in_section()
214 pc = a2l->addr; in find_address_in_section()
229 a2l->found = bfd_find_nearest_line(abfd, section, a2l->syms, pc - vma, in find_address_in_section()
230 &a2l->filename, &a2l->funcname, in find_address_in_section()
231 &a2l->line); in find_address_in_section()
233 if (a2l->filename && !strlen(a2l->filename)) in find_address_in_section()
234 a2l->filename = NULL; in find_address_in_section()
240 struct a2l_data *a2l = NULL; in addr2line_init() local
249 a2l = zalloc(sizeof(*a2l)); in addr2line_init()
250 if (a2l == NULL) in addr2line_init()
253 a2l->abfd = abfd; in addr2line_init()
254 a2l->input = strdup(path); in addr2line_init()
255 if (a2l->input == NULL) in addr2line_init()
258 if (slurp_symtab(abfd, a2l)) in addr2line_init()
261 return a2l; in addr2line_init()
264 if (a2l) { in addr2line_init()
265 zfree((char **)&a2l->input); in addr2line_init()
266 free(a2l); in addr2line_init()
272 static void addr2line_cleanup(struct a2l_data *a2l) in addr2line_cleanup() argument
274 if (a2l->abfd) in addr2line_cleanup()
275 bfd_close(a2l->abfd); in addr2line_cleanup()
276 zfree((char **)&a2l->input); in addr2line_cleanup()
277 zfree(&a2l->syms); in addr2line_cleanup()
278 free(a2l); in addr2line_cleanup()
285 struct a2l_data *a2l = dso->a2l; in inline_list__append_dso_a2l() local
286 struct symbol *inline_sym = new_inline_sym(dso, sym, a2l->funcname); in inline_list__append_dso_a2l()
289 if (a2l->filename) in inline_list__append_dso_a2l()
290 srcline = srcline_from_fileline(a2l->filename, a2l->line); in inline_list__append_dso_a2l()
301 struct a2l_data *a2l = dso->a2l; in addr2line() local
303 if (!a2l) { in addr2line()
304 dso->a2l = addr2line_init(dso_name); in addr2line()
305 a2l = dso->a2l; in addr2line()
308 if (a2l == NULL) { in addr2line()
314 a2l->addr = addr; in addr2line()
315 a2l->found = false; in addr2line()
317 bfd_map_over_sections(a2l->abfd, find_address_in_section, a2l); in addr2line()
319 if (!a2l->found) in addr2line()
328 while (bfd_find_inliner_info(a2l->abfd, &a2l->filename, in addr2line()
329 &a2l->funcname, &a2l->line) && in addr2line()
332 if (a2l->filename && !strlen(a2l->filename)) in addr2line()
333 a2l->filename = NULL; in addr2line()
345 *file = a2l->filename ? strdup(a2l->filename) : NULL; in addr2line()
350 *line = a2l->line; in addr2line()
357 struct a2l_data *a2l = dso->a2l; in dso__free_a2l() local
359 if (!a2l) in dso__free_a2l()
362 addr2line_cleanup(a2l); in dso__free_a2l()
364 dso->a2l = NULL; in dso__free_a2l()
396 static void addr2line_subprocess_cleanup(struct a2l_subprocess *a2l) in addr2line_subprocess_cleanup() argument
398 if (a2l->addr2line.pid != -1) { in addr2line_subprocess_cleanup()
399 kill(a2l->addr2line.pid, SIGKILL); in addr2line_subprocess_cleanup()
400 finish_command(&a2l->addr2line); /* ignore result, we don't care */ in addr2line_subprocess_cleanup()
401 a2l->addr2line.pid = -1; in addr2line_subprocess_cleanup()
404 if (a2l->to_child != NULL) { in addr2line_subprocess_cleanup()
405 fclose(a2l->to_child); in addr2line_subprocess_cleanup()
406 a2l->to_child = NULL; in addr2line_subprocess_cleanup()
409 if (a2l->from_child != NULL) { in addr2line_subprocess_cleanup()
410 fclose(a2l->from_child); in addr2line_subprocess_cleanup()
411 a2l->from_child = NULL; in addr2line_subprocess_cleanup()
414 free(a2l); in addr2line_subprocess_cleanup()
420 struct a2l_subprocess *a2l = zalloc(sizeof(*a2l)); in addr2line_subprocess_init() local
423 if (a2l == NULL) in addr2line_subprocess_init()
426 a2l->to_child = NULL; in addr2line_subprocess_init()
427 a2l->from_child = NULL; in addr2line_subprocess_init()
429 a2l->addr2line.pid = -1; in addr2line_subprocess_init()
430 a2l->addr2line.in = -1; in addr2line_subprocess_init()
431 a2l->addr2line.out = -1; in addr2line_subprocess_init()
432 a2l->addr2line.no_stderr = 1; in addr2line_subprocess_init()
434 a2l->addr2line.argv = argv; in addr2line_subprocess_init()
435 start_command_status = start_command(&a2l->addr2line); in addr2line_subprocess_init()
436 a2l->addr2line.argv = NULL; /* it's not used after start_command; avoid dangling pointers */ in addr2line_subprocess_init()
445 a2l->to_child = fdopen(a2l->addr2line.in, "w"); in addr2line_subprocess_init()
446 if (a2l->to_child == NULL) { in addr2line_subprocess_init()
451 a2l->from_child = fdopen(a2l->addr2line.out, "r"); in addr2line_subprocess_init()
452 if (a2l->from_child == NULL) { in addr2line_subprocess_init()
457 return a2l; in addr2line_subprocess_init()
460 if (a2l) in addr2line_subprocess_init()
461 addr2line_subprocess_cleanup(a2l); in addr2line_subprocess_init()
466 static int read_addr2line_record(struct a2l_subprocess *a2l, in read_addr2line_record() argument
491 if (getline(&line, &line_len, a2l->from_child) < 0 || !line_len) in read_addr2line_record()
500 if (getline(&line, &line_len, a2l->from_child) < 0 || !line_len) in read_addr2line_record()
544 struct a2l_subprocess *a2l = dso->a2l; in addr2line() local
552 if (!a2l) { in addr2line()
553 dso->a2l = addr2line_subprocess_init(dso_name); in addr2line()
554 a2l = dso->a2l; in addr2line()
557 if (a2l == NULL) { in addr2line()
572 if (fprintf(a2l->to_child, "%016"PRIx64"\n,\n", addr) < 0 || fflush(a2l->to_child) != 0) { in addr2line()
577 switch (read_addr2line_record(a2l, &record_function, &record_filename, &record_line_nr)) { in addr2line()
586 switch (read_addr2line_record(a2l, NULL, NULL, NULL)) { in addr2line()
621 while ((record_status = read_addr2line_record(a2l, in addr2line()
645 struct a2l_subprocess *a2l = dso->a2l; in dso__free_a2l() local
647 if (!a2l) in dso__free_a2l()
650 addr2line_subprocess_cleanup(a2l); in dso__free_a2l()
652 dso->a2l = NULL; in dso__free_a2l()