xref: /openbmc/linux/tools/perf/util/probe-finder.h (revision 22a66551)
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 */
49*22a66551SYang 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)
84270bde1eSHemant Kumar 	/* Call Frame Information from .eh_frame */
85270bde1eSHemant Kumar 	Dwarf_CFI		*cfi_eh;
86270bde1eSHemant Kumar 	/* Call Frame Information from .debug_frame */
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