Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 191142
b: refs/heads/master
c: 4b8cf84
h: refs/heads/master
v: v3
  • Loading branch information
Arnaldo Carvalho de Melo authored and Ingo Molnar committed Mar 26, 2010
1 parent 64935b3 commit d386cec
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 131 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b177f63f5226e75280855bbcd106e677250778bd
refs/heads/master: 4b8cf84624e9a58a21aaac3d064222092ae234e0
84 changes: 83 additions & 1 deletion trunk/tools/perf/util/map.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#include "symbol.h"
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "debug.h"
#include "map.h"

const char *map_type__name[MAP__NR_TYPES] = {
[MAP__FUNCTION] = "Functions",
Expand Down Expand Up @@ -232,3 +233,84 @@ u64 map__objdump_2ip(struct map *map, u64 addr)
map->unmap_ip(map, addr); /* RIP -> IP */
return ip;
}

struct symbol *map_groups__find_symbol(struct map_groups *self,
enum map_type type, u64 addr,
symbol_filter_t filter)
{
struct map *map = map_groups__find(self, type, addr);

if (map != NULL)
return map__find_symbol(map, map->map_ip(map, addr), filter);

return NULL;
}

static u64 map__reloc_map_ip(struct map *map, u64 ip)
{
return ip + (s64)map->pgoff;
}

static u64 map__reloc_unmap_ip(struct map *map, u64 ip)
{
return ip - (s64)map->pgoff;
}

void map__reloc_vmlinux(struct map *self)
{
struct kmap *kmap = map__kmap(self);
s64 reloc;

if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->unrelocated_addr)
return;

reloc = (kmap->ref_reloc_sym->unrelocated_addr -
kmap->ref_reloc_sym->addr);

if (!reloc)
return;

self->map_ip = map__reloc_map_ip;
self->unmap_ip = map__reloc_unmap_ip;
self->pgoff = reloc;
}

void maps__insert(struct rb_root *maps, struct map *map)
{
struct rb_node **p = &maps->rb_node;
struct rb_node *parent = NULL;
const u64 ip = map->start;
struct map *m;

while (*p != NULL) {
parent = *p;
m = rb_entry(parent, struct map, rb_node);
if (ip < m->start)
p = &(*p)->rb_left;
else
p = &(*p)->rb_right;
}

rb_link_node(&map->rb_node, parent, p);
rb_insert_color(&map->rb_node, maps);
}

struct map *maps__find(struct rb_root *maps, u64 ip)
{
struct rb_node **p = &maps->rb_node;
struct rb_node *parent = NULL;
struct map *m;

while (*p != NULL) {
parent = *p;
m = rb_entry(parent, struct map, rb_node);
if (ip < m->start)
p = &(*p)->rb_left;
else if (ip > m->end)
p = &(*p)->rb_right;
else
return m;
}

return NULL;
}
47 changes: 46 additions & 1 deletion trunk/tools/perf/util/map.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
#include <linux/compiler.h>
#include <linux/list.h>
#include <linux/rbtree.h>
#include <linux/types.h>
#include <stdio.h>
#include "types.h"

enum map_type {
MAP__FUNCTION = 0,
Expand Down Expand Up @@ -90,4 +91,48 @@ void map__fixup_end(struct map *self);

void map__reloc_vmlinux(struct map *self);

struct map_groups {
struct rb_root maps[MAP__NR_TYPES];
struct list_head removed_maps[MAP__NR_TYPES];
};

size_t __map_groups__fprintf_maps(struct map_groups *self,
enum map_type type, FILE *fp);
void maps__insert(struct rb_root *maps, struct map *map);
struct map *maps__find(struct rb_root *maps, u64 addr);
void map_groups__init(struct map_groups *self);
size_t map_groups__fprintf_maps(struct map_groups *self, FILE *fp);

static inline void map_groups__insert(struct map_groups *self, struct map *map)
{
maps__insert(&self->maps[map->type], map);
}

static inline struct map *map_groups__find(struct map_groups *self,
enum map_type type, u64 addr)
{
return maps__find(&self->maps[type], addr);
}

struct symbol *map_groups__find_symbol(struct map_groups *self,
enum map_type type, u64 addr,
symbol_filter_t filter);

static inline struct symbol *map_groups__find_function(struct map_groups *self,
u64 addr,
symbol_filter_t filter)
{
return map_groups__find_symbol(self, MAP__FUNCTION, addr, filter);
}

struct map *map_groups__find_by_name(struct map_groups *self,
enum map_type type, const char *name);
int __map_groups__create_kernel_maps(struct map_groups *self,
struct map *vmlinux_maps[MAP__NR_TYPES],
struct dso *kernel);
int map_groups__create_kernel_maps(struct map_groups *self,
struct map *vmlinux_maps[MAP__NR_TYPES]);
struct map *map_groups__new_module(struct map_groups *self, u64 start,
const char *filename);

#endif /* __PERF_MAP_H */
29 changes: 0 additions & 29 deletions trunk/tools/perf/util/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -544,32 +544,3 @@ int perf_session__set_kallsyms_ref_reloc_sym(struct perf_session *self,

return 0;
}

static u64 map__reloc_map_ip(struct map *map, u64 ip)
{
return ip + (s64)map->pgoff;
}

static u64 map__reloc_unmap_ip(struct map *map, u64 ip)
{
return ip - (s64)map->pgoff;
}

void map__reloc_vmlinux(struct map *self)
{
struct kmap *kmap = map__kmap(self);
s64 reloc;

if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->unrelocated_addr)
return;

reloc = (kmap->ref_reloc_sym->unrelocated_addr -
kmap->ref_reloc_sym->addr);

if (!reloc)
return;

self->map_ip = map__reloc_map_ip;
self->unmap_ip = map__reloc_unmap_ip;
self->pgoff = reloc;
}
53 changes: 0 additions & 53 deletions trunk/tools/perf/util/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -272,46 +272,6 @@ static int map_groups__fixup_overlappings(struct map_groups *self,
return 0;
}

