perf tools: Update copy of libbpf's hashmap.c
[linux-2.6-microblaze.git] / tools / perf / util / build-id.c
index 31207b6..8763772 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;
@@ -113,7 +114,7 @@ int build_id__sprintf(const u8 *build_id, int len, char *bf)
 int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id)
 {
        char notes[PATH_MAX];
-       u8 build_id[BUILD_ID_SIZE];
+       struct build_id bid;
        int ret;
 
        if (!root_dir)
@@ -121,25 +122,23 @@ int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id)
 
        scnprintf(notes, sizeof(notes), "%s/sys/kernel/notes", root_dir);
 
-       ret = sysfs__read_build_id(notes, build_id, sizeof(build_id));
+       ret = sysfs__read_build_id(notes, &bid);
        if (ret < 0)
                return ret;
 
-       return build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
+       return build_id__sprintf(&bid, sbuild_id);
 }
 
 int filename__sprintf_build_id(const char *pathname, char *sbuild_id)
 {
-       u8 build_id[BUILD_ID_SIZE];
+       struct build_id bid;
        int ret;
 
-       ret = filename__read_build_id(pathname, build_id, sizeof(build_id));
+       ret = filename__read_build_id(pathname, &bid);
        if (ret < 0)
                return ret;
-       else if (ret != sizeof(build_id))
-               return -EINVAL;
 
-       return build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
+       return build_id__sprintf(&bid, sbuild_id);
 }
 
 /* asnprintf consolidates asprintf and snprintf */
@@ -272,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->build_id, sizeof(dso->build_id), sbuild_id);
+       build_id__sprintf(&dso->bid, sbuild_id);
        linkname = build_id_cache__linkname(sbuild_id, NULL, 0);
        if (!linkname)
                return NULL;
@@ -297,7 +296,7 @@ char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size,
                        continue;               \
                else
 
-static int write_buildid(const char *name, size_t name_len, u8 *build_id,
+static int write_buildid(const char *name, size_t name_len, struct build_id *bid,
                         pid_t pid, u16 misc, struct feat_fd *fd)
 {
        int err;
@@ -308,7 +307,9 @@ static int write_buildid(const char *name, size_t name_len, u8 *build_id,
        len = PERF_ALIGN(len, NAME_ALIGN);
 
        memset(&b, 0, sizeof(b));
-       memcpy(&b.build_id, build_id, BUILD_ID_SIZE);
+       memcpy(&b.data, bid->data, bid->size);
+       b.size = (u8) bid->size;
+       misc |= PERF_RECORD_MISC_BUILD_ID_SIZE;
        b.pid = pid;
        b.header.misc = misc;
        b.header.size = sizeof(b) + len;
@@ -355,7 +356,7 @@ static int machine__write_buildid_table(struct machine *machine,
                in_kernel = pos->kernel ||
                                is_kernel_module(name,
                                        PERF_RECORD_MISC_CPUMODE_UNKNOWN);
-               err = write_buildid(name, name_len, pos->build_id, machine->pid,
+               err = write_buildid(name, name_len, &pos->bid, machine->pid,
                                    in_kernel ? kmisc : umisc, fd);
                if (err)
                        break;
@@ -769,13 +770,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);
@@ -841,8 +842,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->build_id, sizeof(dso->build_id), 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,
@@ -902,3 +903,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;
+}