perf tools: Pass build_id object to build_id__sprintf()
authorJiri Olsa <jolsa@kernel.org>
Tue, 13 Oct 2020 19:24:36 +0000 (21:24 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 14 Oct 2020 11:46:22 +0000 (08:46 -0300)
Passing build_id object to build_id__sprintf function, so it can operate
with the proper size of build id.

This will create proper md5 build id readable names,
like following:

  a50e350e97c43b4708d09bcd85ebfff7

instead of:

  a50e350e97c43b4708d09bcd85ebfff700000000

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20201013192441.1299447-5-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
12 files changed:
tools/perf/builtin-buildid-cache.c
tools/perf/tests/sdt.c
tools/perf/util/annotate.c
tools/perf/util/build-id.c
tools/perf/util/build-id.h
tools/perf/util/dso.c
tools/perf/util/header.c
tools/perf/util/map.c
tools/perf/util/probe-event.c
tools/perf/util/probe-finder.c
tools/perf/util/scripting-engines/trace-event-python.c
tools/perf/util/symbol.c

index c3cb168..a254119 100644 (file)
@@ -186,7 +186,7 @@ static int build_id_cache__add_file(const char *filename, struct nsinfo *nsi)
                return -1;
        }
 
-       build_id__sprintf(bid.data, sizeof(bid.data), sbuild_id);
+       build_id__sprintf(&bid, sbuild_id);
        err = build_id_cache__add_s(sbuild_id, filename, nsi,
                                    false, false);
        pr_debug("Adding %s %s: %s\n", sbuild_id, filename,
@@ -210,7 +210,7 @@ static int build_id_cache__remove_file(const char *filename, struct nsinfo *nsi)
                return -1;
        }
 
-       build_id__sprintf(bid.data, sizeof(bid.data), sbuild_id);
+       build_id__sprintf(&bid, sbuild_id);
        err = build_id_cache__remove_s(sbuild_id);
        pr_debug("Removing %s %s: %s\n", sbuild_id, filename,
                 err ? "FAIL" : "Ok");
@@ -314,7 +314,7 @@ static int build_id_cache__update_file(const char *filename, struct nsinfo *nsi)
        }
        err = 0;
 
-       build_id__sprintf(bid.data, sizeof(bid.data), sbuild_id);
+       build_id__sprintf(&bid, sbuild_id);
        if (build_id_cache__cached(sbuild_id))
                err = build_id_cache__remove_s(sbuild_id);
 
index 3ef37f7..ed76c69 100644 (file)
@@ -37,7 +37,7 @@ static int build_id_cache__add_file(const char *filename)
                return err;
        }
 
-       build_id__sprintf(bid.data, sizeof(bid.data), sbuild_id);
+       build_id__sprintf(&bid, sbuild_id);
        err = build_id_cache__add_s(sbuild_id, filename, NULL, false, false);
        if (err < 0)
                pr_debug("Failed to add build id cache of %s\n", filename);
