xref: /openbmc/linux/tools/perf/util/probe-finder.h (revision 23e8ec0d)
14ea42b18SMasami Hiramatsu #ifndef _PROBE_FINDER_H
24ea42b18SMasami Hiramatsu #define _PROBE_FINDER_H
34ea42b18SMasami Hiramatsu 
44ea42b18SMasami Hiramatsu #define _stringify(n)	#n
54ea42b18SMasami Hiramatsu #define stringify(n)	_stringify(n)
64ea42b18SMasami Hiramatsu 
74ea42b18SMasami Hiramatsu #ifdef DEBUG
84ea42b18SMasami Hiramatsu #define debug(fmt ...)	\
94ea42b18SMasami Hiramatsu 	fprintf(stderr, "DBG(" __FILE__ ":" stringify(__LINE__) "): " fmt)
104ea42b18SMasami Hiramatsu #else
114ea42b18SMasami Hiramatsu #define debug(fmt ...)	do {} while (0)
124ea42b18SMasami Hiramatsu #endif
134ea42b18SMasami Hiramatsu 
144ea42b18SMasami Hiramatsu #define ERR_IF(cnd)	\
154ea42b18SMasami Hiramatsu 	do { if (cnd) {	\
164ea42b18SMasami Hiramatsu 		fprintf(stderr, "Error (" __FILE__ ":" stringify(__LINE__) \
174ea42b18SMasami Hiramatsu 			"): " stringify(cnd) "\n");			\
184ea42b18SMasami Hiramatsu 		exit(1);						\
194ea42b18SMasami Hiramatsu 	} } while (0)
204ea42b18SMasami Hiramatsu 
214ea42b18SMasami Hiramatsu #define MAX_PATH_LEN 256
224ea42b18SMasami Hiramatsu #define MAX_PROBE_BUFFER 1024
234ea42b18SMasami Hiramatsu #define MAX_PROBES 128
244ea42b18SMasami Hiramatsu 
254ea42b18SMasami Hiramatsu static inline int is_c_varname(const char *name)
264ea42b18SMasami Hiramatsu {
274ea42b18SMasami Hiramatsu 	/* TODO */
284ea42b18SMasami Hiramatsu 	return isalpha(name[0]) || name[0] == '_';
294ea42b18SMasami Hiramatsu }
304ea42b18SMasami Hiramatsu 
314ea42b18SMasami Hiramatsu struct probe_point {
324ea42b18SMasami Hiramatsu 	/* Inputs */
334ea42b18SMasami Hiramatsu 	char	*file;		/* File name */
344ea42b18SMasami Hiramatsu 	int	line;		/* Line number */
354ea42b18SMasami Hiramatsu 
364ea42b18SMasami Hiramatsu 	char	*function;	/* Function name */
374ea42b18SMasami Hiramatsu 	int	offset;		/* Offset bytes */
384ea42b18SMasami Hiramatsu 
394ea42b18SMasami Hiramatsu 	int	nr_args;	/* Number of arguments */
404ea42b18SMasami Hiramatsu 	char	**args;		/* Arguments */
414ea42b18SMasami Hiramatsu 
424ea42b18SMasami Hiramatsu 	/* Output */
434ea42b18SMasami Hiramatsu 	int	found;		/* Number of found probe points */
444ea42b18SMasami Hiramatsu 	char	*probes[MAX_PROBES];	/* Output buffers (will be allocated)*/
454ea42b18SMasami Hiramatsu };
464ea42b18SMasami Hiramatsu 
4723e8ec0dSMasami Hiramatsu #ifndef NO_LIBDWARF
484ea42b18SMasami Hiramatsu extern int find_probepoint(int fd, struct probe_point *pp);
494ea42b18SMasami Hiramatsu 
504ea42b18SMasami Hiramatsu #include <libdwarf/dwarf.h>
514ea42b18SMasami Hiramatsu #include <libdwarf/libdwarf.h>
524ea42b18SMasami Hiramatsu 
534ea42b18SMasami Hiramatsu struct probe_finder {
544ea42b18SMasami Hiramatsu 	struct probe_point	*pp;	/* Target probe point */
554ea42b18SMasami Hiramatsu 
564ea42b18SMasami Hiramatsu 	/* For function searching */
574ea42b18SMasami Hiramatsu 	Dwarf_Addr	addr;		/* Address */
584ea42b18SMasami Hiramatsu 	Dwarf_Unsigned	fno;		/* File number */
594ea42b18SMasami Hiramatsu 	Dwarf_Off	inl_offs;	/* Inline offset */
604ea42b18SMasami Hiramatsu 
614ea42b18SMasami Hiramatsu 	/* For variable searching */
624ea42b18SMasami Hiramatsu 	Dwarf_Addr	cu_base;	/* Current CU base address */
634ea42b18SMasami Hiramatsu 	Dwarf_Locdesc	fbloc;		/* Location of Current Frame Base */
644ea42b18SMasami Hiramatsu 	const char	*var;		/* Current variable name */
654ea42b18SMasami Hiramatsu 	char		*buf;		/* Current output buffer */
664ea42b18SMasami Hiramatsu 	int		len;		/* Length of output buffer */
674ea42b18SMasami Hiramatsu };
6823e8ec0dSMasami Hiramatsu #endif /* NO_LIBDWARF */
694ea42b18SMasami Hiramatsu 
704ea42b18SMasami Hiramatsu #endif /*_PROBE_FINDER_H */
71