Lines Matching defs:pf

445 static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf)
453 ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops,
454 &pf->sp_die, pf->machine, pf->tvar);
455 if (ret == -ENOENT && pf->skip_empty_arg)
459 print_var_not_found(pf->pvar->var);
462 else if (ret == 0 && pf->pvar->field) {
463 ret = convert_variable_fields(vr_die, pf->pvar->var,
464 pf->pvar->field, &pf->tvar->ref,
465 &die_mem, pf->pvar->user_access);
469 ret = convert_variable_type(vr_die, pf->tvar, pf->pvar->type,
470 pf->pvar->user_access);
476 static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
483 if (!is_c_varname(pf->pvar->var))
484 return copy_to_probe_trace_arg(pf->tvar, pf->pvar);
486 if (pf->pvar->name)
487 pf->tvar->name = strdup(pf->pvar->name);
489 buf = synthesize_perf_probe_arg(pf->pvar);
495 pf->tvar->name = buf;
497 if (pf->tvar->name == NULL)
500 pr_debug("Searching '%s' variable in context.\n", pf->pvar->var);
502 if (!die_find_variable_at(sc_die, pf->pvar->var, pf->addr, &vr_die)) {
504 if (!die_find_variable_at(&pf->cu_die, pf->pvar->var,
506 if (pf->skip_empty_arg)
509 pf->pvar->var);
514 ret = convert_variable(&vr_die, pf);
572 static int call_probe_finder(Dwarf_Die *sc_die, struct probe_finder *pf)
586 if (!die_find_realfunc(&pf->cu_die, pf->addr, &pf->sp_die)) {
587 if (die_find_tailfunc(&pf->cu_die, pf->addr, &pf->sp_die)) {
589 dwarf_diename(&pf->sp_die));
598 memcpy(&pf->sp_die, sc_die, sizeof(Dwarf_Die));
601 dwarf_attr(&pf->sp_die, DW_AT_frame_base, &fb_attr);
602 ret = dwarf_getlocation_addr(&fb_attr, pf->addr, &pf->fb_ops, &nops, 1);
604 pf->fb_ops = NULL;
606 } else if (nops == 1 && pf->fb_ops[0].atom == DW_OP_call_frame_cfa &&
607 (pf->cfi_eh != NULL || pf->cfi_dbg != NULL)) {
608 if ((dwarf_cfi_addrframe(pf->cfi_eh, pf->addr, &frame) != 0 &&
609 (dwarf_cfi_addrframe(pf->cfi_dbg, pf->addr, &frame) != 0)) ||
610 dwarf_frame_cfa(frame, &pf->fb_ops, &nops) != 0) {
612 (uintmax_t)pf->addr);
620 ret = pf->callback(sc_die, pf);
622 /* Since *pf->fb_ops can be a part of frame. we should free it here. */
624 pf->fb_ops = NULL;
681 static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem)
684 .function = pf->pev->point.function,
685 .file = pf->fname,
686 .line = pf->lno,
693 ret = cu_walk_functions_at(&pf->cu_die, pf->addr, find_best_scope_cb,
696 cu_walk_functions_at(&pf->cu_die, pf->addr,
702 static int verify_representive_line(struct probe_finder *pf, const char *fname,
710 if (cu_find_lineinfo(&pf->cu_die, addr, &__fname, &__lineno) < 0)
719 if (pf->pev->point.function) {
721 pf->addr = addr;
722 if (find_best_scope(pf, &die_mem)
723 && die_match_name(&die_mem, pf->pev->point.function)
738 struct probe_finder *pf = data;
742 if (lineno != pf->lno || strtailcmp(fname, pf->fname) != 0)
745 if (verify_representive_line(pf, fname, lineno, addr))
748 pf->addr = addr;
749 sc_die = find_best_scope(pf, &die_mem);
755 ret = call_probe_finder(sc_die, pf);
762 static int find_probe_point_by_line(struct probe_finder *pf)
764 return die_walk_lines(&pf->cu_die, probe_point_line_walker, pf);
810 struct probe_finder *pf = data;
814 if (!intlist__has_entry(pf->lcache, lineno) ||
815 strtailcmp(fname, pf->fname) != 0)
820 pf->addr = addr;
821 pf->lno = lineno;
822 sc_die = find_best_scope(pf, &die_mem);
828 ret = call_probe_finder(sc_die, pf);
838 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
845 if (intlist__empty(pf->lcache)) {
848 comp_dir = cu_get_comp_dir(&pf->cu_die);
849 if (pf->dbg->build_id) {
850 build_id__init(&bid, pf->dbg->build_id, BUILD_ID_SIZE);
853 ret = find_source_path(pf->fname, sbuild_id, comp_dir, &fpath);
860 ret = find_lazy_match_lines(pf->lcache, fpath,
861 pf->pev->point.lazy_line);
867 return die_walk_lines(sp_die, probe_point_lazy_walker, pf);
870 static void skip_prologue(Dwarf_Die *sp_die, struct probe_finder *pf)
872 struct perf_probe_point *pp = &pf->pev->point;
875 if (!pf->pev->uprobes)
879 if (die_is_optimized_target(&pf->cu_die))
883 if (!pf->addr)
892 if (!perf_probe_with_var(pf->pev))
897 pf->addr);
899 die_skip_prologue(sp_die, &pf->cu_die, &pf->addr);
904 struct probe_finder *pf = data;
905 struct perf_probe_point *pp = &pf->pev->point;
910 ret = find_probe_point_lazy(in_die, pf);
923 pf->addr = addr;
924 pf->addr += pp->offset;
926 (uintmax_t)pf->addr);
928 ret = call_probe_finder(in_die, pf);
944 struct probe_finder *pf = param->data;
945 struct perf_probe_point *pp = &pf->pev->point;
964 pf->fname = fname;
966 dwarf_decl_line(sp_die, &pf->lno);
967 pf->lno += pp->line;
968 param->retval = find_probe_point_by_line(pf);
971 die_entrypc(sp_die, &pf->addr);
973 if (pf->addr == 0) {
979 param->retval = find_probe_point_lazy(sp_die, pf);
981 skip_prologue(sp_die, pf);
982 pf->addr += pp->offset;
984 param->retval = call_probe_finder(sp_die, pf);
989 probe_point_inline_cb, (void *)pf);
1004 static int find_probe_point_by_func(struct probe_finder *pf)
1006 struct dwarf_callback_param _param = {.data = (void *)pf,
1008 dwarf_getfuncs(&pf->cu_die, probe_point_search_cb, &_param, 0);
1048 struct probe_finder *pf)
1050 struct perf_probe_point *pp = &pf->pev->point;
1057 pf->lcache = intlist__new(NULL);
1058 if (!pf->lcache)
1066 .cu_die = &pf->cu_die,
1067 .sp_die = &pf->sp_die,
1071 .data = pf,
1077 ret = probe_point_search_cb(&pf->sp_die, &probe_param);
1086 diep = dwarf_offdie(dbg->dbg, off + cuhl, &pf->cu_die);
1094 pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
1096 pf->fname = NULL;
1098 if (!pp->file || pf->fname) {
1100 ret = find_probe_point_by_func(pf);
1102 ret = find_probe_point_lazy(&pf->cu_die, pf);
1104 pf->lno = pp->line;
1105 ret = find_probe_point_by_line(pf);
1114 intlist__delete(pf->lcache);
1115 pf->lcache = NULL;
1122 struct probe_finder *pf)
1128 if (pf->cfi_eh || pf->cfi_dbg)
1129 return debuginfo__find_probe_location(dbg, pf);
1139 pf->machine = ehdr.e_machine;
1147 pf->cfi_eh = dwarf_getcfi_elf(elf);
1149 pf->cfi_dbg = dwarf_getcfi(dbg->dbg);
1153 ret = debuginfo__find_probe_location(dbg, pf);
1158 struct probe_finder *pf;
1170 struct probe_finder *pf = vf->pf;
1176 if (convert_variable_location(die_mem, vf->pf->addr,
1177 vf->pf->fb_ops, &pf->sp_die,
1178 pf->machine, NULL) == 0) {
1189 if (dwarf_haspc(die_mem, vf->pf->addr))
1195 static int expand_probe_args(Dwarf_Die *sc_die, struct probe_finder *pf,
1201 struct local_vars_finder vf = {.pf = pf, .args = args, .vars = false,
1204 for (i = 0; i < pf->pev->nargs; i++) {
1206 if (strcmp(pf->pev->args[i].var, PROBE_ARG_VARS) == 0)
1208 else if (strcmp(pf->pev->args[i].var, PROBE_ARG_PARAMS) != 0) {
1210 args[n] = pf->pev->args[i];
1214 pr_debug("Expanding %s into:", pf->pev->args[i].var);
1232 if (tf->pf.addr == tf->tevs[i].point.address)
1239 static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
1242 container_of(pf, struct trace_event_finder, pf);
1243 struct perf_probe_point *pp = &pf->pev->point;
1265 ret = convert_to_trace_point(&pf->sp_die, tf->mod, pf->addr,
1286 ret = expand_probe_args(sc_die, pf, args);
1299 pf->pvar = &args[i];
1300 pf->tvar = &tev->args[i];
1302 ret = find_variable(sc_die, pf);
1363 .pf = {.pev = pev, .dbg = dbg, .callback = add_probe_trace_event},
1376 tf.pf.skip_empty_arg = true;
1378 ret = debuginfo__find_probes(dbg, &tf.pf);
1379 if (ret >= 0 && tf.pf.skip_empty_arg)
1405 ret = convert_variable_location(die_mem, af->pf.addr,
1406 af->pf.fb_ops, &af->pf.sp_die,
1407 af->pf.machine, NULL);
1431 ret2 = die_get_var_range(&af->pf.sp_die,
1444 if (af->child && dwarf_haspc(die_mem, af->pf.addr))
1459 if (af->pf.addr == af->vls[i].point.address)
1467 static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf)
1470 container_of(pf, struct available_var_finder, pf);
1471 struct perf_probe_point *pp = &pf->pev->point;
1492 ret = convert_to_trace_point(&pf->sp_die, af->mod, pf->addr,
1512 die_find_child(&pf->cu_die, collect_variables_cb, (void *)af, &die_mem);
1533 .pf = {.pev = pev, .dbg = dbg, .callback = add_available_vars},
1546 ret = debuginfo__find_probes(dbg, &af.pf);