Lines Matching refs:pf
510 static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf) in convert_variable() argument
518 ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops, in convert_variable()
519 &pf->sp_die, pf->tvar); in convert_variable()
522 " Perhaps, it has been optimized out.\n", pf->pvar->var); in convert_variable()
525 else if (ret == 0 && pf->pvar->field) { in convert_variable()
526 ret = convert_variable_fields(vr_die, pf->pvar->var, in convert_variable()
527 pf->pvar->field, &pf->tvar->ref, in convert_variable()
532 ret = convert_variable_type(vr_die, pf->tvar, pf->pvar->type); in convert_variable()
538 static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf) in find_variable() argument
544 if (!is_c_varname(pf->pvar->var)) { in find_variable()
546 pf->tvar->value = strdup(pf->pvar->var); in find_variable()
547 if (pf->tvar->value == NULL) in find_variable()
549 if (pf->pvar->type) { in find_variable()
550 pf->tvar->type = strdup(pf->pvar->type); in find_variable()
551 if (pf->tvar->type == NULL) in find_variable()
554 if (pf->pvar->name) { in find_variable()
555 pf->tvar->name = strdup(pf->pvar->name); in find_variable()
556 if (pf->tvar->name == NULL) in find_variable()
559 pf->tvar->name = NULL; in find_variable()
563 if (pf->pvar->name) in find_variable()
564 pf->tvar->name = strdup(pf->pvar->name); in find_variable()
566 ret = synthesize_perf_probe_arg(pf->pvar, buf, 32); in find_variable()
572 pf->tvar->name = strdup(buf); in find_variable()
574 if (pf->tvar->name == NULL) in find_variable()
577 pr_debug("Searching '%s' variable in context.\n", pf->pvar->var); in find_variable()
579 if (!die_find_variable_at(sc_die, pf->pvar->var, pf->addr, &vr_die)) { in find_variable()
581 if (!die_find_variable_at(&pf->cu_die, pf->pvar->var, in find_variable()
584 pf->pvar->var); in find_variable()
589 ret = convert_variable(&vr_die, pf); in find_variable()
651 static int call_probe_finder(Dwarf_Die *sc_die, struct probe_finder *pf) in call_probe_finder() argument
664 if (!die_find_realfunc(&pf->cu_die, pf->addr, &pf->sp_die)) { in call_probe_finder()
670 memcpy(&pf->sp_die, sc_die, sizeof(Dwarf_Die)); in call_probe_finder()
673 dwarf_attr(&pf->sp_die, DW_AT_frame_base, &fb_attr); in call_probe_finder()
674 ret = dwarf_getlocation_addr(&fb_attr, pf->addr, &pf->fb_ops, &nops, 1); in call_probe_finder()
676 pf->fb_ops = NULL; in call_probe_finder()
678 } else if (nops == 1 && pf->fb_ops[0].atom == DW_OP_call_frame_cfa && in call_probe_finder()
679 pf->cfi != NULL) { in call_probe_finder()
681 if (dwarf_cfi_addrframe(pf->cfi, pf->addr, &frame) != 0 || in call_probe_finder()
682 dwarf_frame_cfa(frame, &pf->fb_ops, &nops) != 0) { in call_probe_finder()
684 (uintmax_t)pf->addr); in call_probe_finder()
691 ret = pf->callback(sc_die, pf); in call_probe_finder()
694 pf->fb_ops = NULL; in call_probe_finder()
741 static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem) in find_best_scope() argument
744 .function = pf->pev->point.function, in find_best_scope()
745 .file = pf->fname, in find_best_scope()
746 .line = pf->lno, in find_best_scope()
752 cu_walk_functions_at(&pf->cu_die, pf->addr, find_best_scope_cb, &fsp); in find_best_scope()
760 struct probe_finder *pf = data; in probe_point_line_walker() local
764 if (lineno != pf->lno || strtailcmp(fname, pf->fname) != 0) in probe_point_line_walker()
767 pf->addr = addr; in probe_point_line_walker()
768 sc_die = find_best_scope(pf, &die_mem); in probe_point_line_walker()
774 ret = call_probe_finder(sc_die, pf); in probe_point_line_walker()
781 static int find_probe_point_by_line(struct probe_finder *pf) in find_probe_point_by_line() argument
783 return die_walk_lines(&pf->cu_die, probe_point_line_walker, pf); in find_probe_point_by_line()
829 struct probe_finder *pf = data; in probe_point_lazy_walker() local
833 if (!intlist__has_entry(pf->lcache, lineno) || in probe_point_lazy_walker()
834 strtailcmp(fname, pf->fname) != 0) in probe_point_lazy_walker()
839 pf->addr = addr; in probe_point_lazy_walker()
840 pf->lno = lineno; in probe_point_lazy_walker()
841 sc_die = find_best_scope(pf, &die_mem); in probe_point_lazy_walker()
847 ret = call_probe_finder(sc_die, pf); in probe_point_lazy_walker()
857 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf) in find_probe_point_lazy() argument
862 if (intlist__empty(pf->lcache)) { in find_probe_point_lazy()
865 comp_dir = cu_get_comp_dir(&pf->cu_die); in find_probe_point_lazy()
866 ret = get_real_path(pf->fname, comp_dir, &fpath); in find_probe_point_lazy()
873 ret = find_lazy_match_lines(pf->lcache, fpath, in find_probe_point_lazy()
874 pf->pev->point.lazy_line); in find_probe_point_lazy()
880 return die_walk_lines(sp_die, probe_point_lazy_walker, pf); in find_probe_point_lazy()
885 struct probe_finder *pf = data; in probe_point_inline_cb() local
886 struct perf_probe_point *pp = &pf->pev->point; in probe_point_inline_cb()
891 ret = find_probe_point_lazy(in_die, pf); in probe_point_inline_cb()
899 pf->addr = addr; in probe_point_inline_cb()
900 pf->addr += pp->offset; in probe_point_inline_cb()
902 (uintmax_t)pf->addr); in probe_point_inline_cb()
904 ret = call_probe_finder(in_die, pf); in probe_point_inline_cb()
920 struct probe_finder *pf = param->data; in probe_point_search_cb() local
921 struct perf_probe_point *pp = &pf->pev->point; in probe_point_search_cb()
932 pf->fname = dwarf_decl_file(sp_die); in probe_point_search_cb()
934 dwarf_decl_line(sp_die, &pf->lno); in probe_point_search_cb()
935 pf->lno += pp->line; in probe_point_search_cb()
936 param->retval = find_probe_point_by_line(pf); in probe_point_search_cb()
939 dwarf_entrypc(sp_die, &pf->addr); in probe_point_search_cb()
942 param->retval = find_probe_point_lazy(sp_die, pf); in probe_point_search_cb()
944 pf->addr += pp->offset; in probe_point_search_cb()
946 param->retval = call_probe_finder(sp_die, pf); in probe_point_search_cb()
951 probe_point_inline_cb, (void *)pf); in probe_point_search_cb()
956 static int find_probe_point_by_func(struct probe_finder *pf) in find_probe_point_by_func() argument
958 struct dwarf_callback_param _param = {.data = (void *)pf, in find_probe_point_by_func()
960 dwarf_getfuncs(&pf->cu_die, probe_point_search_cb, &_param, 0); in find_probe_point_by_func()
998 struct probe_finder *pf) in debuginfo__find_probes() argument
1000 struct perf_probe_point *pp = &pf->pev->point; in debuginfo__find_probes()
1021 pf->cfi = dwarf_getcfi_elf(elf); in debuginfo__find_probes()
1023 pf->cfi = dwarf_getcfi(dbg->dbg); in debuginfo__find_probes()
1028 pf->lcache = intlist__new(NULL); in debuginfo__find_probes()
1029 if (!pf->lcache) in debuginfo__find_probes()
1037 .cu_die = &pf->cu_die, in debuginfo__find_probes()
1038 .sp_die = &pf->sp_die, in debuginfo__find_probes()
1042 .data = pf, in debuginfo__find_probes()
1048 ret = probe_point_search_cb(&pf->sp_die, &probe_param); in debuginfo__find_probes()
1057 diep = dwarf_offdie(dbg->dbg, off + cuhl, &pf->cu_die); in debuginfo__find_probes()
1063 pf->fname = cu_find_realpath(&pf->cu_die, pp->file); in debuginfo__find_probes()
1065 pf->fname = NULL; in debuginfo__find_probes()
1067 if (!pp->file || pf->fname) { in debuginfo__find_probes()
1069 ret = find_probe_point_by_func(pf); in debuginfo__find_probes()
1071 ret = find_probe_point_lazy(&pf->cu_die, pf); in debuginfo__find_probes()
1073 pf->lno = pp->line; in debuginfo__find_probes()
1074 ret = find_probe_point_by_line(pf); in debuginfo__find_probes()
1083 intlist__delete(pf->lcache); in debuginfo__find_probes()
1084 pf->lcache = NULL; in debuginfo__find_probes()
1090 struct probe_finder *pf; member
1101 struct probe_finder *pf = vf->pf; in copy_variables_cb() local
1107 if (convert_variable_location(die_mem, vf->pf->addr, in copy_variables_cb()
1108 vf->pf->fb_ops, &pf->sp_die, in copy_variables_cb()
1120 if (dwarf_haspc(die_mem, vf->pf->addr)) in copy_variables_cb()
1126 static int expand_probe_args(Dwarf_Die *sc_die, struct probe_finder *pf, in expand_probe_args() argument
1132 struct local_vars_finder vf = {.pf = pf, .args = args, in expand_probe_args()
1135 for (i = 0; i < pf->pev->nargs; i++) { in expand_probe_args()
1137 if (strcmp(pf->pev->args[i].var, "$vars") == 0) { in expand_probe_args()
1149 args[n] = pf->pev->args[i]; in expand_probe_args()
1157 static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf) in add_probe_trace_event() argument
1160 container_of(pf, struct trace_event_finder, pf); in add_probe_trace_event()
1174 ret = convert_to_trace_point(&pf->sp_die, tf->mod, pf->addr, in add_probe_trace_event()
1175 pf->pev->point.retprobe, &tev->point); in add_probe_trace_event()
1187 ret = expand_probe_args(sc_die, pf, args); in add_probe_trace_event()
1200 pf->pvar = &args[i]; in add_probe_trace_event()
1201 pf->tvar = &tev->args[i]; in add_probe_trace_event()
1203 ret = find_variable(sc_die, pf); in add_probe_trace_event()
1219 .pf = {.pev = pev, .callback = add_probe_trace_event}, in debuginfo__find_trace_events()
1231 ret = debuginfo__find_probes(dbg, &tf.pf); in debuginfo__find_trace_events()
1255 ret = convert_variable_location(die_mem, af->pf.addr, in collect_variables_cb()
1256 af->pf.fb_ops, &af->pf.sp_die, in collect_variables_cb()
1266 if (af->child && dwarf_haspc(die_mem, af->pf.addr)) in collect_variables_cb()
1273 static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf) in add_available_vars() argument
1276 container_of(pf, struct available_var_finder, pf); in add_available_vars()
1289 ret = convert_to_trace_point(&pf->sp_die, af->mod, pf->addr, in add_available_vars()
1290 pf->pev->point.retprobe, &vl->point); in add_available_vars()
1309 die_find_child(&pf->cu_die, collect_variables_cb, (void *)af, &die_mem); in add_available_vars()
1331 .pf = {.pev = pev, .callback = add_available_vars}, in debuginfo__find_available_vars_at()
1344 ret = debuginfo__find_probes(dbg, &af.pf); in debuginfo__find_available_vars_at()