index a016e1b..6c8575e 100644 (file)
@@ -1578,8 +1578,7 @@ int symbol__strerror_disassemble(struct map_symbol *ms, int errnum, char *buf, s
                char *build_id_msg = NULL;
 
                if (dso->has_build_id) {
-                       build_id__sprintf(dso->bid.data,
-                                         sizeof(dso->bid.data), bf + 15);
+                       build_id__sprintf(&dso->bid, bf + 15);
                        build_id_msg = bf;
                }
                scnprintf(buf, buflen,
index 1c332e7..b564873 100644 (file)
@@ -37,6 +37,7 @@
 
 #include <linux/ctype.h>
 #include <linux/zalloc.h>
+#include <asm/bug.h>
 
 static bool no_buildid_cache;
 
@@ -95,13 +96,13 @@ struct perf_tool build_id__mark_dso_hit_ops = {
        .ordered_events  = true,
 };
 
-int build_id__sprintf(const u8 *build_id, int len, char *bf)
+int build_id__sprintf(const struct build_id *build_id, char *bf)
 {
        char *bid = bf;
-       const u8 *raw = build_id;
-       int i;
+       const u8 *raw = build_id->data;
+       size_t i;
 
-       for (i = 0; i < len; ++i) {
+       for (i = 0; i < build_id->size; ++i) {
                sprintf(bid, "%02x", *raw);
                ++raw;
                bid += 2;
@@ -125,7 +126,7 @@ int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id)
        if (ret < 0)
                return ret;
 
-       return build_id__sprintf(bid.data, sizeof(bid.data), sbuild_id);
+       return build_id__sprintf(&bid, sbuild_id);
 }
 
 int filename__sprintf_build_id(const char *pathname, char *sbuild_id)
@@ -137,7 +138,7 @@ int filename__sprintf_build_id(const char *pathname, char *sbuild_id)
        if (ret < 0)
                return ret;
 
-       return build_id__sprintf(bid.data, sizeof(bid.data), sbuild_id);
+       return build_id__sprintf(&bid, sbuild_id);
 }
 
 /* asnprintf consolidates asprintf and snprintf */
@@ -270,7 +271,7 @@ char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
        if (!dso->has_build_id)
                return NULL;
 
-       build_id__sprintf(dso->bid.data, sizeof(dso->bid.data), sbuild_id);
+       build_id__sprintf(&dso->bid, sbuild_id);
        linkname = build_id_cache__linkname(sbuild_id, NULL, 0);
        if (!linkname)
                return NULL;
@@ -767,13 +768,13 @@ out_free:
        return err;
 }
 
-static int build_id_cache__add_b(const u8 *build_id, size_t build_id_size,
+static int build_id_cache__add_b(const struct build_id *bid,
                                 const char *name, struct nsinfo *nsi,
                                 bool is_kallsyms, bool is_vdso)
 {
        char sbuild_id[SBUILD_ID_SIZE];
 
-       build_id__sprintf(build_id, build_id_size, sbuild_id);
+       build_id__sprintf(bid, sbuild_id);
 
        return build_id_cache__add_s(sbuild_id, name, nsi, is_kallsyms,
                                     is_vdso);
@@ -839,8 +840,8 @@ static int dso__cache_build_id(struct dso *dso, struct machine *machine)
                is_kallsyms = true;
                name = machine->mmap_name;
        }
-       return build_id_cache__add_b(dso->bid.data, sizeof(dso->bid.data), name,
-                                    dso->nsinfo, is_kallsyms, is_vdso);
+       return build_id_cache__add_b(&dso->bid, name, dso->nsinfo,
+                                    is_kallsyms, is_vdso);
 }
 
 static int __dsos__cache_build_ids(struct list_head *head,
@@ -900,3 +901,10 @@ bool perf_session__read_build_ids(struct perf_session *session, bool with_hits)
 
        return ret;
 }
+
+void build_id__init(struct build_id *bid, const u8 *data, size_t size)
+{
+       WARN_ON(size > BUILD_ID_SIZE);
+       memcpy(bid->data, data, size);
+       bid->size = size;
+}
index 5033e96..f293f99 100644 (file)
@@ -19,7 +19,8 @@ extern struct perf_tool build_id__mark_dso_hit_ops;
 struct dso;
 struct feat_fd;
 
-int build_id__sprintf(const u8 *build_id, int len, char *bf);
+void build_id__init(struct build_id *bid, const u8 *data, size_t size);
+int build_id__sprintf(const struct build_id *build_id, char *bf);
 int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id);
 int filename__sprintf_build_id(const char *pathname, char *sbuild_id);
 char *build_id_cache__kallsyms_path(const char *sbuild_id, char *bf,
index e87fa9a..2f7f01e 100644 (file)
@@ -172,9 +172,7 @@ int dso__read_binary_type_filename(const struct dso *dso,
                        break;
                }
 
-               build_id__sprintf(dso->bid.data,
-                                 sizeof(dso->bid.data),
-                                 build_id_hex);
+               build_id__sprintf(&dso->bid, build_id_hex);
                len = __symbol__join_symfs(filename, size, "/usr/lib/debug/.build-id/");
                snprintf(filename + len, size - len, "%.2s/%s.debug",
                         build_id_hex, build_id_hex + 2);
@@ -1374,7 +1372,7 @@ size_t dso__fprintf_buildid(struct dso *dso, FILE *fp)
 {
        char sbuild_id[SBUILD_ID_SIZE];
 
-       build_id__sprintf(dso->bid.data, sizeof(dso->bid.data), sbuild_id);
+       build_id__sprintf(&dso->bid, sbuild_id);
        return fprintf(fp, "%s", sbuild_id);
 }
 
index cde8f6e..fe220f0 100644 (file)
@@ -2095,8 +2095,7 @@ static int __event_process_build_id(struct perf_record_header_build_id *bev,
                        free(m.name);
                }
 
-               build_id__sprintf(dso->bid.data, sizeof(dso->bid.data),
-                                 sbuild_id);
+               build_id__sprintf(&dso->bid, sbuild_id);
                pr_debug("build id event received for %s: %s\n",
                         dso->long_name, sbuild_id);
                dso__put(dso);
index 522df30..f44ede4 100644 (file)
@@ -331,9 +331,7 @@ int map__load(struct map *map)
                if (map->dso->has_build_id) {
                        char sbuild_id[SBUILD_ID_SIZE];
 
-                       build_id__sprintf(map->dso->bid.data,
-                                         sizeof(map->dso->bid.data),
-                                         sbuild_id);
+                       build_id__sprintf(&map->dso->bid, sbuild_id);
                        pr_debug("%s with build id %s not found", name, sbuild_id);
                } else
                        pr_debug("Failed to open %s", name);
index 2041ad8..8eae2af 100644 (file)
@@ -473,7 +473,7 @@ static struct debuginfo *open_from_debuginfod(struct dso *dso, struct nsinfo *ns
        if (!c)
                return NULL;
 
-       build_id__sprintf(dso->bid.data, BUILD_ID_SIZE, sbuild_id);
+       build_id__sprintf(&dso->bid, sbuild_id);
        fd = debuginfod_find_debuginfo(c, (const unsigned char *)sbuild_id,
                                        0, &path);
        if (fd >= 0)
@@ -1005,6 +1005,7 @@ static int _show_one_line(FILE *fp, int l, bool skip, bool show_num)
 static int __show_line_range(struct line_range *lr, const char *module,
                             bool user)
 {
+       struct build_id bid;
        int l = 1;
        struct int_node *ln;
        struct debuginfo *dinfo;
@@ -1025,8 +1026,10 @@ static int __show_line_range(struct line_range *lr, const char *module,
                if (!ret)
                        ret = debuginfo__find_line_range(dinfo, lr);
        }
-       if (dinfo->build_id)
-               build_id__sprintf(dinfo->build_id, BUILD_ID_SIZE, sbuild_id);
+       if (dinfo->build_id) {
+               build_id__init(&bid, dinfo->build_id, BUILD_ID_SIZE);
+               build_id__sprintf(&bid, sbuild_id);
+       }
        debuginfo__delete(dinfo);
        if (ret == 0 || ret == -ENOENT) {
                pr_warning("Specified source line is not found.\n");
index 6eddf7b..2c40610 100644 (file)
@@ -949,6 +949,7 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
 /* Find probe points from lazy pattern  */
 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
 {
+       struct build_id bid;
        char sbuild_id[SBUILD_ID_SIZE] = "";
        int ret = 0;
        char *fpath;
@@ -957,9 +958,10 @@ static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
                const char *comp_dir;
 
                comp_dir = cu_get_comp_dir(&pf->cu_die);
-               if (pf->dbg->build_id)
-                       build_id__sprintf(pf->dbg->build_id,
-                                       BUILD_ID_SIZE, sbuild_id);
+               if (pf->dbg->build_id) {
+                       build_id__init(&bid, pf->dbg->build_id, BUILD_ID_SIZE);
+                       build_id__sprintf(&bid, sbuild_id);
+               }
                ret = find_source_path(pf->fname, sbuild_id, comp_dir, &fpath);
                if (ret < 0) {
                        pr_warning("Failed to find source file path.\n");
index db3b1c2..7cbd024 100644 (file)
@@ -1064,7 +1064,7 @@ static int python_export_dso(struct db_export *dbe, struct dso *dso,
        char sbuild_id[SBUILD_ID_SIZE];
        PyObject *t;
 
-       build_id__sprintf(dso->bid.data, sizeof(dso->bid.data), sbuild_id);
+       build_id__sprintf(&dso->bid, sbuild_id);
 
        t = tuple_new(5);
 
index dd1cf91..369cbad 100644 (file)
@@ -2152,7 +2152,7 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map)
                        goto proc_kallsyms;
        }
 
-       build_id__sprintf(dso->bid.data, sizeof(dso->bid.data), sbuild_id);
+       build_id__sprintf(&dso->bid, sbuild_id);
 
        /* Find kallsyms in build-id cache with kcore */
        scnprintf(path, sizeof(path), "%s/%s/%s",