diff options
Diffstat (limited to 'tools/perf/util/symbol.h')
| -rw-r--r-- | tools/perf/util/symbol.h | 114 |
1 files changed, 97 insertions, 17 deletions
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 8aded2356f79..5e02d2c17154 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
| @@ -3,10 +3,13 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | #include <stdbool.h> | 5 | #include <stdbool.h> |
| 6 | #include "types.h" | 6 | #include <stdint.h> |
| 7 | #include "map.h" | ||
| 7 | #include <linux/list.h> | 8 | #include <linux/list.h> |
| 8 | #include <linux/rbtree.h> | 9 | #include <linux/rbtree.h> |
| 9 | #include "event.h" | 10 | #include <stdio.h> |
| 11 | |||
| 12 | #define DEBUG_CACHE_DIR ".debug" | ||
| 10 | 13 | ||
| 11 | #ifdef HAVE_CPLUS_DEMANGLE | 14 | #ifdef HAVE_CPLUS_DEMANGLE |
| 12 | extern char *cplus_demangle(const char *, int); | 15 | extern char *cplus_demangle(const char *, int); |
| @@ -27,6 +30,9 @@ static inline char *bfd_demangle(void __used *v, const char __used *c, | |||
| 27 | #endif | 30 | #endif |
| 28 | #endif | 31 | #endif |
| 29 | 32 | ||
| 33 | int hex2u64(const char *ptr, u64 *val); | ||
| 34 | char *strxfrchar(char *s, char from, char to); | ||
| 35 | |||
| 30 | /* | 36 | /* |
| 31 | * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP; | 37 | * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP; |
| 32 | * for newer versions we can use mmap to reduce memory usage: | 38 | * for newer versions we can use mmap to reduce memory usage: |
| @@ -42,13 +48,18 @@ static inline char *bfd_demangle(void __used *v, const char __used *c, | |||
| 42 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ | 48 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ |
| 43 | #endif | 49 | #endif |
| 44 | 50 | ||
| 51 | #define BUILD_ID_SIZE 20 | ||
| 52 | |||
| 45 | struct symbol { | 53 | struct symbol { |
| 46 | struct rb_node rb_node; | 54 | struct rb_node rb_node; |
| 47 | u64 start; | 55 | u64 start; |
| 48 | u64 end; | 56 | u64 end; |
| 57 | u16 namelen; | ||
| 49 | char name[0]; | 58 | char name[0]; |
| 50 | }; | 59 | }; |
| 51 | 60 | ||
| 61 | void symbol__delete(struct symbol *self); | ||
| 62 | |||
| 52 | struct strlist; | 63 | struct strlist; |
| 53 | 64 | ||
| 54 | struct symbol_conf { | 65 | struct symbol_conf { |
| @@ -58,10 +69,16 @@ struct symbol_conf { | |||
| 58 | sort_by_name, | 69 | sort_by_name, |
| 59 | show_nr_samples, | 70 | show_nr_samples, |
| 60 | use_callchain, | 71 | use_callchain, |
| 61 | exclude_other; | 72 | exclude_other, |
| 73 | full_paths, | ||
| 74 | show_cpu_utilization; | ||
| 62 | const char *vmlinux_name, | 75 | const char *vmlinux_name, |
| 63 | *field_sep; | 76 | *field_sep; |
| 64 | char *dso_list_str, | 77 | const char *default_guest_vmlinux_name, |
| 78 | *default_guest_kallsyms, | ||
| 79 | *default_guest_modules; | ||
| 80 | const char *guestmount; | ||
| 81 | const char *dso_list_str, | ||
| 65 | *comm_list_str, | 82 | *comm_list_str, |
| 66 | *sym_list_str, | 83 | *sym_list_str, |
| 67 | *col_width_list_str; | 84 | *col_width_list_str; |
| @@ -77,6 +94,17 @@ static inline void *symbol__priv(struct symbol *self) | |||
| 77 | return ((void *)self) - symbol_conf.priv_size; | 94 | return ((void *)self) - symbol_conf.priv_size; |
| 78 | } | 95 | } |
| 79 | 96 | ||
| 97 | struct ref_reloc_sym { | ||
| 98 | const char *name; | ||
| 99 | u64 addr; | ||
| 100 | u64 unrelocated_addr; | ||
| 101 | }; | ||
| 102 | |||
| 103 | struct map_symbol { | ||
| 104 | struct map *map; | ||
| 105 | struct symbol *sym; | ||
| 106 | }; | ||
| 107 | |||
| 80 | struct addr_location { | 108 | struct addr_location { |
| 81 | struct thread *thread; | 109 | struct thread *thread; |
| 82 | struct map *map; | 110 | struct map *map; |
| @@ -84,6 +112,13 @@ struct addr_location { | |||
| 84 | u64 addr; | 112 | u64 addr; |
| 85 | char level; | 113 | char level; |
| 86 | bool filtered; | 114 | bool filtered; |
| 115 | unsigned int cpumode; | ||
| 116 | }; | ||
| 117 | |||
| 118 | enum dso_kernel_type { | ||
| 119 | DSO_TYPE_USER = 0, | ||
| 120 | DSO_TYPE_KERNEL, | ||
| 121 | DSO_TYPE_GUEST_KERNEL | ||
| 87 | }; | 122 | }; |
| 88 | 123 | ||
| 89 | struct dso { | 124 | struct dso { |
| @@ -93,49 +128,94 @@ struct dso { | |||
| 93 | u8 adjust_symbols:1; | 128 | u8 adjust_symbols:1; |
| 94 | u8 slen_calculated:1; | 129 | u8 slen_calculated:1; |
| 95 | u8 has_build_id:1; | 130 | u8 has_build_id:1; |
| 96 | u8 kernel:1; | 131 | enum dso_kernel_type kernel; |
| 132 | u8 hit:1; | ||
| 133 | u8 annotate_warned:1; | ||
| 97 | unsigned char origin; | 134 | unsigned char origin; |
| 98 | u8 sorted_by_name; | 135 | u8 sorted_by_name; |
| 99 | u8 loaded; | 136 | u8 loaded; |
| 100 | u8 build_id[BUILD_ID_SIZE]; | 137 | u8 build_id[BUILD_ID_SIZE]; |
| 101 | u16 long_name_len; | ||
| 102 | const char *short_name; | 138 | const char *short_name; |
| 103 | char *long_name; | 139 | char *long_name; |
| 140 | u16 long_name_len; | ||
| 141 | u16 short_name_len; | ||
| 104 | char name[0]; | 142 | char name[0]; |
| 105 | }; | 143 | }; |
| 106 | 144 | ||
| 107 | struct dso *dso__new(const char *name); | 145 | struct dso *dso__new(const char *name); |
| 146 | struct dso *dso__new_kernel(const char *name); | ||
| 108 | void dso__delete(struct dso *self); | 147 | void dso__delete(struct dso *self); |
| 109 | 148 | ||
| 110 | bool dso__loaded(const struct dso *self, enum map_type type); | 149 | bool dso__loaded(const struct dso *self, enum map_type type); |
| 111 | bool dso__sorted_by_name(const struct dso *self, enum map_type type); | 150 | bool dso__sorted_by_name(const struct dso *self, enum map_type type); |
| 112 | 151 | ||
| 152 | static inline void dso__set_loaded(struct dso *self, enum map_type type) | ||
| 153 | { | ||
| 154 | self->loaded |= (1 << type); | ||
| 155 | } | ||
| 156 | |||
| 113 | void dso__sort_by_name(struct dso *self, enum map_type type); | 157 | void dso__sort_by_name(struct dso *self, enum map_type type); |
| 114 | 158 | ||
| 115 | struct perf_session; | 159 | struct dso *__dsos__findnew(struct list_head *head, const char *name); |
| 160 | |||
| 161 | int dso__load(struct dso *self, struct map *map, symbol_filter_t filter); | ||
| 162 | int dso__load_vmlinux_path(struct dso *self, struct map *map, | ||
| 163 | symbol_filter_t filter); | ||
| 164 | int dso__load_kallsyms(struct dso *self, const char *filename, struct map *map, | ||
| 165 | symbol_filter_t filter); | ||
| 166 | int machine__load_kallsyms(struct machine *self, const char *filename, | ||
| 167 | enum map_type type, symbol_filter_t filter); | ||
| 168 | int machine__load_vmlinux_path(struct machine *self, enum map_type type, | ||
| 169 | symbol_filter_t filter); | ||
| 170 | |||
| 171 | size_t __dsos__fprintf(struct list_head *head, FILE *fp); | ||
| 116 | 172 | ||
| 117 | struct dso *dsos__findnew(const char *name); | 173 | size_t machine__fprintf_dsos_buildid(struct machine *self, FILE *fp, bool with_hits); |
| 118 | int dso__load(struct dso *self, struct map *map, struct perf_session *session, | 174 | size_t machines__fprintf_dsos(struct rb_root *self, FILE *fp); |
| 119 | symbol_filter_t filter); | 175 | size_t machines__fprintf_dsos_buildid(struct rb_root *self, FILE *fp, bool with_hits); |
| 120 | void dsos__fprintf(FILE *fp); | ||
| 121 | size_t dsos__fprintf_buildid(FILE *fp); | ||
| 122 | 176 | ||
| 123 | size_t dso__fprintf_buildid(struct dso *self, FILE *fp); | 177 | size_t dso__fprintf_buildid(struct dso *self, FILE *fp); |
| 124 | size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); | 178 | size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); |
| 179 | |||
| 180 | enum dso_origin { | ||
| 181 | DSO__ORIG_KERNEL = 0, | ||
| 182 | DSO__ORIG_GUEST_KERNEL, | ||
| 183 | DSO__ORIG_JAVA_JIT, | ||
| 184 | DSO__ORIG_BUILD_ID_CACHE, | ||
| 185 | DSO__ORIG_FEDORA, | ||
| 186 | DSO__ORIG_UBUNTU, | ||
| 187 | DSO__ORIG_BUILDID, | ||
| 188 | DSO__ORIG_DSO, | ||
| 189 | DSO__ORIG_GUEST_KMODULE, | ||
| 190 | DSO__ORIG_KMODULE, | ||
| 191 | DSO__ORIG_NOT_FOUND, | ||
| 192 | }; | ||
| 193 | |||
| 125 | char dso__symtab_origin(const struct dso *self); | 194 | char dso__symtab_origin(const struct dso *self); |
| 195 | void dso__set_long_name(struct dso *self, char *name); | ||
| 126 | void dso__set_build_id(struct dso *self, void *build_id); | 196 | void dso__set_build_id(struct dso *self, void *build_id); |
| 197 | void dso__read_running_kernel_build_id(struct dso *self, struct machine *machine); | ||
| 127 | struct symbol *dso__find_symbol(struct dso *self, enum map_type type, u64 addr); | 198 | struct symbol *dso__find_symbol(struct dso *self, enum map_type type, u64 addr); |
| 128 | struct symbol *dso__find_symbol_by_name(struct dso *self, enum map_type type, | 199 | struct symbol *dso__find_symbol_by_name(struct dso *self, enum map_type type, |
| 129 | const char *name); | 200 | const char *name); |
| 130 | 201 | ||
| 131 | int filename__read_build_id(const char *filename, void *bf, size_t size); | 202 | int filename__read_build_id(const char *filename, void *bf, size_t size); |
| 132 | int sysfs__read_build_id(const char *filename, void *bf, size_t size); | 203 | int sysfs__read_build_id(const char *filename, void *bf, size_t size); |
| 133 | bool dsos__read_build_ids(void); | 204 | bool __dsos__read_build_ids(struct list_head *head, bool with_hits); |
| 134 | int build_id__sprintf(u8 *self, int len, char *bf); | 205 | int build_id__sprintf(const u8 *self, int len, char *bf); |
| 206 | int kallsyms__parse(const char *filename, void *arg, | ||
| 207 | int (*process_symbol)(void *arg, const char *name, | ||
| 208 | char type, u64 start)); | ||
| 209 | |||
| 210 | int __machine__create_kernel_maps(struct machine *self, struct dso *kernel); | ||
| 211 | int machine__create_kernel_maps(struct machine *self); | ||
| 212 | |||
| 213 | int machines__create_kernel_maps(struct rb_root *self, pid_t pid); | ||
| 214 | int machines__create_guest_kernel_maps(struct rb_root *self); | ||
| 135 | 215 | ||
| 136 | int symbol__init(void); | 216 | int symbol__init(void); |
| 137 | int perf_session__create_kernel_maps(struct perf_session *self); | 217 | bool symbol_type__is_a(char symbol_type, enum map_type map_type); |
| 218 | |||
| 219 | size_t machine__fprintf_vmlinux_path(struct machine *self, FILE *fp); | ||
| 138 | 220 | ||
| 139 | extern struct list_head dsos__user, dsos__kernel; | ||
| 140 | extern struct dso *vdso; | ||
| 141 | #endif /* __PERF_SYMBOL */ | 221 | #endif /* __PERF_SYMBOL */ |