void maps__insert(struct rb_root *maps, struct map *map)
{
struct rb_node **p = &maps->rb_node;
struct rb_node *parent = NULL;
const u64 ip = map->start;
struct map *m;

while (*p != NULL) {
parent = *p;
m = rb_entry(parent, struct map, rb_node);
if (ip < m->start)
p = &(*p)->rb_left;
else
p = &(*p)->rb_right;
}

rb_link_node(&map->rb_node, parent, p);
rb_insert_color(&map->rb_node, maps);
}

struct map *maps__find(struct rb_root *maps, u64 ip)
{
struct rb_node **p = &maps->rb_node;
struct rb_node *parent = NULL;
struct map *m;

while (*p != NULL) {
parent = *p;
m = rb_entry(parent, struct map, rb_node);
if (ip < m->start)
p = &(*p)->rb_left;
else if (ip > m->end)
p = &(*p)->rb_right;
else
return m;
}

return NULL;
}

void thread__insert_map(struct thread *self, struct map *map)
{
map_groups__fixup_overlappings(&self->mg, map);
Expand Down Expand Up @@ -367,16 +327,3 @@ size_t perf_session__fprintf(struct perf_session *self, FILE *fp)

return ret;
}

struct symbol *map_groups__find_symbol(struct map_groups *self,
enum map_type type, u64 addr,
symbol_filter_t filter)
{
struct map *map = map_groups__find(self, type, addr);

if (map != NULL)
return map__find_symbol(map, map->map_ip(map, addr), filter);

return NULL;
}

48 changes: 2 additions & 46 deletions trunk/tools/perf/util/thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,6 @@
#include <unistd.h>
#include "symbol.h"

struct map_groups {
struct rb_root maps[MAP__NR_TYPES];
struct list_head removed_maps[MAP__NR_TYPES];
};

size_t __map_groups__fprintf_maps(struct map_groups *self,
enum map_type type, FILE *fp);

struct thread {
struct rb_node rb_node;
struct map_groups mg;
Expand All @@ -23,30 +15,16 @@ struct thread {
int comm_len;
};

struct perf_session;

int find_all_tid(int pid, pid_t ** all_tid);
void map_groups__init(struct map_groups *self);
int thread__set_comm(struct thread *self, const char *comm);
int thread__comm_len(struct thread *self);
struct thread *perf_session__findnew(struct perf_session *self, pid_t pid);
void thread__insert_map(struct thread *self, struct map *map);
int thread__fork(struct thread *self, struct thread *parent);
size_t map_groups__fprintf_maps(struct map_groups *self, FILE *fp);
size_t perf_session__fprintf(struct perf_session *self, FILE *fp);

void maps__insert(struct rb_root *maps, struct map *map);
struct map *maps__find(struct rb_root *maps, u64 addr);

static inline void map_groups__insert(struct map_groups *self, struct map *map)
{
maps__insert(&self->maps[map->type], map);
}

static inline struct map *map_groups__find(struct map_groups *self,
enum map_type type, u64 addr)
{
return maps__find(&self->maps[type], addr);
}

static inline struct map *thread__find_map(struct thread *self,
enum map_type type, u64 addr)
{
Expand All @@ -63,26 +41,4 @@ void thread__find_addr_location(struct thread *self,
enum map_type type, u64 addr,
struct addr_location *al,
symbol_filter_t filter);
struct symbol *map_groups__find_symbol(struct map_groups *self,
enum map_type type, u64 addr,
symbol_filter_t filter);

static inline struct symbol *map_groups__find_function(struct map_groups *self,
u64 addr,
symbol_filter_t filter)
{
return map_groups__find_symbol(self, MAP__FUNCTION, addr, filter);
}

struct map *map_groups__find_by_name(struct map_groups *self,
enum map_type type, const char *name);

int __map_groups__create_kernel_maps(struct map_groups *self,
struct map *vmlinux_maps[MAP__NR_TYPES],
struct dso *kernel);
int map_groups__create_kernel_maps(struct map_groups *self,
struct map *vmlinux_maps[MAP__NR_TYPES]);

struct map *map_groups__new_module(struct map_groups *self, u64 start,
const char *filename);
#endif /* __PERF_THREAD_H */

0 comments on commit d386cec

Please sign in to comment.