Home | History | Annotate | Download | only in util

Lines Matching refs:pf

1112 static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf)
1120 ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops,
1121 pf->tvar);
1124 " Perhaps, it has been optimized out.\n", pf->pvar->var);
1127 else if (pf->pvar->field) {
1128 ret = convert_variable_fields(vr_die, pf->pvar->var,
1129 pf->pvar->field, &pf->tvar->ref,
1134 ret = convert_variable_type(vr_die, pf->tvar, pf->pvar->type);
1140 static int find_variable(Dwarf_Die *sp_die, struct probe_finder *pf)
1146 if (!is_c_varname(pf->pvar->var)) {
1148 pf->tvar->value = strdup(pf->pvar->var);
1149 if (pf->tvar->value == NULL)
1151 if (pf->pvar->type) {
1152 pf->tvar->type = strdup(pf->pvar->type);
1153 if (pf->tvar->type == NULL)
1156 if (pf->pvar->name) {
1157 pf->tvar->name = strdup(pf->pvar->name);
1158 if (pf->tvar->name == NULL)
1161 pf->tvar->name = NULL;
1165 if (pf->pvar->name)
1166 pf->tvar->name = strdup(pf->pvar->name);
1168 ret = synthesize_perf_probe_arg(pf->pvar, buf, 32);
1174 pf->tvar->name = strdup(buf);
1176 if (pf->tvar->name == NULL)
1180 pf->pvar->var);
1182 if (die_find_variable_at(sp_die, pf->pvar->var, pf->addr, &vr_die))
1183 ret = convert_variable(&vr_die, pf);
1192 pf->pvar->var, 0,
1194 ret = convert_variable(&vr_die, pf);
1205 pf->pvar->var);
1246 static int call_probe_finder(Dwarf_Die *sp_die, struct probe_finder *pf)
1255 sp_die = die_find_real_subprogram(&pf->cu_die,
1256 pf->addr, &die_mem);
1266 ret = dwarf_getlocation_addr(&fb_attr, pf->addr, &pf->fb_ops, &nops, 1);
1268 pf->fb_ops = NULL;
1270 } else if (nops == 1 && pf->fb_ops[0].atom == DW_OP_call_frame_cfa &&
1271 pf->cfi != NULL) {
1273 if (dwarf_cfi_addrframe(pf->cfi, pf->addr, &frame) != 0 ||
1274 dwarf_frame_cfa(frame, &pf->fb_ops, &nops) != 0) {
1276 (uintmax_t)pf->addr);
1283 ret = pf->callback(sp_die, pf);
1285 /* *pf->fb_ops will be cached in libdw. Don't free it. */
1286 pf->fb_ops = NULL;
1294 struct probe_finder *pf = data;
1297 if (lineno != pf->lno || strtailcmp(fname, pf->fname) != 0)
1300 pf->addr = addr;
1301 ret = call_probe_finder(NULL, pf);
1308 static int find_probe_point_by_line(struct probe_finder *pf)
1310 return die_walk_lines(&pf->cu_die, probe_point_line_walker, pf);
1354 struct probe_finder *pf = data;
1357 if (!line_list__has_line(&pf->lcache, lineno) ||
1358 strtailcmp(fname, pf->fname) != 0)
1363 pf->addr = addr;
1364 ret = call_probe_finder(NULL, pf);
1374 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
1378 if (list_empty(&pf->lcache)) {
1380 ret = find_lazy_match_lines(&pf->lcache, pf->fname,
1381 pf->pev->point.lazy_line);
1386 return die_walk_lines(sp_die, probe_point_lazy_walker, pf);
1398 struct probe_finder *pf = param->data;
1399 struct perf_probe_point *pp = &pf->pev->point;
1403 param->retval = find_probe_point_lazy(in_die, pf);
1412 pf->addr = addr;
1413 pf->addr += pp->offset;
1415 (uintmax_t)pf->addr);
1417 param->retval = call_probe_finder(in_die, pf);
1429 struct probe_finder *pf = param->data;
1430 struct perf_probe_point *pp = &pf->pev->point;
1441 pf->fname = dwarf_decl_file(sp_die);
1443 dwarf_decl_line(sp_die, &pf->lno);
1444 pf->lno += pp->line;
1445 param->retval = find_probe_point_by_line(pf);
1449 param->retval = find_probe_point_lazy(sp_die, pf);
1451 if (dwarf_entrypc(sp_die, &pf->addr) != 0) {
1457 pf->addr += pp->offset;
1459 param->retval = call_probe_finder(sp_die, pf);
1462 struct dwarf_callback_param _param = {.data = (void *)pf,
1473 static int find_probe_point_by_func(struct probe_finder *pf)
1475 struct dwarf_callback_param _param = {.data = (void *)pf,
1477 dwarf_getfuncs(&pf->cu_die, probe_point_search_cb, &_param, 0);
1514 static int find_probes(int fd, struct probe_finder *pf)
1516 struct perf_probe_point *pp = &pf->pev->point;
1535 pf->cfi = dwarf_getcfi(dbg);
1539 line_list__init(&pf->lcache);
1546 .cu_die = &pf->cu_die,
1547 .sp_die = &pf->sp_die,
1551 .data = pf,
1556 ret = probe_point_search_cb(&pf->sp_die, &probe_param);
1565 diep = dwarf_offdie(dbg, off + cuhl, &pf->cu_die);
1571 pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
1573 pf->fname = NULL;
1575 if (!pp->file || pf->fname) {
1577 ret = find_probe_point_by_func(pf);
1579 ret = find_probe_point_lazy(NULL, pf);
1581 pf->lno = pp->line;
1582 ret = find_probe_point_by_line(pf);
1591 line_list__free(&pf->lcache);
1599 static int add_probe_trace_event(Dwarf_Die *sp_die, struct probe_finder *pf)
1602 container_of(pf, struct trace_event_finder, pf);
1614 ret = convert_to_trace_point(sp_die, pf->addr, pf->pev->point.retprobe,
1623 tev->nargs = pf->pev->nargs;
1627 for (i = 0; i < pf->pev->nargs; i++) {
1628 pf->pvar = &pf->pev->args[i];
1629 pf->tvar = &tev->args[i];
1630 ret = find_variable(sp_die, pf);
1643 .pf = {.pev = pev, .callback = add_probe_trace_event},
1655 ret = find_probes(fd, &tf.pf);
1680 ret = convert_variable_location(die_mem, af->pf.addr,
1681 af->pf.fb_ops, NULL);
1690 if (af->child && dwarf_haspc(die_mem, af->pf.addr))
1697 static int add_available_vars(Dwarf_Die *sp_die, struct probe_finder *pf)
1700 container_of(pf, struct available_var_finder, pf);
1712 ret = convert_to_trace_point(sp_die, pf->addr, pf->pev->point.retprobe,
1754 .pf = {.pev = pev, .callback = add_available_vars},
1766 ret = find_probes(fd, &af.pf);