]> git.karo-electronics.de Git - karo-tx-linux.git/blob - tools/perf/util/probe-finder.c
perf tools: Move extra string util functions to util/string2.h
[karo-tx-linux.git] / tools / perf / util / probe-finder.c
1 /*
2  * probe-finder.c : C expression to kprobe event converter
3  *
4  * Written by Masami Hiramatsu <mhiramat@redhat.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  *
20  */
21
22 #include <inttypes.h>
23 #include <sys/utsname.h>
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <fcntl.h>
27 #include <errno.h>
28 #include <stdio.h>
29 #include <unistd.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <stdarg.h>
33 #include <dwarf-regs.h>
34
35 #include <linux/bitops.h>
36 #include "event.h"
37 #include "dso.h"
38 #include "debug.h"
39 #include "intlist.h"
40 #include "util.h"
41 #include "symbol.h"
42 #include "probe-finder.h"
43 #include "probe-file.h"
44 #include "string2.h"
45
46 /* Kprobe tracer basic type is up to u64 */
47 #define MAX_BASIC_TYPE_BITS     64
48
49 /* Dwarf FL wrappers */
50 static char *debuginfo_path;    /* Currently dummy */
51
52 static const Dwfl_Callbacks offline_callbacks = {
53         .find_debuginfo = dwfl_standard_find_debuginfo,
54         .debuginfo_path = &debuginfo_path,
55
56         .section_address = dwfl_offline_section_address,
57
58         /* We use this table for core files too.  */
59         .find_elf = dwfl_build_id_find_elf,
60 };
61
62 /* Get a Dwarf from offline image */
63 static int debuginfo__init_offline_dwarf(struct debuginfo *dbg,
64                                          const char *path)
65 {
66         int fd;
67
68         fd = open(path, O_RDONLY);
69         if (fd < 0)
70                 return fd;
71
72         dbg->dwfl = dwfl_begin(&offline_callbacks);
73         if (!dbg->dwfl)
74                 goto error;
75
76         dwfl_report_begin(dbg->dwfl);
77         dbg->mod = dwfl_report_offline(dbg->dwfl, "", "", fd);
78         if (!dbg->mod)
79                 goto error;
80
81         dbg->dbg = dwfl_module_getdwarf(dbg->mod, &dbg->bias);
82         if (!dbg->dbg)
83                 goto error;
84
85         dwfl_report_end(dbg->dwfl, NULL, NULL);
86
87         return 0;
88 error:
89         if (dbg->dwfl)
90                 dwfl_end(dbg->dwfl);
91         else
92                 close(fd);
93         memset(dbg, 0, sizeof(*dbg));
94
95         return -ENOENT;
96 }
97
98 static struct debuginfo *__debuginfo__new(const char *path)
99 {
100         struct debuginfo *dbg = zalloc(sizeof(*dbg));
101         if (!dbg)
102                 return NULL;
103
104         if (debuginfo__init_offline_dwarf(dbg, path) < 0)
105                 zfree(&dbg);
106         if (dbg)
107                 pr_debug("Open Debuginfo file: %s\n", path);
108         return dbg;
109 }
110
111 enum dso_binary_type distro_dwarf_types[] = {
112         DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
113         DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
114         DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
115         DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
116         DSO_BINARY_TYPE__NOT_FOUND,
117 };
118
119 struct debuginfo *debuginfo__new(const char *path)
120 {
121         enum dso_binary_type *type;
122         char buf[PATH_MAX], nil = '\0';
123         struct dso *dso;
124         struct debuginfo *dinfo = NULL;
125
126         /* Try to open distro debuginfo files */
127         dso = dso__new(path);
128         if (!dso)
129                 goto out;
130
131         for (type = distro_dwarf_types;
132              !dinfo && *type != DSO_BINARY_TYPE__NOT_FOUND;
133              type++) {
134                 if (dso__read_binary_type_filename(dso, *type, &nil,
135                                                    buf, PATH_MAX) < 0)
136                         continue;
137                 dinfo = __debuginfo__new(buf);
138         }
139         dso__put(dso);
140
141 out:
142         /* if failed to open all distro debuginfo, open given binary */
143         return dinfo ? : __debuginfo__new(path);
144 }
145
146 void debuginfo__delete(struct debuginfo *dbg)
147 {
148         if (dbg) {
149                 if (dbg->dwfl)
150                         dwfl_end(dbg->dwfl);
151                 free(dbg);
152         }
153 }
154
155 /*
156  * Probe finder related functions
157  */
158
159 static struct probe_trace_arg_ref *alloc_trace_arg_ref(long offs)
160 {
161         struct probe_trace_arg_ref *ref;
162         ref = zalloc(sizeof(struct probe_trace_arg_ref));
163         if (ref != NULL)
164                 ref->offset = offs;
165         return ref;
166 }
167
168 /*
169  * Convert a location into trace_arg.
170  * If tvar == NULL, this just checks variable can be converted.
171  * If fentry == true and vr_die is a parameter, do huristic search
172  * for the location fuzzed by function entry mcount.
173  */
174 static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr,
175                                      Dwarf_Op *fb_ops, Dwarf_Die *sp_die,
176                                      unsigned int machine,
177                                      struct probe_trace_arg *tvar)
178 {
179         Dwarf_Attribute attr;
180         Dwarf_Addr tmp = 0;
181         Dwarf_Op *op;
182         size_t nops;
183         unsigned int regn;
184         Dwarf_Word offs = 0;
185         bool ref = false;
186         const char *regs;
187         int ret, ret2 = 0;
188
189         if (dwarf_attr(vr_die, DW_AT_external, &attr) != NULL)
190                 goto static_var;
191
192         /* TODO: handle more than 1 exprs */
193         if (dwarf_attr(vr_die, DW_AT_location, &attr) == NULL)
194                 return -EINVAL; /* Broken DIE ? */
195         if (dwarf_getlocation_addr(&attr, addr, &op, &nops, 1) <= 0) {
196                 ret = dwarf_entrypc(sp_die, &tmp);
197                 if (ret)
198                         return -ENOENT;
199
200                 if (probe_conf.show_location_range &&
201                         (dwarf_tag(vr_die) == DW_TAG_variable)) {
202                         ret2 = -ERANGE;
203                 } else if (addr != tmp ||
204                         dwarf_tag(vr_die) != DW_TAG_formal_parameter) {
205                         return -ENOENT;
206                 }
207
208                 ret = dwarf_highpc(sp_die, &tmp);
209                 if (ret)
210                         return -ENOENT;
211                 /*
212                  * This is fuzzed by fentry mcount. We try to find the
213                  * parameter location at the earliest address.
214                  */
215                 for (addr += 1; addr <= tmp; addr++) {
216                         if (dwarf_getlocation_addr(&attr, addr, &op,
217                                                    &nops, 1) > 0)
218                                 goto found;
219                 }
220                 return -ENOENT;
221         }
222 found:
223         if (nops == 0)
224                 /* TODO: Support const_value */
225                 return -ENOENT;
226
227         if (op->atom == DW_OP_addr) {
228 static_var:
229                 if (!tvar)
230                         return ret2;
231                 /* Static variables on memory (not stack), make @varname */
232                 ret = strlen(dwarf_diename(vr_die));
233                 tvar->value = zalloc(ret + 2);
234                 if (tvar->value == NULL)
235                         return -ENOMEM;
236                 snprintf(tvar->value, ret + 2, "@%s", dwarf_diename(vr_die));
237                 tvar->ref = alloc_trace_arg_ref((long)offs);
238                 if (tvar->ref == NULL)
239                         return -ENOMEM;
240                 return ret2;
241         }
242
243         /* If this is based on frame buffer, set the offset */
244         if (op->atom == DW_OP_fbreg) {
245                 if (fb_ops == NULL)
246                         return -ENOTSUP;
247                 ref = true;
248                 offs = op->number;
249                 op = &fb_ops[0];
250         }
251
252         if (op->atom >= DW_OP_breg0 && op->atom <= DW_OP_breg31) {
253                 regn = op->atom - DW_OP_breg0;
254                 offs += op->number;
255                 ref = true;
256         } else if (op->atom >= DW_OP_reg0 && op->atom <= DW_OP_reg31) {
257                 regn = op->atom - DW_OP_reg0;
258         } else if (op->atom == DW_OP_bregx) {
259                 regn = op->number;
260                 offs += op->number2;
261                 ref = true;
262         } else if (op->atom == DW_OP_regx) {
263                 regn = op->number;
264         } else {
265                 pr_debug("DW_OP %x is not supported.\n", op->atom);
266                 return -ENOTSUP;
267         }
268
269         if (!tvar)
270                 return ret2;
271
272         regs = get_dwarf_regstr(regn, machine);
273         if (!regs) {
274                 /* This should be a bug in DWARF or this tool */
275                 pr_warning("Mapping for the register number %u "
276                            "missing on this architecture.\n", regn);
277                 return -ENOTSUP;
278         }
279
280         tvar->value = strdup(regs);
281         if (tvar->value == NULL)
282                 return -ENOMEM;
283
284         if (ref) {
285                 tvar->ref = alloc_trace_arg_ref((long)offs);
286                 if (tvar->ref == NULL)
287                         return -ENOMEM;
288         }
289         return ret2;
290 }
291
292 #define BYTES_TO_BITS(nb)       ((nb) * BITS_PER_LONG / sizeof(long))
293
294 static int convert_variable_type(Dwarf_Die *vr_die,
295                                  struct probe_trace_arg *tvar,
296                                  const char *cast)
297 {
298         struct probe_trace_arg_ref **ref_ptr = &tvar->ref;
299         Dwarf_Die type;
300         char buf[16];
301         char sbuf[STRERR_BUFSIZE];
302         int bsize, boffs, total;
303         int ret;
304         char prefix;
305
306         /* TODO: check all types */
307         if (cast && strcmp(cast, "string") != 0 && strcmp(cast, "x") != 0 &&
308             strcmp(cast, "s") != 0 && strcmp(cast, "u") != 0) {
309                 /* Non string type is OK */
310                 /* and respect signedness/hexadecimal cast */
311                 tvar->type = strdup(cast);
312                 return (tvar->type == NULL) ? -ENOMEM : 0;
313         }
314
315         bsize = dwarf_bitsize(vr_die);
316         if (bsize > 0) {
317                 /* This is a bitfield */
318                 boffs = dwarf_bitoffset(vr_die);
319                 total = dwarf_bytesize(vr_die);
320                 if (boffs < 0 || total < 0)
321                         return -ENOENT;
322                 ret = snprintf(buf, 16, "b%d@%d/%zd", bsize, boffs,
323                                 BYTES_TO_BITS(total));
324                 goto formatted;
325         }
326
327         if (die_get_real_type(vr_die, &type) == NULL) {
328                 pr_warning("Failed to get a type information of %s.\n",
329                            dwarf_diename(vr_die));
330                 return -ENOENT;
331         }
332
333         pr_debug("%s type is %s.\n",
334                  dwarf_diename(vr_die), dwarf_diename(&type));
335
336         if (cast && strcmp(cast, "string") == 0) {      /* String type */
337                 ret = dwarf_tag(&type);
338                 if (ret != DW_TAG_pointer_type &&
339                     ret != DW_TAG_array_type) {
340                         pr_warning("Failed to cast into string: "
341                                    "%s(%s) is not a pointer nor array.\n",
342                                    dwarf_diename(vr_die), dwarf_diename(&type));
343                         return -EINVAL;
344                 }
345                 if (die_get_real_type(&type, &type) == NULL) {
346                         pr_warning("Failed to get a type"
347                                    " information.\n");
348                         return -ENOENT;
349                 }
350                 if (ret == DW_TAG_pointer_type) {
351                         while (*ref_ptr)
352                                 ref_ptr = &(*ref_ptr)->next;
353                         /* Add new reference with offset +0 */
354                         *ref_ptr = zalloc(sizeof(struct probe_trace_arg_ref));
355                         if (*ref_ptr == NULL) {
356                                 pr_warning("Out of memory error\n");
357                                 return -ENOMEM;
358                         }
359                 }
360                 if (!die_compare_name(&type, "char") &&
361                     !die_compare_name(&type, "unsigned char")) {
362                         pr_warning("Failed to cast into string: "
363                                    "%s is not (unsigned) char *.\n",
364                                    dwarf_diename(vr_die));
365                         return -EINVAL;
366                 }
367                 tvar->type = strdup(cast);
368                 return (tvar->type == NULL) ? -ENOMEM : 0;
369         }
370
371         if (cast && (strcmp(cast, "u") == 0))
372                 prefix = 'u';
373         else if (cast && (strcmp(cast, "s") == 0))
374                 prefix = 's';
375         else if (cast && (strcmp(cast, "x") == 0) &&
376                  probe_type_is_available(PROBE_TYPE_X))
377                 prefix = 'x';
378         else
379                 prefix = die_is_signed_type(&type) ? 's' :
380                          probe_type_is_available(PROBE_TYPE_X) ? 'x' : 'u';
381
382         ret = dwarf_bytesize(&type);
383         if (ret <= 0)
384                 /* No size ... try to use default type */
385                 return 0;
386         ret = BYTES_TO_BITS(ret);
387
388         /* Check the bitwidth */
389         if (ret > MAX_BASIC_TYPE_BITS) {
390                 pr_info("%s exceeds max-bitwidth. Cut down to %d bits.\n",
391                         dwarf_diename(&type), MAX_BASIC_TYPE_BITS);
392                 ret = MAX_BASIC_TYPE_BITS;
393         }
394         ret = snprintf(buf, 16, "%c%d", prefix, ret);
395
396 formatted:
397         if (ret < 0 || ret >= 16) {
398                 if (ret >= 16)
399                         ret = -E2BIG;
400                 pr_warning("Failed to convert variable type: %s\n",
401                            str_error_r(-ret, sbuf, sizeof(sbuf)));
402                 return ret;
403         }
404         tvar->type = strdup(buf);
405         if (tvar->type == NULL)
406                 return -ENOMEM;
407         return 0;
408 }
409
410 static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
411                                     struct perf_probe_arg_field *field,
412                                     struct probe_trace_arg_ref **ref_ptr,
413                                     Dwarf_Die *die_mem)
414 {
415         struct probe_trace_arg_ref *ref = *ref_ptr;
416         Dwarf_Die type;
417         Dwarf_Word offs;
418         int ret, tag;
419
420         pr_debug("converting %s in %s\n", field->name, varname);
421         if (die_get_real_type(vr_die, &type) == NULL) {
422                 pr_warning("Failed to get the type of %s.\n", varname);
423                 return -ENOENT;
424         }
425         pr_debug2("Var real type: (%x)\n", (unsigned)dwarf_dieoffset(&type));
426         tag = dwarf_tag(&type);
427
428         if (field->name[0] == '[' &&
429             (tag == DW_TAG_array_type || tag == DW_TAG_pointer_type)) {
430                 if (field->next)
431                         /* Save original type for next field */
432                         memcpy(die_mem, &type, sizeof(*die_mem));
433                 /* Get the type of this array */
434                 if (die_get_real_type(&type, &type) == NULL) {
435                         pr_warning("Failed to get the type of %s.\n", varname);
436                         return -ENOENT;
437                 }
438                 pr_debug2("Array real type: (%x)\n",
439                          (unsigned)dwarf_dieoffset(&type));
440                 if (tag == DW_TAG_pointer_type) {
441                         ref = zalloc(sizeof(struct probe_trace_arg_ref));
442                         if (ref == NULL)
443                                 return -ENOMEM;
444                         if (*ref_ptr)
445                                 (*ref_ptr)->next = ref;
446                         else
447                                 *ref_ptr = ref;
448                 }
449                 ref->offset += dwarf_bytesize(&type) * field->index;
450                 if (!field->next)
451                         /* Save vr_die for converting types */
452                         memcpy(die_mem, vr_die, sizeof(*die_mem));
453                 goto next;
454         } else if (tag == DW_TAG_pointer_type) {
455                 /* Check the pointer and dereference */
456                 if (!field->ref) {
457                         pr_err("Semantic error: %s must be referred by '->'\n",
458                                field->name);
459                         return -EINVAL;
460                 }
461                 /* Get the type pointed by this pointer */
462                 if (die_get_real_type(&type, &type) == NULL) {
463                         pr_warning("Failed to get the type of %s.\n", varname);
464                         return -ENOENT;
465                 }
466                 /* Verify it is a data structure  */
467                 tag = dwarf_tag(&type);
468                 if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) {
469                         pr_warning("%s is not a data structure nor a union.\n",
470                                    varname);
471                         return -EINVAL;
472                 }
473
474                 ref = zalloc(sizeof(struct probe_trace_arg_ref));
475                 if (ref == NULL)
476                         return -ENOMEM;
477                 if (*ref_ptr)
478                         (*ref_ptr)->next = ref;
479                 else
480                         *ref_ptr = ref;
481         } else {
482                 /* Verify it is a data structure  */
483                 if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) {
484                         pr_warning("%s is not a data structure nor a union.\n",
485                                    varname);
486                         return -EINVAL;
487                 }
488                 if (field->name[0] == '[') {
489                         pr_err("Semantic error: %s is not a pointer"
490                                " nor array.\n", varname);
491                         return -EINVAL;
492                 }
493                 /* While prcessing unnamed field, we don't care about this */
494                 if (field->ref && dwarf_diename(vr_die)) {
495                         pr_err("Semantic error: %s must be referred by '.'\n",
496                                field->name);
497                         return -EINVAL;
498                 }
499                 if (!ref) {
500                         pr_warning("Structure on a register is not "
501                                    "supported yet.\n");
502                         return -ENOTSUP;
503                 }
504         }
505
506         if (die_find_member(&type, field->name, die_mem) == NULL) {
507                 pr_warning("%s(type:%s) has no member %s.\n", varname,
508                            dwarf_diename(&type), field->name);
509                 return -EINVAL;
510         }
511
512         /* Get the offset of the field */
513         if (tag == DW_TAG_union_type) {
514                 offs = 0;
515         } else {
516                 ret = die_get_data_member_location(die_mem, &offs);
517                 if (ret < 0) {
518                         pr_warning("Failed to get the offset of %s.\n",
519                                    field->name);
520                         return ret;
521                 }
522         }
523         ref->offset += (long)offs;
524
525         /* If this member is unnamed, we need to reuse this field */
526         if (!dwarf_diename(die_mem))
527                 return convert_variable_fields(die_mem, varname, field,
528                                                 &ref, die_mem);
529
530 next:
531         /* Converting next field */
532         if (field->next)
533                 return convert_variable_fields(die_mem, field->name,
534                                         field->next, &ref, die_mem);
535         else
536                 return 0;
537 }
538
539 /* Show a variables in kprobe event format */
540 static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf)
541 {
542         Dwarf_Die die_mem;
543         int ret;
544
545         pr_debug("Converting variable %s into trace event.\n",
546                  dwarf_diename(vr_die));
547
548         ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops,
549                                         &pf->sp_die, pf->machine, pf->tvar);
550         if (ret == -ENOENT || ret == -EINVAL) {
551                 pr_err("Failed to find the location of the '%s' variable at this address.\n"
552                        " Perhaps it has been optimized out.\n"
553                        " Use -V with the --range option to show '%s' location range.\n",
554                        pf->pvar->var, pf->pvar->var);
555         } else if (ret == -ENOTSUP)
556                 pr_err("Sorry, we don't support this variable location yet.\n");
557         else if (ret == 0 && pf->pvar->field) {
558                 ret = convert_variable_fields(vr_die, pf->pvar->var,
559                                               pf->pvar->field, &pf->tvar->ref,
560                                               &die_mem);
561                 vr_die = &die_mem;
562         }
563         if (ret == 0)
564                 ret = convert_variable_type(vr_die, pf->tvar, pf->pvar->type);
565         /* *expr will be cached in libdw. Don't free it. */
566         return ret;
567 }
568
569 /* Find a variable in a scope DIE */
570 static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
571 {
572         Dwarf_Die vr_die;
573         char *buf, *ptr;
574         int ret = 0;
575
576         /* Copy raw parameters */
577         if (!is_c_varname(pf->pvar->var))
578                 return copy_to_probe_trace_arg(pf->tvar, pf->pvar);
579
580         if (pf->pvar->name)
581                 pf->tvar->name = strdup(pf->pvar->name);
582         else {
583                 buf = synthesize_perf_probe_arg(pf->pvar);
584                 if (!buf)
585                         return -ENOMEM;
586                 ptr = strchr(buf, ':'); /* Change type separator to _ */
587                 if (ptr)
588                         *ptr = '_';
589                 pf->tvar->name = buf;
590         }
591         if (pf->tvar->name == NULL)
592                 return -ENOMEM;
593
594         pr_debug("Searching '%s' variable in context.\n", pf->pvar->var);
595         /* Search child die for local variables and parameters. */
596         if (!die_find_variable_at(sc_die, pf->pvar->var, pf->addr, &vr_die)) {
597                 /* Search again in global variables */
598                 if (!die_find_variable_at(&pf->cu_die, pf->pvar->var,
599                                                 0, &vr_die)) {
600                         pr_warning("Failed to find '%s' in this function.\n",
601                                    pf->pvar->var);
602                         ret = -ENOENT;
603                 }
604         }
605         if (ret >= 0)
606                 ret = convert_variable(&vr_die, pf);
607
608         return ret;
609 }
610
611 /* Convert subprogram DIE to trace point */
612 static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod,
613                                   Dwarf_Addr paddr, bool retprobe,
614                                   const char *function,
615                                   struct probe_trace_point *tp)
616 {
617         Dwarf_Addr eaddr, highaddr;
618         GElf_Sym sym;
619         const char *symbol;
620
621         /* Verify the address is correct */
622         if (dwarf_entrypc(sp_die, &eaddr) != 0) {
623                 pr_warning("Failed to get entry address of %s\n",
624                            dwarf_diename(sp_die));
625                 return -ENOENT;
626         }
627         if (dwarf_highpc(sp_die, &highaddr) != 0) {
628                 pr_warning("Failed to get end address of %s\n",
629                            dwarf_diename(sp_die));
630                 return -ENOENT;
631         }
632         if (paddr > highaddr) {
633                 pr_warning("Offset specified is greater than size of %s\n",
634                            dwarf_diename(sp_die));
635                 return -EINVAL;
636         }
637
638         symbol = dwarf_diename(sp_die);
639         if (!symbol) {
640                 /* Try to get the symbol name from symtab */
641                 symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
642                 if (!symbol) {
643                         pr_warning("Failed to find symbol at 0x%lx\n",
644                                    (unsigned long)paddr);
645                         return -ENOENT;
646                 }
647                 eaddr = sym.st_value;
648         }
649         tp->offset = (unsigned long)(paddr - eaddr);
650         tp->address = (unsigned long)paddr;
651         tp->symbol = strdup(symbol);
652         if (!tp->symbol)
653                 return -ENOMEM;
654
655         /* Return probe must be on the head of a subprogram */
656         if (retprobe) {
657                 if (eaddr != paddr) {
658                         pr_warning("Failed to find \"%s%%return\",\n"
659                                    " because %s is an inlined function and"
660                                    " has no return point.\n", function,
661                                    function);
662                         return -EINVAL;
663                 }
664                 tp->retprobe = true;
665         }
666
667         return 0;
668 }
669
670 /* Call probe_finder callback with scope DIE */
671 static int call_probe_finder(Dwarf_Die *sc_die, struct probe_finder *pf)
672 {
673         Dwarf_Attribute fb_attr;
674         Dwarf_Frame *frame = NULL;
675         size_t nops;
676         int ret;
677
678         if (!sc_die) {
679                 pr_err("Caller must pass a scope DIE. Program error.\n");
680                 return -EINVAL;
681         }
682
683         /* If not a real subprogram, find a real one */
684         if (!die_is_func_def(sc_die)) {
685                 if (!die_find_realfunc(&pf->cu_die, pf->addr, &pf->sp_die)) {
686                         if (die_find_tailfunc(&pf->cu_die, pf->addr, &pf->sp_die)) {
687                                 pr_warning("Ignoring tail call from %s\n",
688                                                 dwarf_diename(&pf->sp_die));
689                                 return 0;
690                         } else {
691                                 pr_warning("Failed to find probe point in any "
692                                            "functions.\n");
693                                 return -ENOENT;
694                         }
695                 }
696         } else
697                 memcpy(&pf->sp_die, sc_die, sizeof(Dwarf_Die));
698
699         /* Get the frame base attribute/ops from subprogram */
700         dwarf_attr(&pf->sp_die, DW_AT_frame_base, &fb_attr);
701         ret = dwarf_getlocation_addr(&fb_attr, pf->addr, &pf->fb_ops, &nops, 1);
702         if (ret <= 0 || nops == 0) {
703                 pf->fb_ops = NULL;
704 #if _ELFUTILS_PREREQ(0, 142)
705         } else if (nops == 1 && pf->fb_ops[0].atom == DW_OP_call_frame_cfa &&
706                    (pf->cfi_eh != NULL || pf->cfi_dbg != NULL)) {
707                 if ((dwarf_cfi_addrframe(pf->cfi_eh, pf->addr, &frame) != 0 &&
708                      (dwarf_cfi_addrframe(pf->cfi_dbg, pf->addr, &frame) != 0)) ||
709                     dwarf_frame_cfa(frame, &pf->fb_ops, &nops) != 0) {
710                         pr_warning("Failed to get call frame on 0x%jx\n",
711                                    (uintmax_t)pf->addr);
712                         free(frame);
713                         return -ENOENT;
714                 }
715 #endif
716         }
717
718         /* Call finder's callback handler */
719         ret = pf->callback(sc_die, pf);
720
721         /* Since *pf->fb_ops can be a part of frame. we should free it here. */
722         free(frame);
723         pf->fb_ops = NULL;
724
725         return ret;
726 }
727
728 struct find_scope_param {
729         const char *function;
730         const char *file;
731         int line;
732         int diff;
733         Dwarf_Die *die_mem;
734         bool found;
735 };
736
737 static int find_best_scope_cb(Dwarf_Die *fn_die, void *data)
738 {
739         struct find_scope_param *fsp = data;
740         const char *file;
741         int lno;
742
743         /* Skip if declared file name does not match */
744         if (fsp->file) {
745                 file = dwarf_decl_file(fn_die);
746                 if (!file || strcmp(fsp->file, file) != 0)
747                         return 0;
748         }
749         /* If the function name is given, that's what user expects */
750         if (fsp->function) {
751                 if (die_match_name(fn_die, fsp->function)) {
752                         memcpy(fsp->die_mem, fn_die, sizeof(Dwarf_Die));
753                         fsp->found = true;
754                         return 1;
755                 }
756         } else {
757                 /* With the line number, find the nearest declared DIE */
758                 dwarf_decl_line(fn_die, &lno);
759                 if (lno < fsp->line && fsp->diff > fsp->line - lno) {
760                         /* Keep a candidate and continue */
761                         fsp->diff = fsp->line - lno;
762                         memcpy(fsp->die_mem, fn_die, sizeof(Dwarf_Die));
763                         fsp->found = true;
764                 }
765         }
766         return 0;
767 }
768
769 /* Find an appropriate scope fits to given conditions */
770 static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem)
771 {
772         struct find_scope_param fsp = {
773                 .function = pf->pev->point.function,
774                 .file = pf->fname,
775                 .line = pf->lno,
776                 .diff = INT_MAX,
777                 .die_mem = die_mem,
778                 .found = false,
779         };
780
781         cu_walk_functions_at(&pf->cu_die, pf->addr, find_best_scope_cb, &fsp);
782
783         return fsp.found ? die_mem : NULL;
784 }
785
786 static int probe_point_line_walker(const char *fname, int lineno,
787                                    Dwarf_Addr addr, void *data)
788 {
789         struct probe_finder *pf = data;
790         Dwarf_Die *sc_die, die_mem;
791         int ret;
792
793         if (lineno != pf->lno || strtailcmp(fname, pf->fname) != 0)
794                 return 0;
795
796         pf->addr = addr;
797         sc_die = find_best_scope(pf, &die_mem);
798         if (!sc_die) {
799                 pr_warning("Failed to find scope of probe point.\n");
800                 return -ENOENT;
801         }
802
803         ret = call_probe_finder(sc_die, pf);
804
805         /* Continue if no error, because the line will be in inline function */
806         return ret < 0 ? ret : 0;
807 }
808
809 /* Find probe point from its line number */
810 static int find_probe_point_by_line(struct probe_finder *pf)
811 {
812         return die_walk_lines(&pf->cu_die, probe_point_line_walker, pf);
813 }
814
815 /* Find lines which match lazy pattern */
816 static int find_lazy_match_lines(struct intlist *list,
817                                  const char *fname, const char *pat)
818 {
819         FILE *fp;
820         char *line = NULL;
821         size_t line_len;
822         ssize_t len;
823         int count = 0, linenum = 1;
824         char sbuf[STRERR_BUFSIZE];
825
826         fp = fopen(fname, "r");
827         if (!fp) {
828                 pr_warning("Failed to open %s: %s\n", fname,
829                            str_error_r(errno, sbuf, sizeof(sbuf)));
830                 return -errno;
831         }
832
833         while ((len = getline(&line, &line_len, fp)) > 0) {
834
835                 if (line[len - 1] == '\n')
836                         line[len - 1] = '\0';
837
838                 if (strlazymatch(line, pat)) {
839                         intlist__add(list, linenum);
840                         count++;
841                 }
842                 linenum++;
843         }
844
845         if (ferror(fp))
846                 count = -errno;
847         free(line);
848         fclose(fp);
849
850         if (count == 0)
851                 pr_debug("No matched lines found in %s.\n", fname);
852         return count;
853 }
854
855 static int probe_point_lazy_walker(const char *fname, int lineno,
856                                    Dwarf_Addr addr, void *data)
857 {
858         struct probe_finder *pf = data;
859         Dwarf_Die *sc_die, die_mem;
860         int ret;
861
862         if (!intlist__has_entry(pf->lcache, lineno) ||
863             strtailcmp(fname, pf->fname) != 0)
864                 return 0;
865
866         pr_debug("Probe line found: line:%d addr:0x%llx\n",
867                  lineno, (unsigned long long)addr);
868         pf->addr = addr;
869         pf->lno = lineno;
870         sc_die = find_best_scope(pf, &die_mem);
871         if (!sc_die) {
872                 pr_warning("Failed to find scope of probe point.\n");
873                 return -ENOENT;
874         }
875
876         ret = call_probe_finder(sc_die, pf);
877
878         /*
879          * Continue if no error, because the lazy pattern will match
880          * to other lines
881          */
882         return ret < 0 ? ret : 0;
883 }
884
885 /* Find probe points from lazy pattern  */
886 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
887 {
888         int ret = 0;
889         char *fpath;
890
891         if (intlist__empty(pf->lcache)) {
892                 const char *comp_dir;
893
894                 comp_dir = cu_get_comp_dir(&pf->cu_die);
895                 ret = get_real_path(pf->fname, comp_dir, &fpath);
896                 if (ret < 0) {
897                         pr_warning("Failed to find source file path.\n");
898                         return ret;
899                 }
900
901                 /* Matching lazy line pattern */
902                 ret = find_lazy_match_lines(pf->lcache, fpath,
903                                             pf->pev->point.lazy_line);
904                 free(fpath);
905                 if (ret <= 0)
906                         return ret;
907         }
908
909         return die_walk_lines(sp_die, probe_point_lazy_walker, pf);
910 }
911
912 static void skip_prologue(Dwarf_Die *sp_die, struct probe_finder *pf)
913 {
914         struct perf_probe_point *pp = &pf->pev->point;
915
916         /* Not uprobe? */
917         if (!pf->pev->uprobes)
918                 return;
919
920         /* Compiled with optimization? */
921         if (die_is_optimized_target(&pf->cu_die))
922                 return;
923
924         /* Don't know entrypc? */
925         if (!pf->addr)
926                 return;
927
928         /* Only FUNC and FUNC@SRC are eligible. */
929         if (!pp->function || pp->line || pp->retprobe || pp->lazy_line ||
930             pp->offset || pp->abs_address)
931                 return;
932
933         /* Not interested in func parameter? */
934         if (!perf_probe_with_var(pf->pev))
935                 return;
936
937         pr_info("Target program is compiled without optimization. Skipping prologue.\n"
938                 "Probe on address 0x%" PRIx64 " to force probing at the function entry.\n\n",
939                 pf->addr);
940
941         die_skip_prologue(sp_die, &pf->cu_die, &pf->addr);
942 }
943
944 static int probe_point_inline_cb(Dwarf_Die *in_die, void *data)
945 {
946         struct probe_finder *pf = data;
947         struct perf_probe_point *pp = &pf->pev->point;
948         Dwarf_Addr addr;
949         int ret;
950
951         if (pp->lazy_line)
952                 ret = find_probe_point_lazy(in_die, pf);
953         else {
954                 /* Get probe address */
955                 if (dwarf_entrypc(in_die, &addr) != 0) {
956                         pr_warning("Failed to get entry address of %s.\n",
957                                    dwarf_diename(in_die));
958                         return -ENOENT;
959                 }
960                 if (addr == 0) {
961                         pr_debug("%s has no valid entry address. skipped.\n",
962                                  dwarf_diename(in_die));
963                         return -ENOENT;
964                 }
965                 pf->addr = addr;
966                 pf->addr += pp->offset;
967                 pr_debug("found inline addr: 0x%jx\n",
968                          (uintmax_t)pf->addr);
969
970                 ret = call_probe_finder(in_die, pf);
971         }
972
973         return ret;
974 }
975
976 /* Callback parameter with return value for libdw */
977 struct dwarf_callback_param {
978         void *data;
979         int retval;
980 };
981
982 /* Search function from function name */
983 static int probe_point_search_cb(Dwarf_Die *sp_die, void *data)
984 {
985         struct dwarf_callback_param *param = data;
986         struct probe_finder *pf = param->data;
987         struct perf_probe_point *pp = &pf->pev->point;
988
989         /* Check tag and diename */
990         if (!die_is_func_def(sp_die) ||
991             !die_match_name(sp_die, pp->function))
992                 return DWARF_CB_OK;
993
994         /* Check declared file */
995         if (pp->file && strtailcmp(pp->file, dwarf_decl_file(sp_die)))
996                 return DWARF_CB_OK;
997
998         pr_debug("Matched function: %s [%lx]\n", dwarf_diename(sp_die),
999                  (unsigned long)dwarf_dieoffset(sp_die));
1000         pf->fname = dwarf_decl_file(sp_die);
1001         if (pp->line) { /* Function relative line */
1002                 dwarf_decl_line(sp_die, &pf->lno);
1003                 pf->lno += pp->line;
1004                 param->retval = find_probe_point_by_line(pf);
1005         } else if (die_is_func_instance(sp_die)) {
1006                 /* Instances always have the entry address */
1007                 dwarf_entrypc(sp_die, &pf->addr);
1008                 /* But in some case the entry address is 0 */
1009                 if (pf->addr == 0) {
1010                         pr_debug("%s has no entry PC. Skipped\n",
1011                                  dwarf_diename(sp_die));
1012                         param->retval = 0;
1013                 /* Real function */
1014                 } else if (pp->lazy_line)
1015                         param->retval = find_probe_point_lazy(sp_die, pf);
1016                 else {
1017                         skip_prologue(sp_die, pf);
1018                         pf->addr += pp->offset;
1019                         /* TODO: Check the address in this function */
1020                         param->retval = call_probe_finder(sp_die, pf);
1021                 }
1022         } else if (!probe_conf.no_inlines) {
1023                 /* Inlined function: search instances */
1024                 param->retval = die_walk_instances(sp_die,
1025                                         probe_point_inline_cb, (void *)pf);
1026                 /* This could be a non-existed inline definition */
1027                 if (param->retval == -ENOENT)
1028                         param->retval = 0;
1029         }
1030
1031         /* We need to find other candidates */
1032         if (strisglob(pp->function) && param->retval >= 0) {
1033                 param->retval = 0;      /* We have to clear the result */
1034                 return DWARF_CB_OK;
1035         }
1036
1037         return DWARF_CB_ABORT; /* Exit; no same symbol in this CU. */
1038 }
1039
1040 static int find_probe_point_by_func(struct probe_finder *pf)
1041 {
1042         struct dwarf_callback_param _param = {.data = (void *)pf,
1043                                               .retval = 0};
1044         dwarf_getfuncs(&pf->cu_die, probe_point_search_cb, &_param, 0);
1045         return _param.retval;
1046 }
1047
1048 struct pubname_callback_param {
1049         char *function;
1050         char *file;
1051         Dwarf_Die *cu_die;
1052         Dwarf_Die *sp_die;
1053         int found;
1054 };
1055
1056 static int pubname_search_cb(Dwarf *dbg, Dwarf_Global *gl, void *data)
1057 {
1058         struct pubname_callback_param *param = data;
1059
1060         if (dwarf_offdie(dbg, gl->die_offset, param->sp_die)) {
1061                 if (dwarf_tag(param->sp_die) != DW_TAG_subprogram)
1062                         return DWARF_CB_OK;
1063
1064                 if (die_match_name(param->sp_die, param->function)) {
1065                         if (!dwarf_offdie(dbg, gl->cu_offset, param->cu_die))
1066                                 return DWARF_CB_OK;
1067
1068                         if (param->file &&
1069                             strtailcmp(param->file, dwarf_decl_file(param->sp_die)))
1070                                 return DWARF_CB_OK;
1071
1072                         param->found = 1;
1073                         return DWARF_CB_ABORT;
1074                 }
1075         }
1076
1077         return DWARF_CB_OK;
1078 }
1079
1080 static int debuginfo__find_probe_location(struct debuginfo *dbg,
1081                                   struct probe_finder *pf)
1082 {
1083         struct perf_probe_point *pp = &pf->pev->point;
1084         Dwarf_Off off, noff;
1085         size_t cuhl;
1086         Dwarf_Die *diep;
1087         int ret = 0;
1088
1089         off = 0;
1090         pf->lcache = intlist__new(NULL);
1091         if (!pf->lcache)
1092                 return -ENOMEM;
1093
1094         /* Fastpath: lookup by function name from .debug_pubnames section */
1095         if (pp->function && !strisglob(pp->function)) {
1096                 struct pubname_callback_param pubname_param = {
1097                         .function = pp->function,
1098                         .file     = pp->file,
1099                         .cu_die   = &pf->cu_die,
1100                         .sp_die   = &pf->sp_die,
1101                         .found    = 0,
1102                 };
1103                 struct dwarf_callback_param probe_param = {
1104                         .data = pf,
1105                 };
1106
1107                 dwarf_getpubnames(dbg->dbg, pubname_search_cb,
1108                                   &pubname_param, 0);
1109                 if (pubname_param.found) {
1110                         ret = probe_point_search_cb(&pf->sp_die, &probe_param);
1111                         if (ret)
1112                                 goto found;
1113                 }
1114         }
1115
1116         /* Loop on CUs (Compilation Unit) */
1117         while (!dwarf_nextcu(dbg->dbg, off, &noff, &cuhl, NULL, NULL, NULL)) {
1118                 /* Get the DIE(Debugging Information Entry) of this CU */
1119                 diep = dwarf_offdie(dbg->dbg, off + cuhl, &pf->cu_die);
1120                 if (!diep)
1121                         continue;
1122
1123                 /* Check if target file is included. */
1124                 if (pp->file)
1125                         pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
1126                 else
1127                         pf->fname = NULL;
1128
1129                 if (!pp->file || pf->fname) {
1130                         if (pp->function)
1131                                 ret = find_probe_point_by_func(pf);
1132                         else if (pp->lazy_line)
1133                                 ret = find_probe_point_lazy(&pf->cu_die, pf);
1134                         else {
1135                                 pf->lno = pp->line;
1136                                 ret = find_probe_point_by_line(pf);
1137                         }
1138                         if (ret < 0)
1139                                 break;
1140                 }
1141                 off = noff;
1142         }
1143
1144 found:
1145         intlist__delete(pf->lcache);
1146         pf->lcache = NULL;
1147
1148         return ret;
1149 }
1150
1151 /* Find probe points from debuginfo */
1152 static int debuginfo__find_probes(struct debuginfo *dbg,
1153                                   struct probe_finder *pf)
1154 {
1155         int ret = 0;
1156         Elf *elf;
1157         GElf_Ehdr ehdr;
1158
1159         if (pf->cfi_eh || pf->cfi_dbg)
1160                 return debuginfo__find_probe_location(dbg, pf);
1161
1162         /* Get the call frame information from this dwarf */
1163         elf = dwarf_getelf(dbg->dbg);
1164         if (elf == NULL)
1165                 return -EINVAL;
1166
1167         if (gelf_getehdr(elf, &ehdr) == NULL)
1168                 return -EINVAL;
1169
1170         pf->machine = ehdr.e_machine;
1171
1172 #if _ELFUTILS_PREREQ(0, 142)
1173         do {
1174                 GElf_Shdr shdr;
1175
1176                 if (elf_section_by_name(elf, &ehdr, &shdr, ".eh_frame", NULL) &&
1177                     shdr.sh_type == SHT_PROGBITS)
1178                         pf->cfi_eh = dwarf_getcfi_elf(elf);
1179
1180                 pf->cfi_dbg = dwarf_getcfi(dbg->dbg);
1181         } while (0);
1182 #endif
1183
1184         ret = debuginfo__find_probe_location(dbg, pf);
1185         return ret;
1186 }
1187
1188 struct local_vars_finder {
1189         struct probe_finder *pf;
1190         struct perf_probe_arg *args;
1191         bool vars;
1192         int max_args;
1193         int nargs;
1194         int ret;
1195 };
1196
1197 /* Collect available variables in this scope */
1198 static int copy_variables_cb(Dwarf_Die *die_mem, void *data)
1199 {
1200         struct local_vars_finder *vf = data;
1201         struct probe_finder *pf = vf->pf;
1202         int tag;
1203
1204         tag = dwarf_tag(die_mem);
1205         if (tag == DW_TAG_formal_parameter ||
1206             (tag == DW_TAG_variable && vf->vars)) {
1207                 if (convert_variable_location(die_mem, vf->pf->addr,
1208                                               vf->pf->fb_ops, &pf->sp_die,
1209                                               pf->machine, NULL) == 0) {
1210                         vf->args[vf->nargs].var = (char *)dwarf_diename(die_mem);
1211                         if (vf->args[vf->nargs].var == NULL) {
1212                                 vf->ret = -ENOMEM;
1213                                 return DIE_FIND_CB_END;
1214                         }
1215                         pr_debug(" %s", vf->args[vf->nargs].var);
1216                         vf->nargs++;
1217                 }
1218         }
1219
1220         if (dwarf_haspc(die_mem, vf->pf->addr))
1221                 return DIE_FIND_CB_CONTINUE;
1222         else
1223                 return DIE_FIND_CB_SIBLING;
1224 }
1225
1226 static int expand_probe_args(Dwarf_Die *sc_die, struct probe_finder *pf,
1227                              struct perf_probe_arg *args)
1228 {
1229         Dwarf_Die die_mem;
1230         int i;
1231         int n = 0;
1232         struct local_vars_finder vf = {.pf = pf, .args = args, .vars = false,
1233                                 .max_args = MAX_PROBE_ARGS, .ret = 0};
1234
1235         for (i = 0; i < pf->pev->nargs; i++) {
1236                 /* var never be NULL */
1237                 if (strcmp(pf->pev->args[i].var, PROBE_ARG_VARS) == 0)
1238                         vf.vars = true;
1239                 else if (strcmp(pf->pev->args[i].var, PROBE_ARG_PARAMS) != 0) {
1240                         /* Copy normal argument */
1241                         args[n] = pf->pev->args[i];
1242                         n++;
1243                         continue;
1244                 }
1245                 pr_debug("Expanding %s into:", pf->pev->args[i].var);
1246                 vf.nargs = n;
1247                 /* Special local variables */
1248                 die_find_child(sc_die, copy_variables_cb, (void *)&vf,
1249                                &die_mem);
1250                 pr_debug(" (%d)\n", vf.nargs - n);
1251                 if (vf.ret < 0)
1252                         return vf.ret;
1253                 n = vf.nargs;
1254         }
1255         return n;
1256 }
1257
1258 /* Add a found probe point into trace event list */
1259 static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
1260 {
1261         struct trace_event_finder *tf =
1262                         container_of(pf, struct trace_event_finder, pf);
1263         struct perf_probe_point *pp = &pf->pev->point;
1264         struct probe_trace_event *tev;
1265         struct perf_probe_arg *args = NULL;
1266         int ret, i;
1267
1268         /* Check number of tevs */
1269         if (tf->ntevs == tf->max_tevs) {
1270                 pr_warning("Too many( > %d) probe point found.\n",
1271                            tf->max_tevs);
1272                 return -ERANGE;
1273         }
1274         tev = &tf->tevs[tf->ntevs++];
1275
1276         /* Trace point should be converted from subprogram DIE */
1277         ret = convert_to_trace_point(&pf->sp_die, tf->mod, pf->addr,
1278                                      pp->retprobe, pp->function, &tev->point);
1279         if (ret < 0)
1280                 goto end;
1281
1282         tev->point.realname = strdup(dwarf_diename(sc_die));
1283         if (!tev->point.realname) {
1284                 ret = -ENOMEM;
1285                 goto end;
1286         }
1287
1288         pr_debug("Probe point found: %s+%lu\n", tev->point.symbol,
1289                  tev->point.offset);
1290
1291         /* Expand special probe argument if exist */
1292         args = zalloc(sizeof(struct perf_probe_arg) * MAX_PROBE_ARGS);
1293         if (args == NULL) {
1294                 ret = -ENOMEM;
1295                 goto end;
1296         }
1297
1298         ret = expand_probe_args(sc_die, pf, args);
1299         if (ret < 0)
1300                 goto end;
1301
1302         tev->nargs = ret;
1303         tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
1304         if (tev->args == NULL) {
1305                 ret = -ENOMEM;
1306                 goto end;
1307         }
1308
1309         /* Find each argument */
1310         for (i = 0; i < tev->nargs; i++) {
1311                 pf->pvar = &args[i];
1312                 pf->tvar = &tev->args[i];
1313                 /* Variable should be found from scope DIE */
1314                 ret = find_variable(sc_die, pf);
1315                 if (ret != 0)
1316                         break;
1317         }
1318
1319 end:
1320         if (ret) {
1321                 clear_probe_trace_event(tev);
1322                 tf->ntevs--;
1323         }
1324         free(args);
1325         return ret;
1326 }
1327
1328 /* Find probe_trace_events specified by perf_probe_event from debuginfo */
1329 int debuginfo__find_trace_events(struct debuginfo *dbg,
1330                                  struct perf_probe_event *pev,
1331                                  struct probe_trace_event **tevs)
1332 {
1333         struct trace_event_finder tf = {
1334                         .pf = {.pev = pev, .callback = add_probe_trace_event},
1335                         .max_tevs = probe_conf.max_probes, .mod = dbg->mod};
1336         int ret, i;
1337
1338         /* Allocate result tevs array */
1339         *tevs = zalloc(sizeof(struct probe_trace_event) * tf.max_tevs);
1340         if (*tevs == NULL)
1341                 return -ENOMEM;
1342
1343         tf.tevs = *tevs;
1344         tf.ntevs = 0;
1345
1346         ret = debuginfo__find_probes(dbg, &tf.pf);
1347         if (ret < 0) {
1348                 for (i = 0; i < tf.ntevs; i++)
1349                         clear_probe_trace_event(&tf.tevs[i]);
1350                 zfree(tevs);
1351                 return ret;
1352         }
1353
1354         return (ret < 0) ? ret : tf.ntevs;
1355 }
1356
1357 /* Collect available variables in this scope */
1358 static int collect_variables_cb(Dwarf_Die *die_mem, void *data)
1359 {
1360         struct available_var_finder *af = data;
1361         struct variable_list *vl;
1362         struct strbuf buf = STRBUF_INIT;
1363         int tag, ret;
1364
1365         vl = &af->vls[af->nvls - 1];
1366
1367         tag = dwarf_tag(die_mem);
1368         if (tag == DW_TAG_formal_parameter ||
1369             tag == DW_TAG_variable) {
1370                 ret = convert_variable_location(die_mem, af->pf.addr,
1371                                                 af->pf.fb_ops, &af->pf.sp_die,
1372                                                 af->pf.machine, NULL);
1373                 if (ret == 0 || ret == -ERANGE) {
1374                         int ret2;
1375                         bool externs = !af->child;
1376
1377                         if (strbuf_init(&buf, 64) < 0)
1378                                 goto error;
1379
1380                         if (probe_conf.show_location_range) {
1381                                 if (!externs)
1382                                         ret2 = strbuf_add(&buf,
1383                                                 ret ? "[INV]\t" : "[VAL]\t", 6);
1384                                 else
1385                                         ret2 = strbuf_add(&buf, "[EXT]\t", 6);
1386                                 if (ret2)
1387                                         goto error;
1388                         }
1389
1390                         ret2 = die_get_varname(die_mem, &buf);
1391
1392                         if (!ret2 && probe_conf.show_location_range &&
1393                                 !externs) {
1394                                 if (strbuf_addch(&buf, '\t') < 0)
1395                                         goto error;
1396                                 ret2 = die_get_var_range(&af->pf.sp_die,
1397                                                         die_mem, &buf);
1398                         }
1399
1400                         pr_debug("Add new var: %s\n", buf.buf);
1401                         if (ret2 == 0) {
1402                                 strlist__add(vl->vars,
1403                                         strbuf_detach(&buf, NULL));
1404                         }
1405                         strbuf_release(&buf);
1406                 }
1407         }
1408
1409         if (af->child && dwarf_haspc(die_mem, af->pf.addr))
1410                 return DIE_FIND_CB_CONTINUE;
1411         else
1412                 return DIE_FIND_CB_SIBLING;
1413 error:
1414         strbuf_release(&buf);
1415         pr_debug("Error in strbuf\n");
1416         return DIE_FIND_CB_END;
1417 }
1418
1419 /* Add a found vars into available variables list */
1420 static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf)
1421 {
1422         struct available_var_finder *af =
1423                         container_of(pf, struct available_var_finder, pf);
1424         struct perf_probe_point *pp = &pf->pev->point;
1425         struct variable_list *vl;
1426         Dwarf_Die die_mem;
1427         int ret;
1428
1429         /* Check number of tevs */
1430         if (af->nvls == af->max_vls) {
1431                 pr_warning("Too many( > %d) probe point found.\n", af->max_vls);
1432                 return -ERANGE;
1433         }
1434         vl = &af->vls[af->nvls++];
1435
1436         /* Trace point should be converted from subprogram DIE */
1437         ret = convert_to_trace_point(&pf->sp_die, af->mod, pf->addr,
1438                                      pp->retprobe, pp->function, &vl->point);
1439         if (ret < 0)
1440                 return ret;
1441
1442         pr_debug("Probe point found: %s+%lu\n", vl->point.symbol,
1443                  vl->point.offset);
1444
1445         /* Find local variables */
1446         vl->vars = strlist__new(NULL, NULL);
1447         if (vl->vars == NULL)
1448                 return -ENOMEM;
1449         af->child = true;
1450         die_find_child(sc_die, collect_variables_cb, (void *)af, &die_mem);
1451
1452         /* Find external variables */
1453         if (!probe_conf.show_ext_vars)
1454                 goto out;
1455         /* Don't need to search child DIE for external vars. */
1456         af->child = false;
1457         die_find_child(&pf->cu_die, collect_variables_cb, (void *)af, &die_mem);
1458
1459 out:
1460         if (strlist__empty(vl->vars)) {
1461                 strlist__delete(vl->vars);
1462                 vl->vars = NULL;
1463         }
1464
1465         return ret;
1466 }
1467
1468 /*
1469  * Find available variables at given probe point
1470  * Return the number of found probe points. Return 0 if there is no
1471  * matched probe point. Return <0 if an error occurs.
1472  */
1473 int debuginfo__find_available_vars_at(struct debuginfo *dbg,
1474                                       struct perf_probe_event *pev,
1475                                       struct variable_list **vls)
1476 {
1477         struct available_var_finder af = {
1478                         .pf = {.pev = pev, .callback = add_available_vars},
1479                         .mod = dbg->mod,
1480                         .max_vls = probe_conf.max_probes};
1481         int ret;
1482
1483         /* Allocate result vls array */
1484         *vls = zalloc(sizeof(struct variable_list) * af.max_vls);
1485         if (*vls == NULL)
1486                 return -ENOMEM;
1487
1488         af.vls = *vls;
1489         af.nvls = 0;
1490
1491         ret = debuginfo__find_probes(dbg, &af.pf);
1492         if (ret < 0) {
1493                 /* Free vlist for error */
1494                 while (af.nvls--) {
1495                         zfree(&af.vls[af.nvls].point.symbol);
1496                         strlist__delete(af.vls[af.nvls].vars);
1497                 }
1498                 zfree(vls);
1499                 return ret;
1500         }
1501
1502         return (ret < 0) ? ret : af.nvls;
1503 }
1504
1505 /* For the kernel module, we need a special code to get a DIE */
1506 int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs,
1507                                 bool adjust_offset)
1508 {
1509         int n, i;
1510         Elf32_Word shndx;
1511         Elf_Scn *scn;
1512         Elf *elf;
1513         GElf_Shdr mem, *shdr;
1514         const char *p;
1515
1516         elf = dwfl_module_getelf(dbg->mod, &dbg->bias);
1517         if (!elf)
1518                 return -EINVAL;
1519
1520         /* Get the number of relocations */
1521         n = dwfl_module_relocations(dbg->mod);
1522         if (n < 0)
1523                 return -ENOENT;
1524         /* Search the relocation related .text section */
1525         for (i = 0; i < n; i++) {
1526                 p = dwfl_module_relocation_info(dbg->mod, i, &shndx);
1527                 if (strcmp(p, ".text") == 0) {
1528                         /* OK, get the section header */
1529                         scn = elf_getscn(elf, shndx);
1530                         if (!scn)
1531                                 return -ENOENT;
1532                         shdr = gelf_getshdr(scn, &mem);
1533                         if (!shdr)
1534                                 return -ENOENT;
1535                         *offs = shdr->sh_addr;
1536                         if (adjust_offset)
1537                                 *offs -= shdr->sh_offset;
1538                 }
1539         }
1540         return 0;
1541 }
1542
1543 /* Reverse search */
1544 int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr,
1545                                 struct perf_probe_point *ppt)
1546 {
1547         Dwarf_Die cudie, spdie, indie;
1548         Dwarf_Addr _addr = 0, baseaddr = 0;
1549         const char *fname = NULL, *func = NULL, *basefunc = NULL, *tmp;
1550         int baseline = 0, lineno = 0, ret = 0;
1551
1552         /* We always need to relocate the address for aranges */
1553         if (debuginfo__get_text_offset(dbg, &baseaddr, false) == 0)
1554                 addr += baseaddr;
1555         /* Find cu die */
1556         if (!dwarf_addrdie(dbg->dbg, (Dwarf_Addr)addr, &cudie)) {
1557                 pr_warning("Failed to find debug information for address %lx\n",
1558                            addr);
1559                 ret = -EINVAL;
1560                 goto end;
1561         }
1562
1563         /* Find a corresponding line (filename and lineno) */
1564         cu_find_lineinfo(&cudie, addr, &fname, &lineno);
1565         /* Don't care whether it failed or not */
1566
1567         /* Find a corresponding function (name, baseline and baseaddr) */
1568         if (die_find_realfunc(&cudie, (Dwarf_Addr)addr, &spdie)) {
1569                 /* Get function entry information */
1570                 func = basefunc = dwarf_diename(&spdie);
1571                 if (!func ||
1572                     dwarf_entrypc(&spdie, &baseaddr) != 0 ||
1573                     dwarf_decl_line(&spdie, &baseline) != 0) {
1574                         lineno = 0;
1575                         goto post;
1576                 }
1577
1578                 fname = dwarf_decl_file(&spdie);
1579                 if (addr == (unsigned long)baseaddr) {
1580                         /* Function entry - Relative line number is 0 */
1581                         lineno = baseline;
1582                         goto post;
1583                 }
1584
1585                 /* Track down the inline functions step by step */
1586                 while (die_find_top_inlinefunc(&spdie, (Dwarf_Addr)addr,
1587                                                 &indie)) {
1588                         /* There is an inline function */
1589                         if (dwarf_entrypc(&indie, &_addr) == 0 &&
1590                             _addr == addr) {
1591                                 /*
1592                                  * addr is at an inline function entry.
1593                                  * In this case, lineno should be the call-site
1594                                  * line number. (overwrite lineinfo)
1595                                  */
1596                                 lineno = die_get_call_lineno(&indie);
1597                                 fname = die_get_call_file(&indie);
1598                                 break;
1599                         } else {
1600                                 /*
1601                                  * addr is in an inline function body.
1602                                  * Since lineno points one of the lines
1603                                  * of the inline function, baseline should
1604                                  * be the entry line of the inline function.
1605                                  */
1606                                 tmp = dwarf_diename(&indie);
1607                                 if (!tmp ||
1608                                     dwarf_decl_line(&indie, &baseline) != 0)
1609                                         break;
1610                                 func = tmp;
1611                                 spdie = indie;
1612                         }
1613                 }
1614                 /* Verify the lineno and baseline are in a same file */
1615                 tmp = dwarf_decl_file(&spdie);
1616                 if (!tmp || strcmp(tmp, fname) != 0)
1617                         lineno = 0;
1618         }
1619
1620 post:
1621         /* Make a relative line number or an offset */
1622         if (lineno)
1623                 ppt->line = lineno - baseline;
1624         else if (basefunc) {
1625                 ppt->offset = addr - (unsigned long)baseaddr;
1626                 func = basefunc;
1627         }
1628
1629         /* Duplicate strings */
1630         if (func) {
1631                 ppt->function = strdup(func);
1632                 if (ppt->function == NULL) {
1633                         ret = -ENOMEM;
1634                         goto end;
1635                 }
1636         }
1637         if (fname) {
1638                 ppt->file = strdup(fname);
1639                 if (ppt->file == NULL) {
1640                         zfree(&ppt->function);
1641                         ret = -ENOMEM;
1642                         goto end;
1643                 }
1644         }
1645 end:
1646         if (ret == 0 && (fname || func))
1647                 ret = 1;        /* Found a point */
1648         return ret;
1649 }
1650
1651 /* Add a line and store the src path */
1652 static int line_range_add_line(const char *src, unsigned int lineno,
1653                                struct line_range *lr)
1654 {
1655         /* Copy source path */
1656         if (!lr->path) {
1657                 lr->path = strdup(src);
1658                 if (lr->path == NULL)
1659                         return -ENOMEM;
1660         }
1661         return intlist__add(lr->line_list, lineno);
1662 }
1663
1664 static int line_range_walk_cb(const char *fname, int lineno,
1665                               Dwarf_Addr addr __maybe_unused,
1666                               void *data)
1667 {
1668         struct line_finder *lf = data;
1669         int err;
1670
1671         if ((strtailcmp(fname, lf->fname) != 0) ||
1672             (lf->lno_s > lineno || lf->lno_e < lineno))
1673                 return 0;
1674
1675         err = line_range_add_line(fname, lineno, lf->lr);
1676         if (err < 0 && err != -EEXIST)
1677                 return err;
1678
1679         return 0;
1680 }
1681
1682 /* Find line range from its line number */
1683 static int find_line_range_by_line(Dwarf_Die *sp_die, struct line_finder *lf)
1684 {
1685         int ret;
1686
1687         ret = die_walk_lines(sp_die ?: &lf->cu_die, line_range_walk_cb, lf);
1688
1689         /* Update status */
1690         if (ret >= 0)
1691                 if (!intlist__empty(lf->lr->line_list))
1692                         ret = lf->found = 1;
1693                 else
1694                         ret = 0;        /* Lines are not found */
1695         else {
1696                 zfree(&lf->lr->path);
1697         }
1698         return ret;
1699 }
1700
1701 static int line_range_inline_cb(Dwarf_Die *in_die, void *data)
1702 {
1703         int ret = find_line_range_by_line(in_die, data);
1704
1705         /*
1706          * We have to check all instances of inlined function, because
1707          * some execution paths can be optimized out depends on the
1708          * function argument of instances. However, if an error occurs,
1709          * it should be handled by the caller.
1710          */
1711         return ret < 0 ? ret : 0;
1712 }
1713
1714 /* Search function definition from function name */
1715 static int line_range_search_cb(Dwarf_Die *sp_die, void *data)
1716 {
1717         struct dwarf_callback_param *param = data;
1718         struct line_finder *lf = param->data;
1719         struct line_range *lr = lf->lr;
1720
1721         /* Check declared file */
1722         if (lr->file && strtailcmp(lr->file, dwarf_decl_file(sp_die)))
1723                 return DWARF_CB_OK;
1724
1725         if (die_is_func_def(sp_die) &&
1726             die_match_name(sp_die, lr->function)) {
1727                 lf->fname = dwarf_decl_file(sp_die);
1728                 dwarf_decl_line(sp_die, &lr->offset);
1729                 pr_debug("fname: %s, lineno:%d\n", lf->fname, lr->offset);
1730                 lf->lno_s = lr->offset + lr->start;
1731                 if (lf->lno_s < 0)      /* Overflow */
1732                         lf->lno_s = INT_MAX;
1733                 lf->lno_e = lr->offset + lr->end;
1734                 if (lf->lno_e < 0)      /* Overflow */
1735                         lf->lno_e = INT_MAX;
1736                 pr_debug("New line range: %d to %d\n", lf->lno_s, lf->lno_e);
1737                 lr->start = lf->lno_s;
1738                 lr->end = lf->lno_e;
1739                 if (!die_is_func_instance(sp_die))
1740                         param->retval = die_walk_instances(sp_die,
1741                                                 line_range_inline_cb, lf);
1742                 else
1743                         param->retval = find_line_range_by_line(sp_die, lf);
1744                 return DWARF_CB_ABORT;
1745         }
1746         return DWARF_CB_OK;
1747 }
1748
1749 static int find_line_range_by_func(struct line_finder *lf)
1750 {
1751         struct dwarf_callback_param param = {.data = (void *)lf, .retval = 0};
1752         dwarf_getfuncs(&lf->cu_die, line_range_search_cb, &param, 0);
1753         return param.retval;
1754 }
1755
1756 int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr)
1757 {
1758         struct line_finder lf = {.lr = lr, .found = 0};
1759         int ret = 0;
1760         Dwarf_Off off = 0, noff;
1761         size_t cuhl;
1762         Dwarf_Die *diep;
1763         const char *comp_dir;
1764
1765         /* Fastpath: lookup by function name from .debug_pubnames section */
1766         if (lr->function) {
1767                 struct pubname_callback_param pubname_param = {
1768                         .function = lr->function, .file = lr->file,
1769                         .cu_die = &lf.cu_die, .sp_die = &lf.sp_die, .found = 0};
1770                 struct dwarf_callback_param line_range_param = {
1771                         .data = (void *)&lf, .retval = 0};
1772
1773                 dwarf_getpubnames(dbg->dbg, pubname_search_cb,
1774                                   &pubname_param, 0);
1775                 if (pubname_param.found) {
1776                         line_range_search_cb(&lf.sp_die, &line_range_param);
1777                         if (lf.found)
1778                                 goto found;
1779                 }
1780         }
1781
1782         /* Loop on CUs (Compilation Unit) */
1783         while (!lf.found && ret >= 0) {
1784                 if (dwarf_nextcu(dbg->dbg, off, &noff, &cuhl,
1785                                  NULL, NULL, NULL) != 0)
1786                         break;
1787
1788                 /* Get the DIE(Debugging Information Entry) of this CU */
1789                 diep = dwarf_offdie(dbg->dbg, off + cuhl, &lf.cu_die);
1790                 if (!diep)
1791                         continue;
1792
1793                 /* Check if target file is included. */
1794                 if (lr->file)
1795                         lf.fname = cu_find_realpath(&lf.cu_die, lr->file);
1796                 else
1797                         lf.fname = 0;
1798
1799                 if (!lr->file || lf.fname) {
1800                         if (lr->function)
1801                                 ret = find_line_range_by_func(&lf);
1802                         else {
1803                                 lf.lno_s = lr->start;
1804                                 lf.lno_e = lr->end;
1805                                 ret = find_line_range_by_line(NULL, &lf);
1806                         }
1807                 }
1808                 off = noff;
1809         }
1810
1811 found:
1812         /* Store comp_dir */
1813         if (lf.found) {
1814                 comp_dir = cu_get_comp_dir(&lf.cu_die);
1815                 if (comp_dir) {
1816                         lr->comp_dir = strdup(comp_dir);
1817                         if (!lr->comp_dir)
1818                                 ret = -ENOMEM;
1819                 }
1820         }
1821
1822         pr_debug("path: %s\n", lr->path);
1823         return (ret < 0) ? ret : lf.found;
1824 }
1825
1826 /*
1827  * Find a src file from a DWARF tag path. Prepend optional source path prefix
1828  * and chop off leading directories that do not exist. Result is passed back as
1829  * a newly allocated path on success.
1830  * Return 0 if file was found and readable, -errno otherwise.
1831  */
1832 int get_real_path(const char *raw_path, const char *comp_dir,
1833                          char **new_path)
1834 {
1835         const char *prefix = symbol_conf.source_prefix;
1836
1837         if (!prefix) {
1838                 if (raw_path[0] != '/' && comp_dir)
1839                         /* If not an absolute path, try to use comp_dir */
1840                         prefix = comp_dir;
1841                 else {
1842                         if (access(raw_path, R_OK) == 0) {
1843                                 *new_path = strdup(raw_path);
1844                                 return *new_path ? 0 : -ENOMEM;
1845                         } else
1846                                 return -errno;
1847                 }
1848         }
1849
1850         *new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
1851         if (!*new_path)
1852                 return -ENOMEM;
1853
1854         for (;;) {
1855                 sprintf(*new_path, "%s/%s", prefix, raw_path);
1856
1857                 if (access(*new_path, R_OK) == 0)
1858                         return 0;
1859
1860                 if (!symbol_conf.source_prefix) {
1861                         /* In case of searching comp_dir, don't retry */
1862                         zfree(new_path);
1863                         return -errno;
1864                 }
1865
1866                 switch (errno) {
1867                 case ENAMETOOLONG:
1868                 case ENOENT:
1869                 case EROFS:
1870                 case EFAULT:
1871                         raw_path = strchr(++raw_path, '/');
1872                         if (!raw_path) {
1873                                 zfree(new_path);
1874                                 return -ENOENT;
1875                         }
1876                         continue;
1877
1878                 default:
1879                         zfree(new_path);
1880                         return -errno;
1881                 }
1882         }
1883 }