Lines Matching full:pf

72 				     const struct probe_finder *pf,  in convert_variable_location()  argument
182 regs = get_dwarf_regstr(regn, pf->e_machine, pf->e_flags); in convert_variable_location()
458 static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf) in convert_variable() argument
466 ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops, in convert_variable()
467 &pf->sp_die, pf, pf->tvar); in convert_variable()
468 if (ret == -ENOENT && pf->skip_empty_arg) in convert_variable()
472 print_var_not_found(pf->pvar->var); in convert_variable()
475 else if (ret == 0 && pf->pvar->field) { in convert_variable()
476 ret = convert_variable_fields(vr_die, pf->pvar->var, in convert_variable()
477 pf->pvar->field, &pf->tvar->ref, in convert_variable()
478 &die_mem, pf->pvar->user_access); in convert_variable()
482 ret = convert_variable_type(vr_die, pf->tvar, pf->pvar->type, in convert_variable()
483 pf->pvar->user_access); in convert_variable()
489 static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf) in find_variable() argument
496 if (!is_c_varname(pf->pvar->var)) in find_variable()
497 return copy_to_probe_trace_arg(pf->tvar, pf->pvar); in find_variable()
499 if (pf->pvar->name) in find_variable()
500 pf->tvar->name = strdup(pf->pvar->name); in find_variable()
502 buf = synthesize_perf_probe_arg(pf->pvar); in find_variable()
508 pf->tvar->name = buf; in find_variable()
510 if (pf->tvar->name == NULL) in find_variable()
513 pr_debug("Searching '%s' variable in context.\n", pf->pvar->var); in find_variable()
515 if (!die_find_variable_at(sc_die, pf->pvar->var, pf->addr, &vr_die)) { in find_variable()
517 if (!die_find_variable_at(&pf->cu_die, pf->pvar->var, in find_variable()
519 if (pf->skip_empty_arg) in find_variable()
522 pf->pvar->var); in find_variable()
527 ret = convert_variable(&vr_die, pf); in find_variable()
585 static int call_probe_finder(Dwarf_Die *sc_die, struct probe_finder *pf) in call_probe_finder() argument
599 if (!die_find_realfunc(&pf->cu_die, pf->addr, &pf->sp_die)) { in call_probe_finder()
600 if (die_find_tailfunc(&pf->cu_die, pf->addr, &pf->sp_die)) { in call_probe_finder()
602 dwarf_diename(&pf->sp_die)); in call_probe_finder()
611 memcpy(&pf->sp_die, sc_die, sizeof(Dwarf_Die)); in call_probe_finder()
614 dwarf_attr(&pf->sp_die, DW_AT_frame_base, &fb_attr); in call_probe_finder()
615 ret = dwarf_getlocation_addr(&fb_attr, pf->addr, &pf->fb_ops, &nops, 1); in call_probe_finder()
617 pf->fb_ops = NULL; in call_probe_finder()
618 } else if (nops == 1 && pf->fb_ops[0].atom == DW_OP_call_frame_cfa && in call_probe_finder()
619 (pf->cfi_eh != NULL || pf->cfi_dbg != NULL)) { in call_probe_finder()
620 if ((dwarf_cfi_addrframe(pf->cfi_eh, pf->addr, &frame) != 0 && in call_probe_finder()
621 (dwarf_cfi_addrframe(pf->cfi_dbg, pf->addr, &frame) != 0)) || in call_probe_finder()
622 dwarf_frame_cfa(frame, &pf->fb_ops, &nops) != 0) { in call_probe_finder()
624 (uintmax_t)pf->addr); in call_probe_finder()
631 ret = pf->callback(sc_die, pf); in call_probe_finder()
633 /* Since *pf->fb_ops can be a part of frame. we should free it here. */ in call_probe_finder()
635 pf->fb_ops = NULL; in call_probe_finder()
692 static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem) in find_best_scope() argument
695 .function = pf->pev->point.function, in find_best_scope()
696 .file = pf->fname, in find_best_scope()
697 .line = pf->lno, in find_best_scope()
704 ret = cu_walk_functions_at(&pf->cu_die, pf->addr, find_best_scope_cb, in find_best_scope()
707 cu_walk_functions_at(&pf->cu_die, pf->addr, in find_best_scope()
713 static int verify_representive_line(struct probe_finder *pf, const char *fname, in verify_representive_line() argument
721 if (cu_find_lineinfo(&pf->cu_die, addr, &__fname, &__lineno) < 0) in verify_representive_line()
730 if (pf->pev->point.function) { in verify_representive_line()
732 pf->addr = addr; in verify_representive_line()
733 if (find_best_scope(pf, &die_mem) in verify_representive_line()
734 && die_match_name(&die_mem, pf->pev->point.function) in verify_representive_line()
749 struct probe_finder *pf = data; in probe_point_line_walker() local
753 if (lineno != pf->lno || strtailcmp(fname, pf->fname) != 0) in probe_point_line_walker()
756 if (verify_representive_line(pf, fname, lineno, addr)) in probe_point_line_walker()
759 pf->addr = addr; in probe_point_line_walker()
760 sc_die = find_best_scope(pf, &die_mem); in probe_point_line_walker()
766 ret = call_probe_finder(sc_die, pf); in probe_point_line_walker()
773 static int find_probe_point_by_line(struct probe_finder *pf) in find_probe_point_by_line() argument
775 return die_walk_lines(&pf->cu_die, probe_point_line_walker, pf); in find_probe_point_by_line()
821 struct probe_finder *pf = data; in probe_point_lazy_walker() local
825 if (!intlist__has_entry(pf->lcache, lineno) || in probe_point_lazy_walker()
826 strtailcmp(fname, pf->fname) != 0) in probe_point_lazy_walker()
831 pf->addr = addr; in probe_point_lazy_walker()
832 pf->lno = lineno; in probe_point_lazy_walker()
833 sc_die = find_best_scope(pf, &die_mem); in probe_point_lazy_walker()
839 ret = call_probe_finder(sc_die, pf); in probe_point_lazy_walker()
849 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf) in find_probe_point_lazy() argument
855 if (intlist__empty(pf->lcache)) { in find_probe_point_lazy()
858 comp_dir = cu_get_comp_dir(&pf->cu_die); in find_probe_point_lazy()
859 if (pf->dbg->build_id) { in find_probe_point_lazy()
862 build_id__init(&bid, pf->dbg->build_id, BUILD_ID_SIZE); in find_probe_point_lazy()
865 ret = find_source_path(pf->fname, sbuild_id, comp_dir, &fpath); in find_probe_point_lazy()
872 ret = find_lazy_match_lines(pf->lcache, fpath, in find_probe_point_lazy()
873 pf->pev->point.lazy_line); in find_probe_point_lazy()
879 return die_walk_lines(sp_die, probe_point_lazy_walker, pf); in find_probe_point_lazy()
882 static void skip_prologue(Dwarf_Die *sp_die, struct probe_finder *pf) in skip_prologue() argument
884 struct perf_probe_point *pp = &pf->pev->point; in skip_prologue()
887 if (!pf->pev->uprobes) in skip_prologue()
891 if (die_is_optimized_target(&pf->cu_die)) in skip_prologue()
895 if (!pf->addr) in skip_prologue()
904 if (!perf_probe_with_var(pf->pev)) in skip_prologue()
909 pf->addr); in skip_prologue()
911 die_skip_prologue(sp_die, &pf->cu_die, &pf->addr); in skip_prologue()
916 struct probe_finder *pf = data; in probe_point_inline_cb() local
917 struct perf_probe_point *pp = &pf->pev->point; in probe_point_inline_cb()
922 ret = find_probe_point_lazy(in_die, pf); in probe_point_inline_cb()
935 pf->addr = addr; in probe_point_inline_cb()
936 pf->addr += pp->offset; in probe_point_inline_cb()
938 (uintmax_t)pf->addr); in probe_point_inline_cb()
940 ret = call_probe_finder(in_die, pf); in probe_point_inline_cb()
956 struct probe_finder *pf = param->data; in probe_point_search_cb() local
957 struct perf_probe_point *pp = &pf->pev->point; in probe_point_search_cb()
976 pf->fname = fname; in probe_point_search_cb()
977 pf->abstrace_dieoffset = dwarf_dieoffset(sp_die); in probe_point_search_cb()
979 dwarf_decl_line(sp_die, &pf->lno); in probe_point_search_cb()
980 pf->lno += pp->line; in probe_point_search_cb()
981 param->retval = find_probe_point_by_line(pf); in probe_point_search_cb()
984 die_entrypc(sp_die, &pf->addr); in probe_point_search_cb()
986 if (pf->addr == 0) { in probe_point_search_cb()
992 param->retval = find_probe_point_lazy(sp_die, pf); in probe_point_search_cb()
994 skip_prologue(sp_die, pf); in probe_point_search_cb()
995 pf->addr += pp->offset; in probe_point_search_cb()
997 param->retval = call_probe_finder(sp_die, pf); in probe_point_search_cb()
1002 probe_point_inline_cb, (void *)pf); in probe_point_search_cb()
1017 static int find_probe_point_by_func(struct probe_finder *pf) in find_probe_point_by_func() argument
1019 struct dwarf_callback_param _param = {.data = (void *)pf, in find_probe_point_by_func()
1021 dwarf_getfuncs(&pf->cu_die, probe_point_search_cb, &_param, 0); in find_probe_point_by_func()
1061 struct probe_finder *pf) in debuginfo__find_probe_location() argument
1063 struct perf_probe_point *pp = &pf->pev->point; in debuginfo__find_probe_location()
1070 pf->lcache = intlist__new(NULL); in debuginfo__find_probe_location()
1071 if (!pf->lcache) in debuginfo__find_probe_location()
1079 .cu_die = &pf->cu_die, in debuginfo__find_probe_location()
1080 .sp_die = &pf->sp_die, in debuginfo__find_probe_location()
1084 .data = pf, in debuginfo__find_probe_location()
1090 ret = probe_point_search_cb(&pf->sp_die, &probe_param); in debuginfo__find_probe_location()
1099 diep = dwarf_offdie(dbg->dbg, off + cuhl, &pf->cu_die); in debuginfo__find_probe_location()
1107 pf->fname = cu_find_realpath(&pf->cu_die, pp->file); in debuginfo__find_probe_location()
1109 pf->fname = NULL; in debuginfo__find_probe_location()
1111 if (!pp->file || pf->fname) { in debuginfo__find_probe_location()
1113 ret = find_probe_point_by_func(pf); in debuginfo__find_probe_location()
1115 ret = find_probe_point_lazy(&pf->cu_die, pf); in debuginfo__find_probe_location()
1117 pf->lno = pp->line; in debuginfo__find_probe_location()
1118 ret = find_probe_point_by_line(pf); in debuginfo__find_probe_location()
1127 intlist__delete(pf->lcache); in debuginfo__find_probe_location()
1128 pf->lcache = NULL; in debuginfo__find_probe_location()
1135 struct probe_finder *pf) in debuginfo__find_probes() argument
1141 if (pf->cfi_eh || pf->cfi_dbg) in debuginfo__find_probes()
1142 return debuginfo__find_probe_location(dbg, pf); in debuginfo__find_probes()
1152 pf->e_machine = ehdr.e_machine; in debuginfo__find_probes()
1153 pf->e_flags = ehdr.e_flags; in debuginfo__find_probes()
1160 pf->cfi_eh = dwarf_getcfi_elf(elf); in debuginfo__find_probes()
1162 pf->cfi_dbg = dwarf_getcfi(dbg->dbg); in debuginfo__find_probes()
1165 ret = debuginfo__find_probe_location(dbg, pf); in debuginfo__find_probes()
1170 struct probe_finder *pf; member
1182 struct probe_finder *pf = vf->pf; in copy_variables_cb() local
1190 if (convert_variable_location(die_mem, vf->pf->addr, in copy_variables_cb()
1191 vf->pf->fb_ops, &pf->sp_die, in copy_variables_cb()
1192 pf, /*tvar=*/NULL) == 0) { in copy_variables_cb()
1203 if (dwarf_haspc(die_mem, vf->pf->addr)) { in copy_variables_cb()
1211 if (pf->abstrace_dieoffset != dwarf_dieoffset(&var_die)) in copy_variables_cb()
1221 static int expand_probe_args(Dwarf_Die *sc_die, struct probe_finder *pf, in expand_probe_args() argument
1227 struct local_vars_finder vf = {.pf = pf, .args = args, .vars = false, in expand_probe_args()
1230 for (i = 0; i < pf->pev->nargs; i++) { in expand_probe_args()
1232 if (strcmp(pf->pev->args[i].var, PROBE_ARG_VARS) == 0) in expand_probe_args()
1234 else if (strcmp(pf->pev->args[i].var, PROBE_ARG_PARAMS) != 0) { in expand_probe_args()
1236 args[n] = pf->pev->args[i]; in expand_probe_args()
1240 pr_debug("Expanding %s into:", pf->pev->args[i].var); in expand_probe_args()
1258 if (tf->pf.addr == tf->tevs[i].point.address) in trace_event_finder_overlap()
1265 static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf) in add_probe_trace_event() argument
1268 container_of(pf, struct trace_event_finder, pf); in add_probe_trace_event()
1269 struct perf_probe_point *pp = &pf->pev->point; in add_probe_trace_event()
1291 ret = convert_to_trace_point(&pf->sp_die, tf->mod, pf->addr, in add_probe_trace_event()
1302 tev->lang = dwarf_srclang(dwarf_diecu(sc_die, &pf->cu_die, NULL, NULL)); in add_probe_trace_event()
1314 ret = expand_probe_args(sc_die, pf, args); in add_probe_trace_event()
1327 pf->pvar = &args[i]; in add_probe_trace_event()
1328 pf->tvar = &tev->args[i]; in add_probe_trace_event()
1330 ret = find_variable(sc_die, pf); in add_probe_trace_event()
1391 .pf = {.pev = pev, .dbg = dbg, .callback = add_probe_trace_event}, in debuginfo__find_trace_events()
1404 tf.pf.skip_empty_arg = true; in debuginfo__find_trace_events()
1406 ret = debuginfo__find_probes(dbg, &tf.pf); in debuginfo__find_trace_events()
1407 if (ret >= 0 && tf.pf.skip_empty_arg) in debuginfo__find_trace_events()
1410 dwarf_cfi_end(tf.pf.cfi_eh); in debuginfo__find_trace_events()
1435 ret = convert_variable_location(die_mem, af->pf.addr, in collect_variables_cb()
1436 af->pf.fb_ops, &af->pf.sp_die, in collect_variables_cb()
1437 &af->pf, /*tvar=*/NULL); in collect_variables_cb()
1461 ret2 = die_get_var_range(&af->pf.sp_die, in collect_variables_cb()
1474 if (af->child && dwarf_haspc(die_mem, af->pf.addr)) in collect_variables_cb()
1489 if (af->pf.addr == af->vls[i].point.address) in available_var_finder_overlap()
1497 static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf) in add_available_vars() argument
1500 container_of(pf, struct available_var_finder, pf); in add_available_vars()
1501 struct perf_probe_point *pp = &pf->pev->point; in add_available_vars()
1522 ret = convert_to_trace_point(&pf->sp_die, af->mod, pf->addr, in add_available_vars()
1542 die_find_child(&pf->cu_die, collect_variables_cb, (void *)af, &die_mem); in add_available_vars()
1563 .pf = {.pev = pev, .dbg = dbg, .callback = add_available_vars}, in debuginfo__find_available_vars_at()
1576 ret = debuginfo__find_probes(dbg, &af.pf); in debuginfo__find_available_vars_at()