diff options
Diffstat (limited to 'tools/perf/util/map.h')
-rw-r--r-- | tools/perf/util/map.h | 144 |
1 files changed, 132 insertions, 12 deletions
diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h index 3dcfe06db6b3..823ab7fc0acf 100644 --- a/tools/perf/util/map.h +++ b/tools/perf/util/map.h @@ -10,16 +10,13 @@ #include <string.h> #include <stdbool.h> #include <linux/types.h> +#include <internal/rc_check.h> struct dso; struct maps; struct machine; -struct map { - union { - struct rb_node rb_node; - struct list_head node; - }; +DECLARE_RC_STRUCT(map) { u64 start; u64 end; bool erange_warned:1; @@ -45,15 +42,85 @@ struct kmap *map__kmap(struct map *map); struct maps *map__kmaps(struct map *map); /* ip -> dso rip */ -u64 map__map_ip(const struct map *map, u64 ip); +u64 map__dso_map_ip(const struct map *map, u64 ip); /* dso rip -> ip */ -u64 map__unmap_ip(const struct map *map, u64 ip); +u64 map__dso_unmap_ip(const struct map *map, u64 ip); /* Returns ip */ u64 identity__map_ip(const struct map *map __maybe_unused, u64 ip); +static inline struct dso *map__dso(const struct map *map) +{ + return RC_CHK_ACCESS(map)->dso; +} + +static inline u64 map__map_ip(const struct map *map, u64 ip) +{ + return RC_CHK_ACCESS(map)->map_ip(map, ip); +} + +static inline u64 map__unmap_ip(const struct map *map, u64 ip) +{ + return RC_CHK_ACCESS(map)->unmap_ip(map, ip); +} + +static inline void *map__map_ip_ptr(struct map *map) +{ + return RC_CHK_ACCESS(map)->map_ip; +} + +static inline void* map__unmap_ip_ptr(struct map *map) +{ + return RC_CHK_ACCESS(map)->unmap_ip; +} + +static inline u64 map__start(const struct map *map) +{ + return RC_CHK_ACCESS(map)->start; +} + +static inline u64 map__end(const struct map *map) +{ + return RC_CHK_ACCESS(map)->end; +} + +static inline u64 map__pgoff(const struct map *map) +{ + return RC_CHK_ACCESS(map)->pgoff; +} + +static inline u64 map__reloc(const struct map *map) +{ + return RC_CHK_ACCESS(map)->reloc; +} + +static inline u32 map__flags(const struct map *map) +{ + return RC_CHK_ACCESS(map)->flags; +} + +static inline u32 map__prot(const struct map *map) +{ + return RC_CHK_ACCESS(map)->prot; +} + +static inline bool map__priv(const struct map *map) +{ + return RC_CHK_ACCESS(map)->priv; +} + +static inline refcount_t *map__refcnt(struct map *map) +{ + return &RC_CHK_ACCESS(map)->refcnt; +} + +static inline bool map__erange_warned(struct map *map) +{ + return RC_CHK_ACCESS(map)->erange_warned; +} + static inline size_t map__size(const struct map *map) { - return map->end - map->start; + return map__end(map) - map__start(map); } /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */ @@ -73,7 +140,7 @@ struct thread; * Note: caller must ensure map->dso is not NULL (map is loaded). */ #define map__for_each_symbol(map, pos, n) \ - dso__for_each_symbol(map->dso, pos, n) + dso__for_each_symbol(map__dso(map), pos, n) /* map__for_each_symbol_with_name - iterate over the symbols in the given map * that have the given name @@ -107,9 +174,12 @@ struct map *map__clone(struct map *map); static inline struct map *map__get(struct map *map) { - if (map) - refcount_inc(&map->refcnt); - return map; + struct map *result; + + if (RC_CHK_GET(result, map)) + refcount_inc(map__refcnt(map)); + + return result; } void map__put(struct map *map); @@ -180,4 +250,54 @@ static inline int is_no_dso_memory(const char *filename) !strncmp(filename, "/SYSV", 5) || !strcmp(filename, "[heap]"); } + +static inline void map__set_start(struct map *map, u64 start) +{ + RC_CHK_ACCESS(map)->start = start; +} + +static inline void map__set_end(struct map *map, u64 end) +{ + RC_CHK_ACCESS(map)->end = end; +} + +static inline void map__set_pgoff(struct map *map, u64 pgoff) +{ + RC_CHK_ACCESS(map)->pgoff = pgoff; +} + +static inline void map__add_pgoff(struct map *map, u64 inc) +{ + RC_CHK_ACCESS(map)->pgoff += inc; +} + +static inline void map__set_reloc(struct map *map, u64 reloc) +{ + RC_CHK_ACCESS(map)->reloc = reloc; +} + +static inline void map__set_priv(struct map *map, int priv) +{ + RC_CHK_ACCESS(map)->priv = priv; +} + +static inline void map__set_erange_warned(struct map *map, bool erange_warned) +{ + RC_CHK_ACCESS(map)->erange_warned = erange_warned; +} + +static inline void map__set_dso(struct map *map, struct dso *dso) +{ + RC_CHK_ACCESS(map)->dso = dso; +} + +static inline void map__set_map_ip(struct map *map, u64 (*map_ip)(const struct map *map, u64 ip)) +{ + RC_CHK_ACCESS(map)->map_ip = map_ip; +} + +static inline void map__set_unmap_ip(struct map *map, u64 (*unmap_ip)(const struct map *map, u64 rip)) +{ + RC_CHK_ACCESS(map)->unmap_ip = unmap_ip; +} #endif /* __PERF_MAP_H */ |