Merge remote-tracking branches 'asoc/fix/blackfin', 'asoc/fix/da9055', 'asoc/fix...
[firefly-linux-kernel-4.4.55.git] / tools / perf / util / map.c
index 9b9bd719aa197d0a240809834109581a57d810b2..39cd2d0faff65667b32738a8788817b6c670cedb 100644 (file)
@@ -39,6 +39,7 @@ void map__init(struct map *map, enum map_type type,
        map->start    = start;
        map->end      = end;
        map->pgoff    = pgoff;
+       map->reloc    = 0;
        map->dso      = dso;
        map->map_ip   = map__map_ip;
        map->unmap_ip = map__unmap_ip;
@@ -69,7 +70,7 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
                map->ino = ino;
                map->ino_generation = ino_gen;
 
-               if (anon) {
+               if ((anon || no_dso) && type == MAP__FUNCTION) {
                        snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", pid);
                        filename = newfilename;
                }
@@ -93,7 +94,7 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
                         * functions still return NULL, and we avoid the
                         * unnecessary map__load warning.
                         */
-                       if (no_dso)
+                       if (type != MAP__FUNCTION)
                                dso__set_loaded(dso, map->type);
                }
        }
@@ -288,7 +289,7 @@ u64 map__rip_2objdump(struct map *map, u64 rip)
        if (map->dso->rel)
                return rip - map->pgoff;
 
-       return map->unmap_ip(map, rip);
+       return map->unmap_ip(map, rip) - map->reloc;
 }
 
 /**
@@ -311,7 +312,7 @@ u64 map__objdump_2mem(struct map *map, u64 ip)
        if (map->dso->rel)
                return map->unmap_ip(map, ip + map->pgoff);
 
-       return ip;
+       return ip + map->reloc;
 }
 
 void map_groups__init(struct map_groups *mg)
@@ -386,7 +387,8 @@ struct symbol *map_groups__find_symbol(struct map_groups *mg,
 {
        struct map *map = map_groups__find(mg, type, addr);
 
-       if (map != NULL) {
+       /* Ensure map is loaded before using map->map_ip */
+       if (map != NULL && map__load(map, filter) >= 0) {
                if (mapp != NULL)
                        *mapp = map;
                return map__find_symbol(map, map->map_ip(map, addr), filter);