1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
24ea42b18SMasami Hiramatsu #ifndef _PROBE_FINDER_H
34ea42b18SMasami Hiramatsu #define _PROBE_FINDER_H
44ea42b18SMasami Hiramatsu
5804b3606SMasami Hiramatsu #include <stdbool.h>
65a62257aSMasami Hiramatsu #include "intlist.h"
77cd5738dSMasami Hiramatsu #include "build-id.h"
84235b045SMasami Hiramatsu #include "probe-event.h"
93052ba56SArnaldo Carvalho de Melo #include <linux/ctype.h>
104a58e611SArnaldo Carvalho de Melo
114ea42b18SMasami Hiramatsu #define MAX_PROBE_BUFFER 1024
124ea42b18SMasami Hiramatsu #define MAX_PROBES 128
137969ec77SMasami Hiramatsu #define MAX_PROBE_ARGS 128
144ea42b18SMasami Hiramatsu
15f8bffbf1SMasami Hiramatsu #define PROBE_ARG_VARS "$vars"
16f8bffbf1SMasami Hiramatsu #define PROBE_ARG_PARAMS "$params"
17f8bffbf1SMasami Hiramatsu
is_c_varname(const char * name)184ea42b18SMasami Hiramatsu static inline int is_c_varname(const char *name)
194ea42b18SMasami Hiramatsu {
204ea42b18SMasami Hiramatsu /* TODO */
214ea42b18SMasami Hiramatsu return isalpha(name[0]) || name[0] == '_';
224ea42b18SMasami Hiramatsu }
234ea42b18SMasami Hiramatsu
2489fe808aSIngo Molnar #ifdef HAVE_DWARF_SUPPORT
25ff741783SMasami Hiramatsu
26ff741783SMasami Hiramatsu #include "dwarf-aux.h"
27ff741783SMasami Hiramatsu
28ff741783SMasami Hiramatsu /* TODO: export debuginfo data structure even if no dwarf support */
29ff741783SMasami Hiramatsu
30ff741783SMasami Hiramatsu /* debug information structure */
31ff741783SMasami Hiramatsu struct debuginfo {
32ff741783SMasami Hiramatsu Dwarf *dbg;
33576b5237SMasami Hiramatsu Dwfl_Module *mod;
34ff741783SMasami Hiramatsu Dwfl *dwfl;
35ff741783SMasami Hiramatsu Dwarf_Addr bias;
367cd5738dSMasami Hiramatsu const unsigned char *build_id;
37ff741783SMasami Hiramatsu };
38ff741783SMasami Hiramatsu
39a15ad2f5SMasami Hiramatsu /* This also tries to open distro debuginfo */
403938bad4SArnaldo Carvalho de Melo struct debuginfo *debuginfo__new(const char *path);
413938bad4SArnaldo Carvalho de Melo void debuginfo__delete(struct debuginfo *dbg);
42ff741783SMasami Hiramatsu
430e60836bSSrikar Dronamraju /* Find probe_trace_events specified by perf_probe_event from debuginfo */
443938bad4SArnaldo Carvalho de Melo int debuginfo__find_trace_events(struct debuginfo *dbg,
45ff741783SMasami Hiramatsu struct perf_probe_event *pev,
46ddb2f58fSMasami Hiramatsu struct probe_trace_event **tevs);
474235b045SMasami Hiramatsu
48fb1587d8SMasami Hiramatsu /* Find a perf_probe_point from debuginfo */
4922a66551SYang Jihong int debuginfo__find_probe_point(struct debuginfo *dbg, u64 addr,
50fb1587d8SMasami Hiramatsu struct perf_probe_point *ppt);
51fb1587d8SMasami Hiramatsu
52613f050dSMasami Hiramatsu int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs,
53613f050dSMasami Hiramatsu bool adjust_offset);
54613f050dSMasami Hiramatsu
55cf6eb489SMasami Hiramatsu /* Find a line range */
563938bad4SArnaldo Carvalho de Melo int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr);
574ea42b18SMasami Hiramatsu
58cf6eb489SMasami Hiramatsu /* Find available variables */
593938bad4SArnaldo Carvalho de Melo int debuginfo__find_available_vars_at(struct debuginfo *dbg,
60ff741783SMasami Hiramatsu struct perf_probe_event *pev,
61ddb2f58fSMasami Hiramatsu struct variable_list **vls);
624ea42b18SMasami Hiramatsu
6309ed8975SNaohiro Aota /* Find a src file from a DWARF tag path */
647cd5738dSMasami Hiramatsu int find_source_path(const char *raw_path, const char *sbuild_id,
657cd5738dSMasami Hiramatsu const char *comp_dir, char **new_path);
6609ed8975SNaohiro Aota
674ea42b18SMasami Hiramatsu struct probe_finder {
684235b045SMasami Hiramatsu struct perf_probe_event *pev; /* Target probe event */
697cd5738dSMasami Hiramatsu struct debuginfo *dbg;
70cf6eb489SMasami Hiramatsu
71cf6eb489SMasami Hiramatsu /* Callback when a probe point is found */
72221d0611SMasami Hiramatsu int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf);
734ea42b18SMasami Hiramatsu
744ea42b18SMasami Hiramatsu /* For function searching */
75eed05fe7SArnaldo Carvalho de Melo int lno; /* Line number */
764ea42b18SMasami Hiramatsu Dwarf_Addr addr; /* Address */
774235b045SMasami Hiramatsu const char *fname; /* Real file name */
78b0ef0732SMasami Hiramatsu Dwarf_Die cu_die; /* Current CU */
79cd25f8bcSLin Ming Dwarf_Die sp_die;
805a62257aSMasami Hiramatsu struct intlist *lcache; /* Line cache for lazy match */
814ea42b18SMasami Hiramatsu
824ea42b18SMasami Hiramatsu /* For variable searching */
837752f1b0SMasami Hiramatsu #if _ELFUTILS_PREREQ(0, 142)
84*2c6f6c38SIan Rogers /* Call Frame Information from .eh_frame. Owned by this struct. */
85270bde1eSHemant Kumar Dwarf_CFI *cfi_eh;
86*2c6f6c38SIan Rogers /* Call Frame Information from .debug_frame. Not owned. */
87270bde1eSHemant Kumar Dwarf_CFI *cfi_dbg;
887752f1b0SMasami Hiramatsu #endif
89804b3606SMasami Hiramatsu Dwarf_Op *fb_ops; /* Frame base attribute */
90293d5b43SMasami Hiramatsu unsigned int machine; /* Target machine arch */
914235b045SMasami Hiramatsu struct perf_probe_arg *pvar; /* Current target variable */
920e60836bSSrikar Dronamraju struct probe_trace_arg *tvar; /* Current result variable */
93cb402730SMasami Hiramatsu bool skip_empty_arg; /* Skip non-exist args */
944ea42b18SMasami Hiramatsu };
95631c9defSMasami Hiramatsu
96cf6eb489SMasami Hiramatsu struct trace_event_finder {
97cf6eb489SMasami Hiramatsu struct probe_finder pf;
98576b5237SMasami Hiramatsu Dwfl_Module *mod; /* For solving symbols */
99cf6eb489SMasami Hiramatsu struct probe_trace_event *tevs; /* Found trace events */
100cf6eb489SMasami Hiramatsu int ntevs; /* Number of trace events */
101cf6eb489SMasami Hiramatsu int max_tevs; /* Max number of trace events */
102cf6eb489SMasami Hiramatsu };
103cf6eb489SMasami Hiramatsu
104cf6eb489SMasami Hiramatsu struct available_var_finder {
105cf6eb489SMasami Hiramatsu struct probe_finder pf;
106576b5237SMasami Hiramatsu Dwfl_Module *mod; /* For solving symbols */
107cf6eb489SMasami Hiramatsu struct variable_list *vls; /* Found variable lists */
108cf6eb489SMasami Hiramatsu int nvls; /* Number of variable lists */
109cf6eb489SMasami Hiramatsu int max_vls; /* Max no. of variable lists */
110fb8c5a56SMasami Hiramatsu bool child; /* Search child scopes */
111cf6eb489SMasami Hiramatsu };
112cf6eb489SMasami Hiramatsu
113631c9defSMasami Hiramatsu struct line_finder {
114631c9defSMasami Hiramatsu struct line_range *lr; /* Target line range */
115631c9defSMasami Hiramatsu
116804b3606SMasami Hiramatsu const char *fname; /* File name */
117804b3606SMasami Hiramatsu int lno_s; /* Start line number */
118804b3606SMasami Hiramatsu int lno_e; /* End line number */
119631c9defSMasami Hiramatsu Dwarf_Die cu_die; /* Current CU */
120cd25f8bcSLin Ming Dwarf_Die sp_die;
121631c9defSMasami Hiramatsu int found;
122631c9defSMasami Hiramatsu };
123631c9defSMasami Hiramatsu
12489fe808aSIngo Molnar #endif /* HAVE_DWARF_SUPPORT */
1254ea42b18SMasami Hiramatsu
1264ea42b18SMasami Hiramatsu #endif /*_PROBE_FINDER_H */
127