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