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