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