|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #ifndef _PROBE_FINDER_H | 
|  | #define _PROBE_FINDER_H | 
|  |  | 
|  | #include <stdbool.h> | 
|  | #include "intlist.h" | 
|  | #include "probe-event.h" | 
|  | #include "sane_ctype.h" | 
|  |  | 
|  | #define MAX_PROBE_BUFFER	1024 | 
|  | #define MAX_PROBES		 128 | 
|  | #define MAX_PROBE_ARGS		 128 | 
|  |  | 
|  | #define PROBE_ARG_VARS		"$vars" | 
|  | #define PROBE_ARG_PARAMS	"$params" | 
|  |  | 
|  | static inline int is_c_varname(const char *name) | 
|  | { | 
|  | /* TODO */ | 
|  | return isalpha(name[0]) || name[0] == '_'; | 
|  | } | 
|  |  | 
|  | #ifdef HAVE_DWARF_SUPPORT | 
|  |  | 
|  | #include "dwarf-aux.h" | 
|  |  | 
|  | /* TODO: export debuginfo data structure even if no dwarf support */ | 
|  |  | 
|  | /* debug information structure */ | 
|  | struct debuginfo { | 
|  | Dwarf		*dbg; | 
|  | Dwfl_Module	*mod; | 
|  | Dwfl		*dwfl; | 
|  | Dwarf_Addr	bias; | 
|  | }; | 
|  |  | 
|  | /* This also tries to open distro debuginfo */ | 
|  | struct debuginfo *debuginfo__new(const char *path); | 
|  | void debuginfo__delete(struct debuginfo *dbg); | 
|  |  | 
|  | /* Find probe_trace_events specified by perf_probe_event from debuginfo */ | 
|  | int debuginfo__find_trace_events(struct debuginfo *dbg, | 
|  | struct perf_probe_event *pev, | 
|  | struct probe_trace_event **tevs); | 
|  |  | 
|  | /* Find a perf_probe_point from debuginfo */ | 
|  | int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, | 
|  | struct perf_probe_point *ppt); | 
|  |  | 
|  | int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs, | 
|  | bool adjust_offset); | 
|  |  | 
|  | /* Find a line range */ | 
|  | int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr); | 
|  |  | 
|  | /* Find available variables */ | 
|  | int debuginfo__find_available_vars_at(struct debuginfo *dbg, | 
|  | struct perf_probe_event *pev, | 
|  | struct variable_list **vls); | 
|  |  | 
|  | /* Find a src file from a DWARF tag path */ | 
|  | int get_real_path(const char *raw_path, const char *comp_dir, | 
|  | char **new_path); | 
|  |  | 
|  | struct probe_finder { | 
|  | struct perf_probe_event	*pev;		/* Target probe event */ | 
|  |  | 
|  | /* Callback when a probe point is found */ | 
|  | int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf); | 
|  |  | 
|  | /* For function searching */ | 
|  | int			lno;		/* Line number */ | 
|  | Dwarf_Addr		addr;		/* Address */ | 
|  | const char		*fname;		/* Real file name */ | 
|  | Dwarf_Die		cu_die;		/* Current CU */ | 
|  | Dwarf_Die		sp_die; | 
|  | struct intlist		*lcache;	/* Line cache for lazy match */ | 
|  |  | 
|  | /* For variable searching */ | 
|  | #if _ELFUTILS_PREREQ(0, 142) | 
|  | /* Call Frame Information from .eh_frame */ | 
|  | Dwarf_CFI		*cfi_eh; | 
|  | /* Call Frame Information from .debug_frame */ | 
|  | Dwarf_CFI		*cfi_dbg; | 
|  | #endif | 
|  | Dwarf_Op		*fb_ops;	/* Frame base attribute */ | 
|  | unsigned int		machine;	/* Target machine arch */ | 
|  | struct perf_probe_arg	*pvar;		/* Current target variable */ | 
|  | struct probe_trace_arg	*tvar;		/* Current result variable */ | 
|  | }; | 
|  |  | 
|  | struct trace_event_finder { | 
|  | struct probe_finder	pf; | 
|  | Dwfl_Module		*mod;		/* For solving symbols */ | 
|  | struct probe_trace_event *tevs;		/* Found trace events */ | 
|  | int			ntevs;		/* Number of trace events */ | 
|  | int			max_tevs;	/* Max number of trace events */ | 
|  | }; | 
|  |  | 
|  | struct available_var_finder { | 
|  | struct probe_finder	pf; | 
|  | Dwfl_Module		*mod;		/* For solving symbols */ | 
|  | struct variable_list	*vls;		/* Found variable lists */ | 
|  | int			nvls;		/* Number of variable lists */ | 
|  | int			max_vls;	/* Max no. of variable lists */ | 
|  | bool			child;		/* Search child scopes */ | 
|  | }; | 
|  |  | 
|  | struct line_finder { | 
|  | struct line_range	*lr;		/* Target line range */ | 
|  |  | 
|  | const char		*fname;		/* File name */ | 
|  | int			lno_s;		/* Start line number */ | 
|  | int			lno_e;		/* End line number */ | 
|  | Dwarf_Die		cu_die;		/* Current CU */ | 
|  | Dwarf_Die		sp_die; | 
|  | int			found; | 
|  | }; | 
|  |  | 
|  | #endif /* HAVE_DWARF_SUPPORT */ | 
|  |  | 
|  | #endif /*_PROBE_FINDER_H */ |