1 #ifndef __PERF_SYMBOL 2 #define __PERF_SYMBOL 1 3 4 #include <linux/types.h> 5 #include <stdbool.h> 6 #include <stdint.h> 7 #include "map.h" 8 #include <linux/list.h> 9 #include <linux/rbtree.h> 10 #include <stdio.h> 11 12 #ifdef HAVE_CPLUS_DEMANGLE 13 extern char *cplus_demangle(const char *, int); 14 15 static inline char *bfd_demangle(void __used *v, const char *c, int i) 16 { 17 return cplus_demangle(c, i); 18 } 19 #else 20 #ifdef NO_DEMANGLE 21 static inline char *bfd_demangle(void __used *v, const char __used *c, 22 int __used i) 23 { 24 return NULL; 25 } 26 #else 27 #include <bfd.h> 28 #endif 29 #endif 30 31 int hex2u64(const char *ptr, u64 *val); 32 char *strxfrchar(char *s, char from, char to); 33 34 /* 35 * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP; 36 * for newer versions we can use mmap to reduce memory usage: 37 */ 38 #ifdef LIBELF_NO_MMAP 39 # define PERF_ELF_C_READ_MMAP ELF_C_READ 40 #else 41 # define PERF_ELF_C_READ_MMAP ELF_C_READ_MMAP 42 #endif 43 44 #ifndef DMGL_PARAMS 45 #define DMGL_PARAMS (1 << 0) /* Include function args */ 46 #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ 47 #endif 48 49 #define BUILD_ID_SIZE 20 50 51 /** struct symbol - symtab entry 52 * 53 * @ignore - resolvable but tools ignore it (e.g. idle routines) 54 */ 55 struct symbol { 56 struct rb_node rb_node; 57 u64 start; 58 u64 end; 59 u16 namelen; 60 u8 binding; 61 bool ignore; 62 char name[0]; 63 }; 64 65 void symbol__delete(struct symbol *self); 66 67 struct strlist; 68 69 struct symbol_conf { 70 unsigned short priv_size; 71 bool try_vmlinux_path, 72 use_modules, 73 sort_by_name, 74 show_nr_samples, 75 use_callchain, 76 exclude_other, 77 show_cpu_utilization, 78 initialized; 79 const char *vmlinux_name, 80 *kallsyms_name, 81 *source_prefix, 82 *field_sep; 83 const char *default_guest_vmlinux_name, 84 *default_guest_kallsyms, 85 *default_guest_modules; 86 const char *guestmount; 87 const char *dso_list_str, 88 *comm_list_str, 89 *sym_list_str, 90 *col_width_list_str; 91 struct strlist *dso_list, 92 *comm_list, 93 *sym_list; 94 const char *symfs; 95 }; 96 97 extern struct symbol_conf symbol_conf; 98 99 static inline void *symbol__priv(struct symbol *self) 100 { 101 return ((void *)self) - symbol_conf.priv_size; 102 } 103 104 struct ref_reloc_sym { 105 const char *name; 106 u64 addr; 107 u64 unrelocated_addr; 108 }; 109 110 struct map_symbol { 111 struct map *map; 112 struct symbol *sym; 113 bool unfolded; 114 bool has_children; 115 }; 116 117 struct addr_location { 118 struct thread *thread; 119 struct map *map; 120 struct symbol *sym; 121 u64 addr; 122 char level; 123 bool filtered; 124 u8 cpumode; 125 s32 cpu; 126 }; 127 128 enum dso_kernel_type { 129 DSO_TYPE_USER = 0, 130 DSO_TYPE_KERNEL, 131 DSO_TYPE_GUEST_KERNEL 132 }; 133 134 struct dso { 135 struct list_head node; 136 struct rb_root symbols[MAP__NR_TYPES]; 137 struct rb_root symbol_names[MAP__NR_TYPES]; 138 enum dso_kernel_type kernel; 139 u8 adjust_symbols:1; 140 u8 has_build_id:1; 141 u8 hit:1; 142 u8 annotate_warned:1; 143 u8 sname_alloc:1; 144 u8 lname_alloc:1; 145 unsigned char symtab_type; 146 u8 sorted_by_name; 147 u8 loaded; 148 u8 build_id[BUILD_ID_SIZE]; 149 const char *short_name; 150 char *long_name; 151 u16 long_name_len; 152 u16 short_name_len; 153 char name[0]; 154 }; 155 156 struct dso *dso__new(const char *name); 157 struct dso *dso__new_kernel(const char *name); 158 void dso__delete(struct dso *self); 159 160 int dso__name_len(const struct dso *self); 161 162 bool dso__loaded(const struct dso *self, enum map_type type); 163 bool dso__sorted_by_name(const struct dso *self, enum map_type type); 164 165 static inline void dso__set_loaded(struct dso *self, enum map_type type) 166 { 167 self->loaded |= (1 << type); 168 } 169 170 void dso__sort_by_name(struct dso *self, enum map_type type); 171 172 struct dso *__dsos__findnew(struct list_head *head, const char *name); 173 174 int dso__load(struct dso *self, struct map *map, symbol_filter_t filter); 175 int dso__load_vmlinux(struct dso *self, struct map *map, 176 const char *vmlinux, symbol_filter_t filter); 177 int dso__load_vmlinux_path(struct dso *self, struct map *map, 178 symbol_filter_t filter); 179 int dso__load_kallsyms(struct dso *self, const char *filename, struct map *map, 180 symbol_filter_t filter); 181 int machine__load_kallsyms(struct machine *self, const char *filename, 182 enum map_type type, symbol_filter_t filter); 183 int machine__load_vmlinux_path(struct machine *self, enum map_type type, 184 symbol_filter_t filter); 185 186 size_t __dsos__fprintf(struct list_head *head, FILE *fp); 187 188 size_t machine__fprintf_dsos_buildid(struct machine *self, FILE *fp, bool with_hits); 189 size_t machines__fprintf_dsos(struct rb_root *self, FILE *fp); 190 size_t machines__fprintf_dsos_buildid(struct rb_root *self, FILE *fp, bool with_hits); 191 192 size_t dso__fprintf_buildid(struct dso *self, FILE *fp); 193 size_t dso__fprintf_symbols_by_name(struct dso *self, enum map_type type, FILE *fp); 194 size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); 195 196 enum symtab_type { 197 SYMTAB__KALLSYMS = 0, 198 SYMTAB__GUEST_KALLSYMS, 199 SYMTAB__JAVA_JIT, 200 SYMTAB__BUILD_ID_CACHE, 201 SYMTAB__FEDORA_DEBUGINFO, 202 SYMTAB__UBUNTU_DEBUGINFO, 203 SYMTAB__BUILDID_DEBUGINFO, 204 SYMTAB__SYSTEM_PATH_DSO, 205 SYMTAB__GUEST_KMODULE, 206 SYMTAB__SYSTEM_PATH_KMODULE, 207 SYMTAB__NOT_FOUND, 208 }; 209 210 char dso__symtab_origin(const struct dso *self); 211 void dso__set_long_name(struct dso *self, char *name); 212 void dso__set_build_id(struct dso *self, void *build_id); 213 void dso__read_running_kernel_build_id(struct dso *self, struct machine *machine); 214 struct symbol *dso__find_symbol(struct dso *self, enum map_type type, u64 addr); 215 struct symbol *dso__find_symbol_by_name(struct dso *self, enum map_type type, 216 const char *name); 217 218 int filename__read_build_id(const char *filename, void *bf, size_t size); 219 int sysfs__read_build_id(const char *filename, void *bf, size_t size); 220 bool __dsos__read_build_ids(struct list_head *head, bool with_hits); 221 int build_id__sprintf(const u8 *self, int len, char *bf); 222 int kallsyms__parse(const char *filename, void *arg, 223 int (*process_symbol)(void *arg, const char *name, 224 char type, u64 start, u64 end)); 225 226 void machine__destroy_kernel_maps(struct machine *self); 227 int __machine__create_kernel_maps(struct machine *self, struct dso *kernel); 228 int machine__create_kernel_maps(struct machine *self); 229 230 int machines__create_kernel_maps(struct rb_root *self, pid_t pid); 231 int machines__create_guest_kernel_maps(struct rb_root *self); 232 void machines__destroy_guest_kernel_maps(struct rb_root *self); 233 234 int symbol__init(void); 235 void symbol__exit(void); 236 bool symbol_type__is_a(char symbol_type, enum map_type map_type); 237 238 size_t machine__fprintf_vmlinux_path(struct machine *self, FILE *fp); 239 240 #endif /* __PERF_SYMBOL */ 241