1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __PERF_SYMBOL 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_SYMBOL 1 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/types.h> 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdbool.h> 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdint.h> 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "map.h" 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../perf.h" 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/list.h> 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/rbtree.h> 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdio.h> 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <byteswap.h> 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <libgen.h> 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "build-id.h" 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef LIBELF_SUPPORT 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <libelf.h> 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <gelf.h> 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <elf.h> 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "dso.h" 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef HAVE_CPLUS_DEMANGLE 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern char *cplus_demangle(const char *, int); 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline char *bfd_demangle(void __maybe_unused *v, const char *c, int i) 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return cplus_demangle(c, i); 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#else 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef NO_DEMANGLE 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline char *bfd_demangle(void __maybe_unused *v, 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char __maybe_unused *c, 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int __maybe_unused i) 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return NULL; 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#else 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PACKAGE 'perf' 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <bfd.h> 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP; 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * for newer versions we can use mmap to reduce memory usage: 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef LIBELF_MMAP 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# define PERF_ELF_C_READ_MMAP ELF_C_READ_MMAP 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#else 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# define PERF_ELF_C_READ_MMAP ELF_C_READ 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef DMGL_PARAMS 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define DMGL_PARAMS (1 << 0) /* Include function args */ 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/** struct symbol - symtab entry 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @ignore - resolvable but tools ignore it (e.g. idle routines) 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct symbol { 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct rb_node rb_node; 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 start; 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 end; 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u16 namelen; 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u8 binding; 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool ignore; 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char name[0]; 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid symbol__delete(struct symbol *sym); 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid symbols__delete(struct rb_root *symbols); 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline size_t symbol__size(const struct symbol *sym) 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return sym->end - sym->start + 1; 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct strlist; 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct symbol_conf { 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned short priv_size; 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned short nr_events; 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool try_vmlinux_path, 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng show_kernel_path, 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng use_modules, 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sort_by_name, 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng show_nr_samples, 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng show_total_period, 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng use_callchain, 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng exclude_other, 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng show_cpu_utilization, 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng initialized, 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng kptr_restrict, 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng annotate_asm_raw, 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng annotate_src, 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng event_group, 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng demangle; 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *vmlinux_name, 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *kallsyms_name, 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *source_prefix, 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *field_sep; 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *default_guest_vmlinux_name, 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *default_guest_kallsyms, 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *default_guest_modules; 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *guestmount; 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *dso_list_str, 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *comm_list_str, 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *sym_list_str, 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *col_width_list_str; 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct strlist *dso_list, 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *comm_list, 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *sym_list, 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *dso_from_list, 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *dso_to_list, 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *sym_from_list, 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *sym_to_list; 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *symfs; 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern struct symbol_conf symbol_conf; 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int vmlinux_path__nr_entries; 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern char **vmlinux_path; 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void *symbol__priv(struct symbol *sym) 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return ((void *)sym) - symbol_conf.priv_size; 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct ref_reloc_sym { 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *name; 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 addr; 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 unrelocated_addr; 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct map_symbol { 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct map *map; 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct symbol *sym; 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool unfolded; 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool has_children; 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct addr_map_symbol { 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct map *map; 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct symbol *sym; 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 addr; 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 al_addr; 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct branch_info { 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct addr_map_symbol from; 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct addr_map_symbol to; 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct branch_flags flags; 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct mem_info { 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct addr_map_symbol iaddr; 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct addr_map_symbol daddr; 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng union perf_mem_data_src data_src; 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct addr_location { 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct thread *thread; 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct map *map; 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct symbol *sym; 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 addr; 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char level; 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool filtered; 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u8 cpumode; 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng s32 cpu; 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct symsrc { 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *name; 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int fd; 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng enum dso_binary_type type; 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef LIBELF_SUPPORT 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Elf *elf; 183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GElf_Ehdr ehdr; 184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Elf_Scn *opdsec; 186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size_t opdidx; 187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GElf_Shdr opdshdr; 188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Elf_Scn *symtab; 190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GElf_Shdr symshdr; 191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Elf_Scn *dynsym; 193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size_t dynsym_idx; 194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GElf_Shdr dynshdr; 195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool adjust_symbols; 197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid symsrc__destroy(struct symsrc *ss); 201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint symsrc__init(struct symsrc *ss, struct dso *dso, const char *name, 202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng enum dso_binary_type type); 203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbool symsrc__has_symtab(struct symsrc *ss); 204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbool symsrc__possibly_runtime(struct symsrc *ss); 205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint dso__load(struct dso *dso, struct map *map, symbol_filter_t filter); 207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint dso__load_vmlinux(struct dso *dso, struct map *map, 208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *vmlinux, symbol_filter_t filter); 209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint dso__load_vmlinux_path(struct dso *dso, struct map *map, 210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng symbol_filter_t filter); 211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map, 212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng symbol_filter_t filter); 213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct symbol *dso__find_symbol(struct dso *dso, enum map_type type, 215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 addr); 216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type, 217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *name); 218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct symbol *dso__first_symbol(struct dso *dso, enum map_type type); 219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint filename__read_build_id(const char *filename, void *bf, size_t size); 221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint sysfs__read_build_id(const char *filename, void *bf, size_t size); 222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint kallsyms__parse(const char *filename, void *arg, 223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int (*process_symbol)(void *arg, const char *name, 224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char type, u64 start)); 225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint filename__read_debuglink(const char *filename, char *debuglink, 226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size_t size); 227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint symbol__init(void); 229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid symbol__exit(void); 230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid symbol__elf_init(void); 231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct symbol *symbol__new(u64 start, u64 len, u8 binding, const char *name); 232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsize_t symbol__fprintf_symname_offs(const struct symbol *sym, 233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const struct addr_location *al, FILE *fp); 234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsize_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp); 235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsize_t symbol__fprintf(struct symbol *sym, FILE *fp); 236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbool symbol_type__is_a(char symbol_type, enum map_type map_type); 237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbool symbol__restricted_filename(const char *filename, 238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *restricted_filename); 239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss, 241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct symsrc *runtime_ss, symbol_filter_t filter, 242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int kmodule); 243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, 244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct map *map, symbol_filter_t filter); 245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid symbols__insert(struct rb_root *symbols, struct symbol *sym); 247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid symbols__fixup_duplicate(struct rb_root *symbols); 248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid symbols__fixup_end(struct rb_root *symbols); 249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __map_groups__fixup_end(struct map_groups *mg, enum map_type type); 250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengtypedef int (*mapfn_t)(u64 start, u64 len, u64 pgoff, void *data); 252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data, 253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool *is_64_bit); 254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* __PERF_SYMBOL */ 256