diff options
Diffstat (limited to 'tools/perf/util/symbol.h')
-rw-r--r-- | tools/perf/util/symbol.h | 162 |
1 files changed, 6 insertions, 156 deletions
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 8b6ef7fac745..de68f98b236d 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <stdio.h> | 11 | #include <stdio.h> |
12 | #include <byteswap.h> | 12 | #include <byteswap.h> |
13 | #include <libgen.h> | 13 | #include <libgen.h> |
14 | #include "build-id.h" | ||
14 | 15 | ||
15 | #ifdef LIBELF_SUPPORT | 16 | #ifdef LIBELF_SUPPORT |
16 | #include <libelf.h> | 17 | #include <libelf.h> |
@@ -18,6 +19,8 @@ | |||
18 | #include <elf.h> | 19 | #include <elf.h> |
19 | #endif | 20 | #endif |
20 | 21 | ||
22 | #include "dso.h" | ||
23 | |||
21 | #ifdef HAVE_CPLUS_DEMANGLE | 24 | #ifdef HAVE_CPLUS_DEMANGLE |
22 | extern char *cplus_demangle(const char *, int); | 25 | extern char *cplus_demangle(const char *, int); |
23 | 26 | ||
@@ -39,9 +42,6 @@ static inline char *bfd_demangle(void __maybe_unused *v, | |||
39 | #endif | 42 | #endif |
40 | #endif | 43 | #endif |
41 | 44 | ||
42 | int hex2u64(const char *ptr, u64 *val); | ||
43 | char *strxfrchar(char *s, char from, char to); | ||
44 | |||
45 | /* | 45 | /* |
46 | * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP; | 46 | * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP; |
47 | * for newer versions we can use mmap to reduce memory usage: | 47 | * for newer versions we can use mmap to reduce memory usage: |
@@ -57,8 +57,6 @@ char *strxfrchar(char *s, char from, char to); | |||
57 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ | 57 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ |
58 | #endif | 58 | #endif |
59 | 59 | ||
60 | #define BUILD_ID_SIZE 20 | ||
61 | |||
62 | /** struct symbol - symtab entry | 60 | /** struct symbol - symtab entry |
63 | * | 61 | * |
64 | * @ignore - resolvable but tools ignore it (e.g. idle routines) | 62 | * @ignore - resolvable but tools ignore it (e.g. idle routines) |
@@ -74,6 +72,7 @@ struct symbol { | |||
74 | }; | 72 | }; |
75 | 73 | ||
76 | void symbol__delete(struct symbol *sym); | 74 | void symbol__delete(struct symbol *sym); |
75 | void symbols__delete(struct rb_root *symbols); | ||
77 | 76 | ||
78 | static inline size_t symbol__size(const struct symbol *sym) | 77 | static inline size_t symbol__size(const struct symbol *sym) |
79 | { | 78 | { |
@@ -164,70 +163,6 @@ struct addr_location { | |||
164 | s32 cpu; | 163 | s32 cpu; |
165 | }; | 164 | }; |
166 | 165 | ||
167 | enum dso_binary_type { | ||
168 | DSO_BINARY_TYPE__KALLSYMS = 0, | ||
169 | DSO_BINARY_TYPE__GUEST_KALLSYMS, | ||
170 | DSO_BINARY_TYPE__VMLINUX, | ||
171 | DSO_BINARY_TYPE__GUEST_VMLINUX, | ||
172 | DSO_BINARY_TYPE__JAVA_JIT, | ||
173 | DSO_BINARY_TYPE__DEBUGLINK, | ||
174 | DSO_BINARY_TYPE__BUILD_ID_CACHE, | ||
175 | DSO_BINARY_TYPE__FEDORA_DEBUGINFO, | ||
176 | DSO_BINARY_TYPE__UBUNTU_DEBUGINFO, | ||
177 | DSO_BINARY_TYPE__BUILDID_DEBUGINFO, | ||
178 | DSO_BINARY_TYPE__SYSTEM_PATH_DSO, | ||
179 | DSO_BINARY_TYPE__GUEST_KMODULE, | ||
180 | DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE, | ||
181 | DSO_BINARY_TYPE__NOT_FOUND, | ||
182 | }; | ||
183 | |||
184 | enum dso_kernel_type { | ||
185 | DSO_TYPE_USER = 0, | ||
186 | DSO_TYPE_KERNEL, | ||
187 | DSO_TYPE_GUEST_KERNEL | ||
188 | }; | ||
189 | |||
190 | enum dso_swap_type { | ||
191 | DSO_SWAP__UNSET, | ||
192 | DSO_SWAP__NO, | ||
193 | DSO_SWAP__YES, | ||
194 | }; | ||
195 | |||
196 | #define DSO__DATA_CACHE_SIZE 4096 | ||
197 | #define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1) | ||
198 | |||
199 | struct dso_cache { | ||
200 | struct rb_node rb_node; | ||
201 | u64 offset; | ||
202 | u64 size; | ||
203 | char data[0]; | ||
204 | }; | ||
205 | |||
206 | struct dso { | ||
207 | struct list_head node; | ||
208 | struct rb_root symbols[MAP__NR_TYPES]; | ||
209 | struct rb_root symbol_names[MAP__NR_TYPES]; | ||
210 | struct rb_root cache; | ||
211 | enum dso_kernel_type kernel; | ||
212 | enum dso_swap_type needs_swap; | ||
213 | enum dso_binary_type symtab_type; | ||
214 | enum dso_binary_type data_type; | ||
215 | u8 adjust_symbols:1; | ||
216 | u8 has_build_id:1; | ||
217 | u8 hit:1; | ||
218 | u8 annotate_warned:1; | ||
219 | u8 sname_alloc:1; | ||
220 | u8 lname_alloc:1; | ||
221 | u8 sorted_by_name; | ||
222 | u8 loaded; | ||
223 | u8 build_id[BUILD_ID_SIZE]; | ||
224 | const char *short_name; | ||
225 | char *long_name; | ||
226 | u16 long_name_len; | ||
227 | u16 short_name_len; | ||
228 | char name[0]; | ||
229 | }; | ||
230 | |||
231 | struct symsrc { | 166 | struct symsrc { |
232 | char *name; | 167 | char *name; |
233 | int fd; | 168 | int fd; |
@@ -258,47 +193,6 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name, | |||
258 | bool symsrc__has_symtab(struct symsrc *ss); | 193 | bool symsrc__has_symtab(struct symsrc *ss); |
259 | bool symsrc__possibly_runtime(struct symsrc *ss); | 194 | bool symsrc__possibly_runtime(struct symsrc *ss); |
260 | 195 | ||
261 | #define DSO__SWAP(dso, type, val) \ | ||
262 | ({ \ | ||
263 | type ____r = val; \ | ||
264 | BUG_ON(dso->needs_swap == DSO_SWAP__UNSET); \ | ||
265 | if (dso->needs_swap == DSO_SWAP__YES) { \ | ||
266 | switch (sizeof(____r)) { \ | ||
267 | case 2: \ | ||
268 | ____r = bswap_16(val); \ | ||
269 | break; \ | ||
270 | case 4: \ | ||
271 | ____r = bswap_32(val); \ | ||
272 | break; \ | ||
273 | case 8: \ | ||
274 | ____r = bswap_64(val); \ | ||
275 | break; \ | ||
276 | default: \ | ||
277 | BUG_ON(1); \ | ||
278 | } \ | ||
279 | } \ | ||
280 | ____r; \ | ||
281 | }) | ||
282 | |||
283 | struct dso *dso__new(const char *name); | ||
284 | void dso__delete(struct dso *dso); | ||
285 | |||
286 | int dso__name_len(const struct dso *dso); | ||
287 | |||
288 | bool dso__loaded(const struct dso *dso, enum map_type type); | ||
289 | bool dso__sorted_by_name(const struct dso *dso, enum map_type type); | ||
290 | |||
291 | static inline void dso__set_loaded(struct dso *dso, enum map_type type) | ||
292 | { | ||
293 | dso->loaded |= (1 << type); | ||
294 | } | ||
295 | |||
296 | void dso__sort_by_name(struct dso *dso, enum map_type type); | ||
297 | |||
298 | void dsos__add(struct list_head *head, struct dso *dso); | ||
299 | struct dso *dsos__find(struct list_head *head, const char *name); | ||
300 | struct dso *__dsos__findnew(struct list_head *head, const char *name); | ||
301 | |||
302 | int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter); | 196 | int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter); |
303 | int dso__load_vmlinux(struct dso *dso, struct map *map, | 197 | int dso__load_vmlinux(struct dso *dso, struct map *map, |
304 | const char *vmlinux, symbol_filter_t filter); | 198 | const char *vmlinux, symbol_filter_t filter); |
@@ -306,30 +200,7 @@ int dso__load_vmlinux_path(struct dso *dso, struct map *map, | |||
306 | symbol_filter_t filter); | 200 | symbol_filter_t filter); |
307 | int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map, | 201 | int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map, |
308 | symbol_filter_t filter); | 202 | symbol_filter_t filter); |
309 | int machine__load_kallsyms(struct machine *machine, const char *filename, | 203 | |
310 | enum map_type type, symbol_filter_t filter); | ||
311 | int machine__load_vmlinux_path(struct machine *machine, enum map_type type, | ||
312 | symbol_filter_t filter); | ||
313 | |||
314 | size_t __dsos__fprintf(struct list_head *head, FILE *fp); | ||
315 | |||
316 | size_t machine__fprintf_dsos_buildid(struct machine *machine, | ||
317 | FILE *fp, bool with_hits); | ||
318 | size_t machines__fprintf_dsos(struct rb_root *machines, FILE *fp); | ||
319 | size_t machines__fprintf_dsos_buildid(struct rb_root *machines, | ||
320 | FILE *fp, bool with_hits); | ||
321 | size_t dso__fprintf_buildid(struct dso *dso, FILE *fp); | ||
322 | size_t dso__fprintf_symbols_by_name(struct dso *dso, | ||
323 | enum map_type type, FILE *fp); | ||
324 | size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp); | ||
325 | |||
326 | char dso__symtab_origin(const struct dso *dso); | ||
327 | void dso__set_long_name(struct dso *dso, char *name); | ||
328 | void dso__set_build_id(struct dso *dso, void *build_id); | ||
329 | bool dso__build_id_equal(const struct dso *dso, u8 *build_id); | ||
330 | void dso__read_running_kernel_build_id(struct dso *dso, | ||
331 | struct machine *machine); | ||
332 | struct map *dso__new_map(const char *name); | ||
333 | struct symbol *dso__find_symbol(struct dso *dso, enum map_type type, | 204 | struct symbol *dso__find_symbol(struct dso *dso, enum map_type type, |
334 | u64 addr); | 205 | u64 addr); |
335 | struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type, | 206 | struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type, |
@@ -337,22 +208,12 @@ struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type, | |||
337 | 208 | ||
338 | int filename__read_build_id(const char *filename, void *bf, size_t size); | 209 | int filename__read_build_id(const char *filename, void *bf, size_t size); |
339 | int sysfs__read_build_id(const char *filename, void *bf, size_t size); | 210 | int sysfs__read_build_id(const char *filename, void *bf, size_t size); |
340 | bool __dsos__read_build_ids(struct list_head *head, bool with_hits); | ||
341 | int build_id__sprintf(const u8 *build_id, int len, char *bf); | ||
342 | int kallsyms__parse(const char *filename, void *arg, | 211 | int kallsyms__parse(const char *filename, void *arg, |
343 | int (*process_symbol)(void *arg, const char *name, | 212 | int (*process_symbol)(void *arg, const char *name, |
344 | char type, u64 start)); | 213 | char type, u64 start)); |
345 | int filename__read_debuglink(const char *filename, char *debuglink, | 214 | int filename__read_debuglink(const char *filename, char *debuglink, |
346 | size_t size); | 215 | size_t size); |
347 | 216 | ||
348 | void machine__destroy_kernel_maps(struct machine *machine); | ||
349 | int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel); | ||
350 | int machine__create_kernel_maps(struct machine *machine); | ||
351 | |||
352 | int machines__create_kernel_maps(struct rb_root *machines, pid_t pid); | ||
353 | int machines__create_guest_kernel_maps(struct rb_root *machines); | ||
354 | void machines__destroy_guest_kernel_maps(struct rb_root *machines); | ||
355 | |||
356 | int symbol__init(void); | 217 | int symbol__init(void); |
357 | void symbol__exit(void); | 218 | void symbol__exit(void); |
358 | void symbol__elf_init(void); | 219 | void symbol__elf_init(void); |
@@ -360,20 +221,9 @@ struct symbol *symbol__new(u64 start, u64 len, u8 binding, const char *name); | |||
360 | size_t symbol__fprintf_symname_offs(const struct symbol *sym, | 221 | size_t symbol__fprintf_symname_offs(const struct symbol *sym, |
361 | const struct addr_location *al, FILE *fp); | 222 | const struct addr_location *al, FILE *fp); |
362 | size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp); | 223 | size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp); |
224 | size_t symbol__fprintf(struct symbol *sym, FILE *fp); | ||
363 | bool symbol_type__is_a(char symbol_type, enum map_type map_type); | 225 | bool symbol_type__is_a(char symbol_type, enum map_type map_type); |
364 | 226 | ||
365 | size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp); | ||
366 | |||
367 | int dso__binary_type_file(struct dso *dso, enum dso_binary_type type, | ||
368 | char *root_dir, char *file, size_t size); | ||
369 | |||
370 | int dso__data_fd(struct dso *dso, struct machine *machine); | ||
371 | ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, | ||
372 | u64 offset, u8 *data, ssize_t size); | ||
373 | ssize_t dso__data_read_addr(struct dso *dso, struct map *map, | ||
374 | struct machine *machine, u64 addr, | ||
375 | u8 *data, ssize_t size); | ||
376 | int dso__test_data(void); | ||
377 | int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss, | 227 | int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss, |
378 | struct symsrc *runtime_ss, symbol_filter_t filter, | 228 | struct symsrc *runtime_ss, symbol_filter_t filter, |
379 | int kmodule); | 229 | int kmodule); |