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