Commit | Line | Data |
---|---|---|
71ad0f5e JO |
1 | #ifndef __UNWIND_H |
2 | #define __UNWIND_H | |
3 | ||
d944c4ee | 4 | #include <linux/types.h> |
71ad0f5e JO |
5 | #include "event.h" |
6 | #include "symbol.h" | |
66f066d8 | 7 | #include "thread.h" |
71ad0f5e JO |
8 | |
9 | struct unwind_entry { | |
10 | struct map *map; | |
11 | struct symbol *sym; | |
12 | u64 ip; | |
13 | }; | |
14 | ||
15 | typedef int (*unwind_entry_cb_t)(struct unwind_entry *entry, void *arg); | |
16 | ||
f83c0415 HK |
17 | struct unwind_libunwind_ops { |
18 | int (*prepare_access)(struct thread *thread); | |
19 | void (*flush_access)(struct thread *thread); | |
20 | void (*finish_access)(struct thread *thread); | |
21 | int (*get_entries)(unwind_entry_cb_t cb, void *arg, | |
22 | struct thread *thread, | |
23 | struct perf_sample *data, int max_stack); | |
24 | }; | |
25 | ||
9ff125d1 | 26 | #ifdef HAVE_DWARF_UNWIND_SUPPORT |
71ad0f5e | 27 | int unwind__get_entries(unwind_entry_cb_t cb, void *arg, |
71ad0f5e | 28 | struct thread *thread, |
37676af1 | 29 | struct perf_sample *data, int max_stack); |
9ff125d1 JO |
30 | /* libunwind specific */ |
31 | #ifdef HAVE_LIBUNWIND_SUPPORT | |
eeb118c5 HK |
32 | #ifndef LIBUNWIND__ARCH_REG_ID |
33 | #define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arch_reg_id(regnum) | |
34 | #endif | |
78ff1d6d HK |
35 | |
36 | #ifndef LIBUNWIND__ARCH_REG_SP | |
37 | #define LIBUNWIND__ARCH_REG_SP PERF_REG_SP | |
38 | #endif | |
39 | ||
40 | #ifndef LIBUNWIND__ARCH_REG_IP | |
41 | #define LIBUNWIND__ARCH_REG_IP PERF_REG_IP | |
42 | #endif | |
43 | ||
eeb118c5 | 44 | int LIBUNWIND__ARCH_REG_ID(int regnum); |
a2873325 JO |
45 | int unwind__prepare_access(struct thread *thread, struct map *map, |
46 | bool *initialized); | |
380b5143 | 47 | void unwind__flush_access(struct thread *thread); |
66f066d8 NK |
48 | void unwind__finish_access(struct thread *thread); |
49 | #else | |
d64ec10e | 50 | static inline int unwind__prepare_access(struct thread *thread __maybe_unused, |
a2873325 JO |
51 | struct map *map __maybe_unused, |
52 | bool *initialized __maybe_unused) | |
66f066d8 NK |
53 | { |
54 | return 0; | |
55 | } | |
56 | ||
380b5143 | 57 | static inline void unwind__flush_access(struct thread *thread __maybe_unused) {} |
66f066d8 | 58 | static inline void unwind__finish_access(struct thread *thread __maybe_unused) {} |
9ff125d1 | 59 | #endif |
71ad0f5e JO |
60 | #else |
61 | static inline int | |
1d037ca1 IT |
62 | unwind__get_entries(unwind_entry_cb_t cb __maybe_unused, |
63 | void *arg __maybe_unused, | |
1d037ca1 | 64 | struct thread *thread __maybe_unused, |
37676af1 ACM |
65 | struct perf_sample *data __maybe_unused, |
66 | int max_stack __maybe_unused) | |
71ad0f5e JO |
67 | { |
68 | return 0; | |
69 | } | |
66f066d8 | 70 | |
d64ec10e | 71 | static inline int unwind__prepare_access(struct thread *thread __maybe_unused, |
a2873325 JO |
72 | struct map *map __maybe_unused, |
73 | bool *initialized __maybe_unused) | |
66f066d8 NK |
74 | { |
75 | return 0; | |
76 | } | |
77 | ||
380b5143 | 78 | static inline void unwind__flush_access(struct thread *thread __maybe_unused) {} |
66f066d8 | 79 | static inline void unwind__finish_access(struct thread *thread __maybe_unused) {} |
9ff125d1 | 80 | #endif /* HAVE_DWARF_UNWIND_SUPPORT */ |
71ad0f5e | 81 | #endif /* __UNWIND_H */ |