]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - tools/perf/util/probe-finder.c
Merge remote-tracking branch 'tip/auto-latest'
[karo-tx-linux.git] / tools / perf / util / probe-finder.c
index b5247d777f0e9348d1b77e3f33813c5b7713bce4..e3074230f236ef13b077586bdd3678bde6525513 100644 (file)
@@ -456,11 +456,12 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
                        return -EINVAL;
                }
                if (field->name[0] == '[') {
-                       pr_err("Semantic error: %s is not a pointor"
+                       pr_err("Semantic error: %s is not a pointer"
                               " nor array.\n", varname);
                        return -EINVAL;
                }
-               if (field->ref) {
+               /* While prcessing unnamed field, we don't care about this */
+               if (field->ref && dwarf_diename(vr_die)) {
                        pr_err("Semantic error: %s must be referred by '.'\n",
                               field->name);
                        return -EINVAL;
@@ -491,6 +492,11 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
        }
        ref->offset += (long)offs;
 
+       /* If this member is unnamed, we need to reuse this field */
+       if (!dwarf_diename(die_mem))
+               return convert_variable_fields(die_mem, varname, field,
+                                               &ref, die_mem);
+
 next:
        /* Converting next field */
        if (field->next)
@@ -915,17 +921,13 @@ static int probe_point_search_cb(Dwarf_Die *sp_die, void *data)
                dwarf_decl_line(sp_die, &pf->lno);
                pf->lno += pp->line;
                param->retval = find_probe_point_by_line(pf);
-       } else if (!dwarf_func_inline(sp_die)) {
+       } else if (die_is_func_instance(sp_die)) {
+               /* Instances always have the entry address */
+               dwarf_entrypc(sp_die, &pf->addr);
                /* Real function */
                if (pp->lazy_line)
                        param->retval = find_probe_point_lazy(sp_die, pf);
                else {
-                       if (dwarf_entrypc(sp_die, &pf->addr) != 0) {
-                               pr_warning("Failed to get entry address of "
-                                          "%s.\n", dwarf_diename(sp_die));
-                               param->retval = -ENOENT;
-                               return DWARF_CB_ABORT;
-                       }
                        pf->addr += pp->offset;
                        /* TODO: Check the address in this function */
                        param->retval = call_probe_finder(sp_die, pf);
@@ -1349,11 +1351,8 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr,
        const char *fname = NULL, *func = NULL, *basefunc = NULL, *tmp;
        int baseline = 0, lineno = 0, ret = 0;
 
-       /* Adjust address with bias */
-       addr += dbg->bias;
-
        /* Find cu die */
-       if (!dwarf_addrdie(dbg->dbg, (Dwarf_Addr)addr - dbg->bias, &cudie)) {
+       if (!dwarf_addrdie(dbg->dbg, (Dwarf_Addr)addr, &cudie)) {
                pr_warning("Failed to find debug information for address %lx\n",
                           addr);
                ret = -EINVAL;
@@ -1536,7 +1535,7 @@ static int line_range_search_cb(Dwarf_Die *sp_die, void *data)
                pr_debug("New line range: %d to %d\n", lf->lno_s, lf->lno_e);
                lr->start = lf->lno_s;
                lr->end = lf->lno_e;
-               if (dwarf_func_inline(sp_die))
+               if (!die_is_func_instance(sp_die))
                        param->retval = die_walk_instances(sp_die,
                                                line_range_inline_cb, lf);
                else