xref: /openbmc/linux/tools/perf/util/probe-finder.h (revision 804b3606)
14ea42b18SMasami Hiramatsu #ifndef _PROBE_FINDER_H
24ea42b18SMasami Hiramatsu #define _PROBE_FINDER_H
34ea42b18SMasami Hiramatsu 
4804b3606SMasami Hiramatsu #include <stdbool.h>
54a58e611SArnaldo Carvalho de Melo #include "util.h"
64a58e611SArnaldo Carvalho de Melo 
74ea42b18SMasami Hiramatsu #define MAX_PATH_LEN		 256
84ea42b18SMasami Hiramatsu #define MAX_PROBE_BUFFER	1024
94ea42b18SMasami Hiramatsu #define MAX_PROBES		 128
104ea42b18SMasami Hiramatsu 
114ea42b18SMasami Hiramatsu static inline int is_c_varname(const char *name)
124ea42b18SMasami Hiramatsu {
134ea42b18SMasami Hiramatsu 	/* TODO */
144ea42b18SMasami Hiramatsu 	return isalpha(name[0]) || name[0] == '_';
154ea42b18SMasami Hiramatsu }
164ea42b18SMasami Hiramatsu 
174ea42b18SMasami Hiramatsu struct probe_point {
18af663d75SMasami Hiramatsu 	char			*event;			/* Event name */
19af663d75SMasami Hiramatsu 	char			*group;			/* Event group */
20af663d75SMasami Hiramatsu 
214ea42b18SMasami Hiramatsu 	/* Inputs */
224ea42b18SMasami Hiramatsu 	char			*file;			/* File name */
234ea42b18SMasami Hiramatsu 	int			line;			/* Line number */
244ea42b18SMasami Hiramatsu 
254ea42b18SMasami Hiramatsu 	char			*function;		/* Function name */
264ea42b18SMasami Hiramatsu 	int			offset;			/* Offset bytes */
274ea42b18SMasami Hiramatsu 
284ea42b18SMasami Hiramatsu 	int			nr_args;		/* Number of arguments */
294ea42b18SMasami Hiramatsu 	char			**args;			/* Arguments */
304ea42b18SMasami Hiramatsu 
31253977b0SMasami Hiramatsu 	int			retprobe;		/* Return probe */
32253977b0SMasami Hiramatsu 
334ea42b18SMasami Hiramatsu 	/* Output */
344ea42b18SMasami Hiramatsu 	int			found;			/* Number of found probe points */
354ea42b18SMasami Hiramatsu 	char			*probes[MAX_PROBES];	/* Output buffers (will be allocated)*/
364ea42b18SMasami Hiramatsu };
374ea42b18SMasami Hiramatsu 
38631c9defSMasami Hiramatsu /* Line number container */
39631c9defSMasami Hiramatsu struct line_node {
40631c9defSMasami Hiramatsu 	struct list_head	list;
41631c9defSMasami Hiramatsu 	unsigned int		line;
42631c9defSMasami Hiramatsu };
43631c9defSMasami Hiramatsu 
44631c9defSMasami Hiramatsu /* Line range */
45631c9defSMasami Hiramatsu struct line_range {
46631c9defSMasami Hiramatsu 	char			*file;			/* File name */
47631c9defSMasami Hiramatsu 	char			*function;		/* Function name */
48631c9defSMasami Hiramatsu 	unsigned int		start;			/* Start line number */
49631c9defSMasami Hiramatsu 	unsigned int		end;			/* End line number */
50804b3606SMasami Hiramatsu 	int			offset;			/* Start line offset */
51631c9defSMasami Hiramatsu 	char			*path;			/* Real path name */
52631c9defSMasami Hiramatsu 	struct list_head	line_list;		/* Visible lines */
53631c9defSMasami Hiramatsu };
54631c9defSMasami Hiramatsu 
55804b3606SMasami Hiramatsu #ifndef NO_DWARF_SUPPORT
5681cb8aa3SMasami Hiramatsu extern int find_probe_point(int fd, struct probe_point *pp);
57631c9defSMasami Hiramatsu extern int find_line_range(int fd, struct line_range *lr);
584ea42b18SMasami Hiramatsu 
5927f3b24dSMasami Hiramatsu #include <dwarf.h>
60804b3606SMasami Hiramatsu #include <libdw.h>
614ea42b18SMasami Hiramatsu 
624ea42b18SMasami Hiramatsu struct probe_finder {
634ea42b18SMasami Hiramatsu 	struct probe_point	*pp;		/* Target probe point */
644ea42b18SMasami Hiramatsu 
654ea42b18SMasami Hiramatsu 	/* For function searching */
664ea42b18SMasami Hiramatsu 	Dwarf_Addr		addr;		/* Address */
67804b3606SMasami Hiramatsu 	const char		*fname;		/* File name */
68804b3606SMasami Hiramatsu 	int			lno;		/* Line number */
69804b3606SMasami Hiramatsu 	void			*origin;	/* Inline origin addr */
70b0ef0732SMasami Hiramatsu 	Dwarf_Die		cu_die;		/* Current CU */
714ea42b18SMasami Hiramatsu 
724ea42b18SMasami Hiramatsu 	/* For variable searching */
73804b3606SMasami Hiramatsu 	Dwarf_Op		*fb_ops;	/* Frame base attribute */
744ea42b18SMasami Hiramatsu 	Dwarf_Addr		cu_base;	/* Current CU base address */
754ea42b18SMasami Hiramatsu 	const char		*var;		/* Current variable name */
764ea42b18SMasami Hiramatsu 	char			*buf;		/* Current output buffer */
774ea42b18SMasami Hiramatsu 	int			len;		/* Length of output buffer */
784ea42b18SMasami Hiramatsu };
79631c9defSMasami Hiramatsu 
80631c9defSMasami Hiramatsu struct line_finder {
81631c9defSMasami Hiramatsu 	struct line_range	*lr;		/* Target line range */
82631c9defSMasami Hiramatsu 
83804b3606SMasami Hiramatsu 	const char		*fname;		/* File name */
84804b3606SMasami Hiramatsu 	int			lno_s;		/* Start line number */
85804b3606SMasami Hiramatsu 	int			lno_e;		/* End line number */
86631c9defSMasami Hiramatsu 	Dwarf_Addr		addr_s;		/* Start address */
87631c9defSMasami Hiramatsu 	Dwarf_Addr		addr_e;		/* End address */
88631c9defSMasami Hiramatsu 	Dwarf_Die		cu_die;		/* Current CU */
89631c9defSMasami Hiramatsu 	int			found;
90631c9defSMasami Hiramatsu };
91631c9defSMasami Hiramatsu 
92804b3606SMasami Hiramatsu #endif /* NO_DWARF_SUPPORT */
934ea42b18SMasami Hiramatsu 
944ea42b18SMasami Hiramatsu #endif /*_PROBE_FINDER_H */
95