map_groups.h 3.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __PERF_MAP_GROUPS_H
#define __PERF_MAP_GROUPS_H

#include <linux/refcount.h>
#include <linux/rbtree.h>
#include <stdio.h>
#include <stdbool.h>
#include <linux/types.h>
#include "rwsem.h"

struct ref_reloc_sym;
struct machine;
struct map;
struct thread;

struct maps {
	struct rb_root      entries;
	struct rb_root	    names;
	struct rw_semaphore lock;
};

void maps__insert(struct maps *maps, struct map *map);
void maps__remove(struct maps *maps, struct map *map);
struct map *maps__find(struct maps *maps, u64 addr);
struct map *maps__first(struct maps *maps);
struct map *map__next(struct map *map);
28 29 30 31 32 33 34

#define maps__for_each_entry(maps, map) \
	for (map = maps__first(maps); map; map = map__next(map))

#define maps__for_each_entry_safe(maps, map, next) \
	for (map = maps__first(maps), next = map__next(map); map; map = next, next = map__next(map))

35
struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp);
36 37 38 39 40 41 42 43
struct map *maps__first_by_name(struct maps *maps);
struct map *map__next_by_name(struct map *map);

#define maps__for_each_entry_by_name(maps, map) \
	for (map = maps__first_by_name(maps); map; map = map__next_by_name(map))

#define maps__for_each_entry_by_name_safe(maps, map, next) \
	for (map = maps__first_by_name(maps), next = map__next_by_name(map); map; map = next, next = map__next_by_name(map))
44 45 46 47 48

struct map_groups {
	struct maps	 maps;
	struct machine	 *machine;
	refcount_t	 refcnt;
49 50 51 52
#ifdef HAVE_LIBUNWIND_SUPPORT
	void				*addr_space;
	struct unwind_libunwind_ops	*unwind_libunwind_ops;
#endif
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
};

#define KMAP_NAME_LEN 256

struct kmap {
	struct ref_reloc_sym *ref_reloc_sym;
	struct map_groups    *kmaps;
	char		     name[KMAP_NAME_LEN];
};

struct map_groups *map_groups__new(struct machine *machine);
void map_groups__delete(struct map_groups *mg);
bool map_groups__empty(struct map_groups *mg);

static inline struct map_groups *map_groups__get(struct map_groups *mg)
{
	if (mg)
		refcount_inc(&mg->refcnt);
	return mg;
}

void map_groups__put(struct map_groups *mg);
void map_groups__init(struct map_groups *mg, struct machine *machine);
void map_groups__exit(struct map_groups *mg);
int map_groups__clone(struct thread *thread, struct map_groups *parent);
size_t map_groups__fprintf(struct map_groups *mg, FILE *fp);

void map_groups__insert(struct map_groups *mg, struct map *map);

static inline void map_groups__remove(struct map_groups *mg, struct map *map)
{
	maps__remove(&mg->maps, map);
}

static inline struct map *map_groups__find(struct map_groups *mg, u64 addr)
{
	return maps__find(&mg->maps, addr);
}

92 93
#define map_groups__for_each_entry(mg, map) \
	for (map = maps__first(&mg->maps); map; map = map__next(map))
94

95 96
#define map_groups__for_each_entry_safe(mg, map, next) \
	for (map = maps__first(&mg->maps), next = map__next(map); map; map = next, next = map__next(map))
97 98 99 100 101 102 103 104 105 106 107 108

struct symbol *map_groups__find_symbol(struct map_groups *mg, u64 addr, struct map **mapp);
struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg, const char *name, struct map **mapp);

struct addr_map_symbol;

int map_groups__find_ams(struct addr_map_symbol *ams);

int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map, FILE *fp);

struct map *map_groups__find_by_name(struct map_groups *mg, const char *name);

109 110
int map_groups__merge_in(struct map_groups *kmaps, struct map *new_map);

111
#endif // __PERF_MAP_GROUPS_H