~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/perf/util/symbol.h

Version: ~ [ linux-5.12-rc7 ] ~ [ linux-5.11.13 ] ~ [ linux-5.10.29 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.111 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.186 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.230 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.266 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.266 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 #include "event.h"
 16 #include "util.h"
 17 
 18 #ifdef HAVE_LIBELF_SUPPORT
 19 #include <libelf.h>
 20 #include <gelf.h>
 21 #endif
 22 #include <elf.h>
 23 
 24 #include "dso.h"
 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
 37 Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
 38                              GElf_Shdr *shp, const char *name, size_t *idx);
 39 #endif
 40 
 41 #ifndef DMGL_PARAMS
 42 #define DMGL_NO_OPTS     0              /* For readability... */
 43 #define DMGL_PARAMS      (1 << 0)       /* Include function args */
 44 #define DMGL_ANSI        (1 << 1)       /* Include const, volatile, etc */
 45 #endif
 46 
 47 /** struct symbol - symtab entry
 48  *
 49  * @ignore - resolvable but tools ignore it (e.g. idle routines)
 50  */
 51 struct symbol {
 52         struct rb_node  rb_node;
 53         u64             start;
 54         u64             end;
 55         u16             namelen;
 56         u8              binding;
 57         bool            ignore;
 58         char            name[0];
 59 };
 60 
 61 void symbol__delete(struct symbol *sym);
 62 void symbols__delete(struct rb_root *symbols);
 63 
 64 /* symbols__for_each_entry - iterate over symbols (rb_root)
 65  *
 66  * @symbols: the rb_root of symbols
 67  * @pos: the 'struct symbol *' to use as a loop cursor
 68  * @nd: the 'struct rb_node *' to use as a temporary storage
 69  */
 70 #define symbols__for_each_entry(symbols, pos, nd)                       \
 71         for (nd = rb_first(symbols);                                    \
 72              nd && (pos = rb_entry(nd, struct symbol, rb_node));        \
 73              nd = rb_next(nd))
 74 
 75 static inline size_t symbol__size(const struct symbol *sym)
 76 {
 77         return sym->end - sym->start;
 78 }
 79 
 80 struct strlist;
 81 struct intlist;
 82 
 83 struct symbol_conf {
 84         unsigned short  priv_size;
 85         unsigned short  nr_events;
 86         bool            try_vmlinux_path,
 87                         force,
 88                         ignore_vmlinux,
 89                         ignore_vmlinux_buildid,
 90                         show_kernel_path,
 91                         use_modules,
 92                         allow_aliases,
 93                         sort_by_name,
 94                         show_nr_samples,
 95                         show_total_period,
 96                         use_callchain,
 97                         cumulate_callchain,
 98                         exclude_other,
 99                         show_cpu_utilization,
100                         initialized,
101                         kptr_restrict,
102                         annotate_asm_raw,
103                         annotate_src,
104                         event_group,
105                         demangle,
106                         demangle_kernel,
107                         filter_relative,
108                         show_hist_headers,
109                         branch_callstack,
110                         has_filter,
111                         show_ref_callgraph,
112                         hide_unresolved,
113                         raw_trace,
114                         report_hierarchy;
115         const char      *vmlinux_name,
116                         *kallsyms_name,
117                         *source_prefix,
118                         *field_sep;
119         const char      *default_guest_vmlinux_name,
120                         *default_guest_kallsyms,
121                         *default_guest_modules;
122         const char      *guestmount;
123         const char      *dso_list_str,
124                         *comm_list_str,
125                         *pid_list_str,
126                         *tid_list_str,
127                         *sym_list_str,
128                         *col_width_list_str;
129        struct strlist   *dso_list,
130                         *comm_list,
131                         *sym_list,
132                         *dso_from_list,
133                         *dso_to_list,
134                         *sym_from_list,
135                         *sym_to_list;
136         struct intlist  *pid_list,
137                         *tid_list;
138         const char      *symfs;
139 };
140 
141 extern struct symbol_conf symbol_conf;
142 
143 static inline int __symbol__join_symfs(char *bf, size_t size, const char *path)
144 {
145         return path__join(bf, size, symbol_conf.symfs, path);
146 }
147 
148 #define symbol__join_symfs(bf, path) __symbol__join_symfs(bf, sizeof(bf), path)
149 
150 extern int vmlinux_path__nr_entries;
151 extern char **vmlinux_path;
152 
153 static inline void *symbol__priv(struct symbol *sym)
154 {
155         return ((void *)sym) - symbol_conf.priv_size;
156 }
157 
158 struct ref_reloc_sym {
159         const char      *name;
160         u64             addr;
161         u64             unrelocated_addr;
162 };
163 
164 struct map_symbol {
165         struct map    *map;
166         struct symbol *sym;
167 };
168 
169 struct addr_map_symbol {
170         struct map    *map;
171         struct symbol *sym;
172         u64           addr;
173         u64           al_addr;
174 };
175 
176 struct branch_info {
177         struct addr_map_symbol from;
178         struct addr_map_symbol to;
179         struct branch_flags flags;
180 };
181 
182 struct mem_info {
183         struct addr_map_symbol iaddr;
184         struct addr_map_symbol daddr;
185         union perf_mem_data_src data_src;
186 };
187 
188 struct addr_location {
189         struct machine *machine;
190         struct thread *thread;
191         struct map    *map;
192         struct symbol *sym;
193         u64           addr;
194         char          level;
195         u8            filtered;
196         u8            cpumode;
197         s32           cpu;
198         s32           socket;
199 };
200 
201 struct symsrc {
202         char *name;
203         int fd;
204         enum dso_binary_type type;
205 
206 #ifdef HAVE_LIBELF_SUPPORT
207         Elf *elf;
208         GElf_Ehdr ehdr;
209 
210         Elf_Scn *opdsec;
211         size_t opdidx;
212         GElf_Shdr opdshdr;
213 
214         Elf_Scn *symtab;
215         GElf_Shdr symshdr;
216 
217         Elf_Scn *dynsym;
218         size_t dynsym_idx;
219         GElf_Shdr dynshdr;
220 
221         bool adjust_symbols;
222         bool is_64_bit;
223 #endif
224 };
225 
226 void symsrc__destroy(struct symsrc *ss);
227 int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
228                  enum dso_binary_type type);
229 bool symsrc__has_symtab(struct symsrc *ss);
230 bool symsrc__possibly_runtime(struct symsrc *ss);
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, bool vmlinux_allocated,
235                       symbol_filter_t filter);
236 int dso__load_vmlinux_path(struct dso *dso, struct map *map,
237                            symbol_filter_t filter);
238 int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map,
239                        symbol_filter_t filter);
240 
241 struct symbol *dso__find_symbol(struct dso *dso, enum map_type type,
242                                 u64 addr);
243 struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type,
244                                         const char *name);
245 struct symbol *symbol__next_by_name(struct symbol *sym);
246 
247 struct symbol *dso__first_symbol(struct dso *dso, enum map_type type);
248 struct symbol *dso__next_symbol(struct symbol *sym);
249 
250 enum dso_type dso__type_fd(int fd);
251 
252 int filename__read_build_id(const char *filename, void *bf, size_t size);
253 int sysfs__read_build_id(const char *filename, void *bf, size_t size);
254 int modules__parse(const char *filename, void *arg,
255                    int (*process_module)(void *arg, const char *name,
256                                          u64 start));
257 int filename__read_debuglink(const char *filename, char *debuglink,
258                              size_t size);
259 
260 struct perf_env;
261 int symbol__init(struct perf_env *env);
262 void symbol__exit(void);
263 void symbol__elf_init(void);
264 struct symbol *symbol__new(u64 start, u64 len, u8 binding, const char *name);
265 size_t symbol__fprintf_symname_offs(const struct symbol *sym,
266                                     const struct addr_location *al, FILE *fp);
267 size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp);
268 size_t symbol__fprintf(struct symbol *sym, FILE *fp);
269 bool symbol_type__is_a(char symbol_type, enum map_type map_type);
270 bool symbol__restricted_filename(const char *filename,
271                                  const char *restricted_filename);
272 bool symbol__is_idle(struct symbol *sym);
273 
274 int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
275                   struct symsrc *runtime_ss, symbol_filter_t filter,
276                   int kmodule);
277 int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss,
278                                 struct map *map, symbol_filter_t filter);
279 
280 void symbols__insert(struct rb_root *symbols, struct symbol *sym);
281 void symbols__fixup_duplicate(struct rb_root *symbols);
282 void symbols__fixup_end(struct rb_root *symbols);
283 void __map_groups__fixup_end(struct map_groups *mg, enum map_type type);
284 
285 typedef int (*mapfn_t)(u64 start, u64 len, u64 pgoff, void *data);
286 int file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data,
287                     bool *is_64_bit);
288 
289 #define PERF_KCORE_EXTRACT "/tmp/perf-kcore-XXXXXX"
290 
291 struct kcore_extract {
292         char *kcore_filename;
293         u64 addr;
294         u64 offs;
295         u64 len;
296         char extract_filename[sizeof(PERF_KCORE_EXTRACT)];
297         int fd;
298 };
299 
300 int kcore_extract__create(struct kcore_extract *kce);
301 void kcore_extract__delete(struct kcore_extract *kce);
302 
303 int kcore_copy(const char *from_dir, const char *to_dir);
304 int compare_proc_modules(const char *from, const char *to);
305 
306 int setup_list(struct strlist **list, const char *list_str,
307                const char *list_name);
308 int setup_intlist(struct intlist **list, const char *list_str,
309                   const char *list_name);
310 
311 #ifdef HAVE_LIBELF_SUPPORT
312 bool elf__needs_adjust_symbols(GElf_Ehdr ehdr);
313 void arch__elf_sym_adjust(GElf_Sym *sym);
314 #endif
315 
316 #define SYMBOL_A 0
317 #define SYMBOL_B 1
318 
319 int arch__choose_best_symbol(struct symbol *syma, struct symbol *symb);
320 
321 #endif /* __PERF_SYMBOL */
322 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp