perf annotate: Defer allocating sym_priv->hist array
[pandora-kernel.git] / tools / perf / util / symbol.c
index e752837..323c0ae 100644 (file)
@@ -137,14 +137,14 @@ static struct symbol *symbol__new(u64 start, u64 len, const char *name)
        self->start = start;
        self->end   = len ? start + len - 1 : start;
 
-       pr_debug3("%s: %s %#Lx-%#Lx\n", __func__, name, start, self->end);
+       pr_debug4("%s: %s %#Lx-%#Lx\n", __func__, name, start, self->end);
 
        memcpy(self->name, name, namelen);
 
        return self;
 }
 
-static void symbol__delete(struct symbol *self)
+void symbol__delete(struct symbol *self)
 {
        free(((void *)self) - symbol_conf.priv_size);
 }
@@ -367,6 +367,10 @@ size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp)
        struct rb_node *nd;
        size_t ret = fprintf(fp, "dso: %s (", self->short_name);
 
+       if (self->short_name != self->long_name)
+               ret += fprintf(fp, "%s, ", self->long_name);
+       ret += fprintf(fp, "%s, %sloaded, ", map_type__name[type],
+                      self->loaded ? "" : "NOT ");
        ret += dso__fprintf_buildid(self, fp);
        ret += fprintf(fp, ")\n");
        for (nd = rb_first(&self->symbols[type]); nd; nd = rb_next(nd)) {
@@ -527,7 +531,7 @@ static int dso__split_kallsyms(struct dso *self, struct map *map,
                                return -1;
 
                        curr_map = map__new2(pos->start, dso, map->type);
-                       if (map == NULL) {
+                       if (curr_map == NULL) {
                                dso__delete(dso);
                                return -1;
                        }
@@ -1024,9 +1028,10 @@ static int dso__load_sym(struct dso *self, struct map *map, const char *name,
                }
 
                if (curr_dso->adjust_symbols) {
-                       pr_debug2("adjusting symbol: st_value: %Lx sh_addr: "
-                                 "%Lx sh_offset: %Lx\n", (u64)sym.st_value,
-                                 (u64)shdr.sh_addr, (u64)shdr.sh_offset);
+                       pr_debug4("%s: adjusting symbol: st_value: %#Lx "
+                                 "sh_addr: %#Lx sh_offset: %#Lx\n", __func__,
+                                 (u64)sym.st_value, (u64)shdr.sh_addr,
+                                 (u64)shdr.sh_offset);
                        sym.st_value -= shdr.sh_addr - shdr.sh_offset;
                }
                /*
@@ -1076,25 +1081,28 @@ static bool dso__build_id_equal(const struct dso *self, u8 *build_id)
        return memcmp(self->build_id, build_id, sizeof(self->build_id)) == 0;
 }
 
-static bool __dsos__read_build_ids(struct list_head *head)
+static bool __dsos__read_build_ids(struct list_head *head, bool with_hits)
 {
        bool have_build_id = false;
        struct dso *pos;
 
-       list_for_each_entry(pos, head, node)
+       list_for_each_entry(pos, head, node) {
+               if (with_hits && !pos->hit)
+                       continue;
                if (filename__read_build_id(pos->long_name, pos->build_id,
                                            sizeof(pos->build_id)) > 0) {
                        have_build_id     = true;
                        pos->has_build_id = true;
                }
+       }
 
        return have_build_id;
 }
 
-bool dsos__read_build_ids(void)
+bool dsos__read_build_ids(bool with_hits)
 {
-       bool kbuildids = __dsos__read_build_ids(&dsos__kernel),
-            ubuildids = __dsos__read_build_ids(&dsos__user);
+       bool kbuildids = __dsos__read_build_ids(&dsos__kernel, with_hits),
+            ubuildids = __dsos__read_build_ids(&dsos__user, with_hits);
        return kbuildids || ubuildids;
 }
 
@@ -1576,6 +1584,9 @@ static int dso__load_vmlinux(struct dso *self, struct map *map,
        err = dso__load_sym(self, map, vmlinux, fd, filter, 0);
        close(fd);
 
+       if (err > 0)
+               pr_debug("Using %s for symbols\n", vmlinux);
+
        return err;
 }
 
@@ -1590,7 +1601,6 @@ int dso__load_vmlinux_path(struct dso *self, struct map *map,
        for (i = 0; i < vmlinux_path__nr_entries; ++i) {
                err = dso__load_vmlinux(self, map, vmlinux_path[i], filter);
                if (err > 0) {
-                       pr_debug("Using %s for symbols\n", vmlinux_path[i]);
                        dso__set_long_name(self, strdup(vmlinux_path[i]));
                        break;
                }
@@ -1657,12 +1667,16 @@ static int dso__load_kernel_sym(struct dso *self, struct map *map,
 
                if (asprintf(&kallsyms_allocated_filename,
                             "%s/.debug/[kernel.kallsyms]/%s",
-                            getenv("HOME"), sbuild_id) == -1)
+                            getenv("HOME"), sbuild_id) == -1) {
+                       pr_err("Not enough memory for kallsyms file lookup\n");
                        return -1;
+               }
 
                kallsyms_filename = kallsyms_allocated_filename;
 
                if (access(kallsyms_filename, F_OK)) {
+                       pr_err("No kallsyms or vmlinux with build-id %s "
+                              "was found\n", sbuild_id);
                        free(kallsyms_allocated_filename);
                        return -1;
                }
@@ -1676,6 +1690,8 @@ static int dso__load_kernel_sym(struct dso *self, struct map *map,
 
 do_kallsyms:
        err = dso__load_kallsyms(self, kallsyms_filename, map, filter);
+       if (err > 0)
+               pr_debug("Using %s for symbols\n", kallsyms_filename);
        free(kallsyms_allocated_filename);
 
 out_try_fixup:
@@ -1933,7 +1949,7 @@ int map_groups__create_kernel_maps(struct map_groups *self,
                return -1;
 
        if (symbol_conf.use_modules && map_groups__create_modules(self) < 0)
-               return -1;
+               pr_debug("Problems creating module maps, continuing anyway...\n");
        /*
         * Now that we have all the maps created, just set the ->end of them:
         */