]>
Commit | Line | Data |
---|---|---|
1 | /* SPDX-License-Identifier: GPL-2.0 */ | |
2 | #ifndef _PROBE_FINDER_H | |
3 | #define _PROBE_FINDER_H | |
4 | ||
5 | #include <stdbool.h> | |
6 | #include "intlist.h" | |
7 | #include "probe-event.h" | |
8 | #include "sane_ctype.h" | |
9 | ||
10 | #define MAX_PROBE_BUFFER 1024 | |
11 | #define MAX_PROBES 128 | |
12 | #define MAX_PROBE_ARGS 128 | |
13 | ||
14 | #define PROBE_ARG_VARS "$vars" | |
15 | #define PROBE_ARG_PARAMS "$params" | |
16 | ||
17 | static inline int is_c_varname(const char *name) | |
18 | { | |
19 | /* TODO */ | |
20 | return isalpha(name[0]) || name[0] == '_'; | |
21 | } | |
22 | ||
23 | #ifdef HAVE_DWARF_SUPPORT | |
24 | ||
25 | #include "dwarf-aux.h" | |
26 | ||
27 | /* TODO: export debuginfo data structure even if no dwarf support */ | |
28 | ||
29 | /* debug information structure */ | |
30 | struct debuginfo { | |
31 | Dwarf *dbg; | |
32 | Dwfl_Module *mod; | |
33 | Dwfl *dwfl; | |
34 | Dwarf_Addr bias; | |
35 | }; | |
36 | ||
37 | /* This also tries to open distro debuginfo */ | |
38 | struct debuginfo *debuginfo__new(const char *path); | |
39 | void debuginfo__delete(struct debuginfo *dbg); | |
40 | ||
41 | /* Find probe_trace_events specified by perf_probe_event from debuginfo */ | |
42 | int debuginfo__find_trace_events(struct debuginfo *dbg, | |
43 | struct perf_probe_event *pev, | |
44 | struct probe_trace_event **tevs); | |
45 | ||
46 | /* Find a perf_probe_point from debuginfo */ | |
47 | int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, | |
48 | struct perf_probe_point *ppt); | |
49 | ||
50 | int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs, | |
51 | bool adjust_offset); | |
52 | ||
53 | /* Find a line range */ | |
54 | int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr); | |
55 | ||
56 | /* Find available variables */ | |
57 | int debuginfo__find_available_vars_at(struct debuginfo *dbg, | |
58 | struct perf_probe_event *pev, | |
59 | struct variable_list **vls); | |
60 | ||
61 | /* Find a src file from a DWARF tag path */ | |
62 | int get_real_path(const char *raw_path, const char *comp_dir, | |
63 | char **new_path); | |
64 | ||
65 | struct probe_finder { | |
66 | struct perf_probe_event *pev; /* Target probe event */ | |
67 | ||
68 | /* Callback when a probe point is found */ | |
69 | int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf); | |
70 | ||
71 | /* For function searching */ | |
72 | int lno; /* Line number */ | |
73 | Dwarf_Addr addr; /* Address */ | |
74 | const char *fname; /* Real file name */ | |
75 | Dwarf_Die cu_die; /* Current CU */ | |
76 | Dwarf_Die sp_die; | |
77 | struct intlist *lcache; /* Line cache for lazy match */ | |
78 | ||
79 | /* For variable searching */ | |
80 | #if _ELFUTILS_PREREQ(0, 142) | |
81 | /* Call Frame Information from .eh_frame */ | |
82 | Dwarf_CFI *cfi_eh; | |
83 | /* Call Frame Information from .debug_frame */ | |
84 | Dwarf_CFI *cfi_dbg; | |
85 | #endif | |
86 | Dwarf_Op *fb_ops; /* Frame base attribute */ | |
87 | unsigned int machine; /* Target machine arch */ | |
88 | struct perf_probe_arg *pvar; /* Current target variable */ | |
89 | struct probe_trace_arg *tvar; /* Current result variable */ | |
90 | }; | |
91 | ||
92 | struct trace_event_finder { | |
93 | struct probe_finder pf; | |
94 | Dwfl_Module *mod; /* For solving symbols */ | |
95 | struct probe_trace_event *tevs; /* Found trace events */ | |
96 | int ntevs; /* Number of trace events */ | |
97 | int max_tevs; /* Max number of trace events */ | |
98 | }; | |
99 | ||
100 | struct available_var_finder { | |
101 | struct probe_finder pf; | |
102 | Dwfl_Module *mod; /* For solving symbols */ | |
103 | struct variable_list *vls; /* Found variable lists */ | |
104 | int nvls; /* Number of variable lists */ | |
105 | int max_vls; /* Max no. of variable lists */ | |
106 | bool child; /* Search child scopes */ | |
107 | }; | |
108 | ||
109 | struct line_finder { | |
110 | struct line_range *lr; /* Target line range */ | |
111 | ||
112 | const char *fname; /* File name */ | |
113 | int lno_s; /* Start line number */ | |
114 | int lno_e; /* End line number */ | |
115 | Dwarf_Die cu_die; /* Current CU */ | |
116 | Dwarf_Die sp_die; | |
117 | int found; | |
118 | }; | |
119 | ||
120 | #endif /* HAVE_DWARF_SUPPORT */ | |
121 | ||
122 | #endif /*_PROBE_FINDER_H */ |