diff options
Diffstat (limited to 'tools/perf/util/symbol.h')
| -rw-r--r-- | tools/perf/util/symbol.h | 64 | 
1 files changed, 53 insertions, 11 deletions
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index fd5b70ea298..615c752dd76 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h @@ -12,8 +12,9 @@  #include <byteswap.h>  #include <libgen.h>  #include "build-id.h" +#include "event.h" -#ifdef LIBELF_SUPPORT +#ifdef HAVE_LIBELF_SUPPORT  #include <libelf.h>  #include <gelf.h>  #endif @@ -21,7 +22,7 @@  #include "dso.h" -#ifdef HAVE_CPLUS_DEMANGLE +#ifdef HAVE_CPLUS_DEMANGLE_SUPPORT  extern char *cplus_demangle(const char *, int);  static inline char *bfd_demangle(void __maybe_unused *v, const char *c, int i) @@ -46,12 +47,17 @@ static inline char *bfd_demangle(void __maybe_unused *v,   * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP;   * for newer versions we can use mmap to reduce memory usage:   */ -#ifdef LIBELF_MMAP +#ifdef HAVE_LIBELF_MMAP_SUPPORT  # define PERF_ELF_C_READ_MMAP ELF_C_READ_MMAP  #else  # define PERF_ELF_C_READ_MMAP ELF_C_READ  #endif +#ifdef HAVE_LIBELF_SUPPORT +extern Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, +				GElf_Shdr *shp, const char *name, size_t *idx); +#endif +  #ifndef DMGL_PARAMS  #define DMGL_PARAMS      (1 << 0)       /* Include function args */  #define DMGL_ANSI        (1 << 1)       /* Include const, volatile, etc */ @@ -74,6 +80,17 @@ struct symbol {  void symbol__delete(struct symbol *sym);  void symbols__delete(struct rb_root *symbols); +/* symbols__for_each_entry - iterate over symbols (rb_root) + * + * @symbols: the rb_root of symbols + * @pos: the 'struct symbol *' to use as a loop cursor + * @nd: the 'struct rb_node *' to use as a temporary storage + */ +#define symbols__for_each_entry(symbols, pos, nd)			\ +	for (nd = rb_first(symbols);					\ +	     nd && (pos = rb_entry(nd, struct symbol, rb_node));	\ +	     nd = rb_next(nd)) +  static inline size_t symbol__size(const struct symbol *sym)  {  	return sym->end - sym->start + 1; @@ -85,12 +102,14 @@ struct symbol_conf {  	unsigned short	priv_size;  	unsigned short	nr_events;  	bool		try_vmlinux_path, +			ignore_vmlinux,  			show_kernel_path,  			use_modules,  			sort_by_name,  			show_nr_samples,  			show_total_period,  			use_callchain, +			cumulate_callchain,  			exclude_other,  			show_cpu_utilization,  			initialized, @@ -98,7 +117,8 @@ struct symbol_conf {  			annotate_asm_raw,  			annotate_src,  			event_group, -			demangle; +			demangle, +			filter_relative;  	const char	*vmlinux_name,  			*kallsyms_name,  			*source_prefix, @@ -163,12 +183,13 @@ struct mem_info {  };  struct addr_location { +	struct machine *machine;  	struct thread *thread;  	struct map    *map;  	struct symbol *sym;  	u64	      addr;  	char	      level; -	bool	      filtered; +	u8	      filtered;  	u8	      cpumode;  	s32	      cpu;  }; @@ -178,7 +199,7 @@ struct symsrc {  	int fd;  	enum dso_binary_type type; -#ifdef LIBELF_SUPPORT +#ifdef HAVE_LIBELF_SUPPORT  	Elf *elf;  	GElf_Ehdr ehdr; @@ -205,7 +226,8 @@ bool symsrc__possibly_runtime(struct symsrc *ss);  int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter);  int dso__load_vmlinux(struct dso *dso, struct map *map, -		      const char *vmlinux, symbol_filter_t filter); +		      const char *vmlinux, bool vmlinux_allocated, +		      symbol_filter_t filter);  int dso__load_vmlinux_path(struct dso *dso, struct map *map,  			   symbol_filter_t filter);  int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map, @@ -215,13 +237,12 @@ struct symbol *dso__find_symbol(struct dso *dso, enum map_type type,  				u64 addr);  struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type,  					const char *name); -struct symbol *dso__first_symbol(struct dso *dso, enum map_type type);  int filename__read_build_id(const char *filename, void *bf, size_t size);  int sysfs__read_build_id(const char *filename, void *bf, size_t size); -int kallsyms__parse(const char *filename, void *arg, -		    int (*process_symbol)(void *arg, const char *name, -					  char type, u64 start)); +int modules__parse(const char *filename, void *arg, +		   int (*process_module)(void *arg, const char *name, +					 u64 start));  int filename__read_debuglink(const char *filename, char *debuglink,  			     size_t size); @@ -236,6 +257,7 @@ size_t symbol__fprintf(struct symbol *sym, FILE *fp);  bool symbol_type__is_a(char symbol_type, enum map_type map_type);  bool symbol__restricted_filename(const char *filename,  				 const char *restricted_filename); +bool symbol__is_idle(struct symbol *sym);  int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,  		  struct symsrc *runtime_ss, symbol_filter_t filter, @@ -252,4 +274,24 @@ typedef int (*mapfn_t)(u64 start, u64 len, u64 pgoff, void *data);  int file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data,  		    bool *is_64_bit); +#define PERF_KCORE_EXTRACT "/tmp/perf-kcore-XXXXXX" + +struct kcore_extract { +	char *kcore_filename; +	u64 addr; +	u64 offs; +	u64 len; +	char extract_filename[sizeof(PERF_KCORE_EXTRACT)]; +	int fd; +}; + +int kcore_extract__create(struct kcore_extract *kce); +void kcore_extract__delete(struct kcore_extract *kce); + +int kcore_copy(const char *from_dir, const char *to_dir); +int compare_proc_modules(const char *from, const char *to); + +int setup_list(struct strlist **list, const char *list_str, +	       const char *list_name); +  #endif /* __PERF_SYMBOL */  | 
