linux/tools/perf/util/symbol.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __PERF_SYMBOL
   3#define __PERF_SYMBOL 1
   4
   5#include <linux/types.h>
   6#include <linux/refcount.h>
   7#include <stdbool.h>
   8#include <stdint.h>
   9#include <linux/list.h>
  10#include <linux/rbtree.h>
  11#include <stdio.h>
  12#include "path.h"
  13#include "symbol_conf.h"
  14
  15#ifdef HAVE_LIBELF_SUPPORT
  16#include <libelf.h>
  17#include <gelf.h>
  18#endif
  19#include <elf.h>
  20
  21struct dso;
  22struct map;
  23struct map_groups;
  24struct option;
  25
  26/*
  27 * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP;
  28 * for newer versions we can use mmap to reduce memory usage:
  29 */
  30#ifdef HAVE_LIBELF_MMAP_SUPPORT
  31# define PERF_ELF_C_READ_MMAP ELF_C_READ_MMAP
  32#else
  33# define PERF_ELF_C_READ_MMAP ELF_C_READ
  34#endif
  35
  36#ifdef HAVE_LIBELF_SUPPORT
  37Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
  38                             GElf_Shdr *shp, const char *name, size_t *idx);
  39#endif
  40
  41/** struct symbol - symtab entry
  42 *
  43 * @ignore - resolvable but tools ignore it (e.g. idle routines)
  44 */
  45struct symbol {
  46        struct rb_node  rb_node;
  47        u64             start;
  48        u64             end;
  49        u16             namelen;
  50        u8              type:4;
  51        u8              binding:4;
  52        u8              idle:1;
  53        u8              ignore:1;
  54        u8              inlined:1;
  55        u8              arch_sym;
  56        bool            annotate2;
  57        char            name[0];
  58};
  59
  60void symbol__delete(struct symbol *sym);
  61void symbols__delete(struct rb_root_cached *symbols);
  62
  63/* symbols__for_each_entry - iterate over symbols (rb_root)
  64 *
  65 * @symbols: the rb_root of symbols
  66 * @pos: the 'struct symbol *' to use as a loop cursor
  67 * @nd: the 'struct rb_node *' to use as a temporary storage
  68 */
  69#define symbols__for_each_entry(symbols, pos, nd)                       \
  70        for (nd = rb_first_cached(symbols);                                     \
  71             nd && (pos = rb_entry(nd, struct symbol, rb_node));        \
  72             nd = rb_next(nd))
  73
  74static inline size_t symbol__size(const struct symbol *sym)
  75{
  76        return sym->end - sym->start;
  77}
  78
  79struct strlist;
  80struct intlist;
  81
  82struct symbol_name_rb_node {
  83        struct rb_node  rb_node;
  84        struct symbol   sym;
  85};
  86
  87static inline int __symbol__join_symfs(char *bf, size_t size, const char *path)
  88{
  89        return path__join(bf, size, symbol_conf.symfs, path);
  90}
  91
  92#define symbol__join_symfs(bf, path) __symbol__join_symfs(bf, sizeof(bf), path)
  93
  94extern int vmlinux_path__nr_entries;
  95extern char **vmlinux_path;
  96
  97static inline void *symbol__priv(struct symbol *sym)
  98{
  99        return ((void *)sym) - symbol_conf.priv_size;
 100}
 101
 102struct ref_reloc_sym {
 103        const char      *name;
 104        u64             addr;
 105        u64             unrelocated_addr;
 106};
 107
 108struct block_info {
 109        struct symbol           *sym;
 110        u64                     start;
 111        u64                     end;
 112        u64                     cycles;
 113        u64                     cycles_aggr;
 114        int                     num;
 115        int                     num_aggr;
 116        refcount_t              refcnt;
 117};
 118
 119struct addr_location {
 120        struct machine *machine;
 121        struct thread *thread;
 122        struct map    *map;
 123        struct symbol *sym;
 124        const char    *srcline;
 125        u64           addr;
 126        char          level;
 127        u8            filtered;
 128        u8            cpumode;
 129        s32           cpu;
 130        s32           socket;
 131};
 132
 133int dso__load(struct dso *dso, struct map *map);
 134int dso__load_vmlinux(struct dso *dso, struct map *map,
 135                      const char *vmlinux, bool vmlinux_allocated);
 136int dso__load_vmlinux_path(struct dso *dso, struct map *map);
 137int __dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map,
 138                         bool no_kcore);
 139int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map);
 140
 141void dso__insert_symbol(struct dso *dso,
 142                        struct symbol *sym);
 143
 144struct symbol *dso__find_symbol(struct dso *dso, u64 addr);
 145struct symbol *dso__find_symbol_by_name(struct dso *dso, const char *name);
 146
 147struct symbol *symbol__next_by_name(struct symbol *sym);
 148
 149struct symbol *dso__first_symbol(struct dso *dso);
 150struct symbol *dso__last_symbol(struct dso *dso);
 151struct symbol *dso__next_symbol(struct symbol *sym);
 152
 153enum dso_type dso__type_fd(int fd);
 154
 155int filename__read_build_id(const char *filename, void *bf, size_t size);
 156int sysfs__read_build_id(const char *filename, void *bf, size_t size);
 157int modules__parse(const char *filename, void *arg,
 158                   int (*process_module)(void *arg, const char *name,
 159                                         u64 start, u64 size));
 160int filename__read_debuglink(const char *filename, char *debuglink,
 161                             size_t size);
 162
 163struct perf_env;
 164int symbol__init(struct perf_env *env);
 165void symbol__exit(void);
 166void symbol__elf_init(void);
 167int symbol__annotation_init(void);
 168
 169struct symbol *symbol__new(u64 start, u64 len, u8 binding, u8 type, const char *name);
 170size_t __symbol__fprintf_symname_offs(const struct symbol *sym,
 171                                      const struct addr_location *al,
 172                                      bool unknown_as_addr,
 173                                      bool print_offsets, FILE *fp);
 174size_t symbol__fprintf_symname_offs(const struct symbol *sym,
 175                                    const struct addr_location *al, FILE *fp);
 176size_t __symbol__fprintf_symname(const struct symbol *sym,
 177                                 const struct addr_location *al,
 178                                 bool unknown_as_addr, FILE *fp);
 179size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp);
 180size_t symbol__fprintf(struct symbol *sym, FILE *fp);
 181bool symbol__restricted_filename(const char *filename,
 182                                 const char *restricted_filename);
 183int symbol__config_symfs(const struct option *opt __maybe_unused,
 184                         const char *dir, int unset __maybe_unused);
 185
 186struct symsrc;
 187
 188int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
 189                  struct symsrc *runtime_ss, int kmodule);
 190int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss);
 191
 192char *dso__demangle_sym(struct dso *dso, int kmodule, const char *elf_name);
 193
 194void __symbols__insert(struct rb_root_cached *symbols, struct symbol *sym,
 195                       bool kernel);
 196void symbols__insert(struct rb_root_cached *symbols, struct symbol *sym);
 197void symbols__fixup_duplicate(struct rb_root_cached *symbols);
 198void symbols__fixup_end(struct rb_root_cached *symbols);
 199void map_groups__fixup_end(struct map_groups *mg);
 200
 201typedef int (*mapfn_t)(u64 start, u64 len, u64 pgoff, void *data);
 202int file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data,
 203                    bool *is_64_bit);
 204
 205#define PERF_KCORE_EXTRACT "/tmp/perf-kcore-XXXXXX"
 206
 207struct kcore_extract {
 208        char *kcore_filename;
 209        u64 addr;
 210        u64 offs;
 211        u64 len;
 212        char extract_filename[sizeof(PERF_KCORE_EXTRACT)];
 213        int fd;
 214};
 215
 216int kcore_extract__create(struct kcore_extract *kce);
 217void kcore_extract__delete(struct kcore_extract *kce);
 218
 219int kcore_copy(const char *from_dir, const char *to_dir);
 220int compare_proc_modules(const char *from, const char *to);
 221
 222int setup_list(struct strlist **list, const char *list_str,
 223               const char *list_name);
 224int setup_intlist(struct intlist **list, const char *list_str,
 225                  const char *list_name);
 226
 227#ifdef HAVE_LIBELF_SUPPORT
 228bool elf__needs_adjust_symbols(GElf_Ehdr ehdr);
 229void arch__sym_update(struct symbol *s, GElf_Sym *sym);
 230#endif
 231
 232const char *arch__normalize_symbol_name(const char *name);
 233#define SYMBOL_A 0
 234#define SYMBOL_B 1
 235
 236void arch__symbols__fixup_end(struct symbol *p, struct symbol *c);
 237int arch__compare_symbol_names(const char *namea, const char *nameb);
 238int arch__compare_symbol_names_n(const char *namea, const char *nameb,
 239                                 unsigned int n);
 240int arch__choose_best_symbol(struct symbol *syma, struct symbol *symb);
 241
 242enum symbol_tag_include {
 243        SYMBOL_TAG_INCLUDE__NONE = 0,
 244        SYMBOL_TAG_INCLUDE__DEFAULT_ONLY
 245};
 246
 247int symbol__match_symbol_name(const char *namea, const char *nameb,
 248                              enum symbol_tag_include includes);
 249
 250/* structure containing an SDT note's info */
 251struct sdt_note {
 252        char *name;                     /* name of the note*/
 253        char *provider;                 /* provider name */
 254        char *args;
 255        bool bit32;                     /* whether the location is 32 bits? */
 256        union {                         /* location, base and semaphore addrs */
 257                Elf64_Addr a64[3];
 258                Elf32_Addr a32[3];
 259        } addr;
 260        struct list_head note_list;     /* SDT notes' list */
 261};
 262
 263int get_sdt_note_list(struct list_head *head, const char *target);
 264int cleanup_sdt_note_list(struct list_head *sdt_notes);
 265int sdt_notes__get_count(struct list_head *start);
 266
 267#define SDT_PROBES_SCN ".probes"
 268#define SDT_BASE_SCN ".stapsdt.base"
 269#define SDT_NOTE_SCN  ".note.stapsdt"
 270#define SDT_NOTE_TYPE 3
 271#define SDT_NOTE_NAME "stapsdt"
 272#define NR_ADDR 3
 273
 274enum {
 275        SDT_NOTE_IDX_LOC = 0,
 276        SDT_NOTE_IDX_BASE,
 277        SDT_NOTE_IDX_REFCTR,
 278};
 279
 280struct mem_info *mem_info__new(void);
 281struct mem_info *mem_info__get(struct mem_info *mi);
 282void   mem_info__put(struct mem_info *mi);
 283
 284static inline void __mem_info__zput(struct mem_info **mi)
 285{
 286        mem_info__put(*mi);
 287        *mi = NULL;
 288}
 289
 290#define mem_info__zput(mi) __mem_info__zput(&mi)
 291
 292struct block_info *block_info__new(void);
 293struct block_info *block_info__get(struct block_info *bi);
 294void   block_info__put(struct block_info *bi);
 295
 296static inline void __block_info__zput(struct block_info **bi)
 297{
 298        block_info__put(*bi);
 299        *bi = NULL;
 300}
 301
 302#define block_info__zput(bi) __block_info__zput(&bi)
 303
 304#endif /* __PERF_SYMBOL */
 305