Home | History | Annotate | Download | only in util
      1 #ifndef __PERF_MAP_H
      2 #define __PERF_MAP_H
      3 
      4 #include <linux/compiler.h>
      5 #include <linux/list.h>
      6 #include <linux/rbtree.h>
      7 #include <stdio.h>
      8 #include <stdbool.h>
      9 #include "types.h"
     10 
     11 enum map_type {
     12 	MAP__FUNCTION = 0,
     13 	MAP__VARIABLE,
     14 };
     15 
     16 #define MAP__NR_TYPES (MAP__VARIABLE + 1)
     17 
     18 extern const char *map_type__name[MAP__NR_TYPES];
     19 
     20 struct dso;
     21 struct ip_callchain;
     22 struct ref_reloc_sym;
     23 struct map_groups;
     24 struct machine;
     25 struct perf_evsel;
     26 
     27 struct map {
     28 	union {
     29 		struct rb_node	rb_node;
     30 		struct list_head node;
     31 	};
     32 	u64			start;
     33 	u64			end;
     34 	u8 /* enum map_type */	type;
     35 	bool			referenced;
     36 	bool			erange_warned;
     37 	u32			priv;
     38 	u64			pgoff;
     39 	u32			maj, min; /* only valid for MMAP2 record */
     40 	u64			ino;      /* only valid for MMAP2 record */
     41 	u64			ino_generation;/* only valid for MMAP2 record */
     42 
     43 	/* ip -> dso rip */
     44 	u64			(*map_ip)(struct map *, u64);
     45 	/* dso rip -> ip */
     46 	u64			(*unmap_ip)(struct map *, u64);
     47 
     48 	struct dso		*dso;
     49 	struct map_groups	*groups;
     50 };
     51 
     52 struct kmap {
     53 	struct ref_reloc_sym	*ref_reloc_sym;
     54 	struct map_groups	*kmaps;
     55 };
     56 
     57 struct map_groups {
     58 	struct rb_root	 maps[MAP__NR_TYPES];
     59 	struct list_head removed_maps[MAP__NR_TYPES];
     60 	struct machine	 *machine;
     61 };
     62 
     63 static inline struct kmap *map__kmap(struct map *map)
     64 {
     65 	return (struct kmap *)(map + 1);
     66 }
     67 
     68 static inline u64 map__map_ip(struct map *map, u64 ip)
     69 {
     70 	return ip - map->start + map->pgoff;
     71 }
     72 
     73 static inline u64 map__unmap_ip(struct map *map, u64 ip)
     74 {
     75 	return ip + map->start - map->pgoff;
     76 }
     77 
     78 static inline u64 identity__map_ip(struct map *map __maybe_unused, u64 ip)
     79 {
     80 	return ip;
     81 }
     82 
     83 
     84 /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
     85 u64 map__rip_2objdump(struct map *map, u64 rip);
     86 
     87 struct symbol;
     88 
     89 typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym);
     90 
     91 void map__init(struct map *map, enum map_type type,
     92 	       u64 start, u64 end, u64 pgoff, struct dso *dso);
     93 struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
     94 		     u64 pgoff, u32 pid, u32 d_maj, u32 d_min, u64 ino,
     95 		     u64 ino_gen,
     96 		     char *filename, enum map_type type);
     97 struct map *map__new2(u64 start, struct dso *dso, enum map_type type);
     98 void map__delete(struct map *map);
     99 struct map *map__clone(struct map *map);
    100 int map__overlap(struct map *l, struct map *r);
    101 size_t map__fprintf(struct map *map, FILE *fp);
    102 size_t map__fprintf_dsoname(struct map *map, FILE *fp);
    103 
    104 int map__load(struct map *map, symbol_filter_t filter);
    105 struct symbol *map__find_symbol(struct map *map,
    106 				u64 addr, symbol_filter_t filter);
    107 struct symbol *map__find_symbol_by_name(struct map *map, const char *name,
    108 					symbol_filter_t filter);
    109 void map__fixup_start(struct map *map);
    110 void map__fixup_end(struct map *map);
    111 
    112 void map__reloc_vmlinux(struct map *map);
    113 
    114 size_t __map_groups__fprintf_maps(struct map_groups *mg,
    115 				  enum map_type type, int verbose, FILE *fp);
    116 void maps__insert(struct rb_root *maps, struct map *map);
    117 void maps__remove(struct rb_root *maps, struct map *map);
    118 struct map *maps__find(struct rb_root *maps, u64 addr);
    119 struct map *maps__first(struct rb_root *maps);
    120 struct map *maps__next(struct map *map);
    121 void map_groups__init(struct map_groups *mg);
    122 void map_groups__exit(struct map_groups *mg);
    123 int map_groups__clone(struct map_groups *mg,
    124 		      struct map_groups *parent, enum map_type type);
    125 size_t map_groups__fprintf(struct map_groups *mg, int verbose, FILE *fp);
    126 size_t map_groups__fprintf_maps(struct map_groups *mg, int verbose, FILE *fp);
    127 
    128 int maps__set_kallsyms_ref_reloc_sym(struct map **maps, const char *symbol_name,
    129 				     u64 addr);
    130 
    131 static inline void map_groups__insert(struct map_groups *mg, struct map *map)
    132 {
    133 	maps__insert(&mg->maps[map->type], map);
    134 	map->groups = mg;
    135 }
    136 
    137 static inline void map_groups__remove(struct map_groups *mg, struct map *map)
    138 {
    139 	maps__remove(&mg->maps[map->type], map);
    140 }
    141 
    142 static inline struct map *map_groups__find(struct map_groups *mg,
    143 					   enum map_type type, u64 addr)
    144 {
    145 	return maps__find(&mg->maps[type], addr);
    146 }
    147 
    148 static inline struct map *map_groups__first(struct map_groups *mg,
    149 					    enum map_type type)
    150 {
    151 	return maps__first(&mg->maps[type]);
    152 }
    153 
    154 static inline struct map *map_groups__next(struct map *map)
    155 {
    156 	return maps__next(map);
    157 }
    158 
    159 struct symbol *map_groups__find_symbol(struct map_groups *mg,
    160 				       enum map_type type, u64 addr,
    161 				       struct map **mapp,
    162 				       symbol_filter_t filter);
    163 
    164 struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg,
    165 					       enum map_type type,
    166 					       const char *name,
    167 					       struct map **mapp,
    168 					       symbol_filter_t filter);
    169 
    170 static inline
    171 struct symbol *map_groups__find_function_by_name(struct map_groups *mg,
    172 						 const char *name, struct map **mapp,
    173 						 symbol_filter_t filter)
    174 {
    175 	return map_groups__find_symbol_by_name(mg, MAP__FUNCTION, name, mapp, filter);
    176 }
    177 
    178 int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map,
    179 				   int verbose, FILE *fp);
    180 
    181 struct map *map_groups__find_by_name(struct map_groups *mg,
    182 				     enum map_type type, const char *name);
    183 
    184 void map_groups__flush(struct map_groups *mg);
    185 
    186 #endif /* __PERF_MAP_H */
    187