blob: ffc33cdd25cc343816fd9e05586832bf48b82205 [file] [log] [blame]
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -04001#ifndef _PROBE_FINDER_H
2#define _PROBE_FINDER_H
3
Masami Hiramatsu804b3602010-02-25 08:35:42 -05004#include <stdbool.h>
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -02005#include "util.h"
Masami Hiramatsu4235b042010-03-16 18:06:12 -04006#include "probe-event.h"
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -02007
Masami Hiramatsu27f3b242009-12-16 17:16:19 -05008#define MAX_PROBE_BUFFER 1024
9#define MAX_PROBES 128
Masami Hiramatsu7969ec72013-10-11 16:10:23 +090010#define MAX_PROBE_ARGS 128
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040011
12static inline int is_c_varname(const char *name)
13{
14 /* TODO */
15 return isalpha(name[0]) || name[0] == '_';
16}
17
Ingo Molnar89fe8082013-09-30 12:07:11 +020018#ifdef HAVE_DWARF_SUPPORT
Masami Hiramatsuff741782011-06-27 16:27:39 +090019
20#include "dwarf-aux.h"
21
22/* TODO: export debuginfo data structure even if no dwarf support */
23
24/* debug information structure */
25struct debuginfo {
26 Dwarf *dbg;
Masami Hiramatsu576b5232013-09-25 22:16:16 +090027 Dwfl_Module *mod;
Masami Hiramatsuff741782011-06-27 16:27:39 +090028 Dwfl *dwfl;
29 Dwarf_Addr bias;
30};
31
32extern struct debuginfo *debuginfo__new(const char *path);
33extern struct debuginfo *debuginfo__new_online_kernel(unsigned long addr);
Arnaldo Carvalho de Melo316c7132013-11-05 15:32:36 -030034extern void debuginfo__delete(struct debuginfo *dbg);
Masami Hiramatsuff741782011-06-27 16:27:39 +090035
Srikar Dronamraju0e608362010-07-29 19:43:51 +053036/* Find probe_trace_events specified by perf_probe_event from debuginfo */
Arnaldo Carvalho de Melo316c7132013-11-05 15:32:36 -030037extern int debuginfo__find_trace_events(struct debuginfo *dbg,
Masami Hiramatsuff741782011-06-27 16:27:39 +090038 struct perf_probe_event *pev,
39 struct probe_trace_event **tevs,
40 int max_tevs);
Masami Hiramatsu4235b042010-03-16 18:06:12 -040041
Masami Hiramatsufb1587d2010-03-16 18:06:19 -040042/* Find a perf_probe_point from debuginfo */
Arnaldo Carvalho de Melo316c7132013-11-05 15:32:36 -030043extern int debuginfo__find_probe_point(struct debuginfo *dbg,
Masami Hiramatsuff741782011-06-27 16:27:39 +090044 unsigned long addr,
45 struct perf_probe_point *ppt);
Masami Hiramatsufb1587d2010-03-16 18:06:19 -040046
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090047/* Find a line range */
Arnaldo Carvalho de Melo316c7132013-11-05 15:32:36 -030048extern int debuginfo__find_line_range(struct debuginfo *dbg,
Masami Hiramatsuff741782011-06-27 16:27:39 +090049 struct line_range *lr);
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040050
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090051/* Find available variables */
Arnaldo Carvalho de Melo316c7132013-11-05 15:32:36 -030052extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
Masami Hiramatsuff741782011-06-27 16:27:39 +090053 struct perf_probe_event *pev,
54 struct variable_list **vls,
55 int max_points, bool externs);
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040056
57struct probe_finder {
Masami Hiramatsu4235b042010-03-16 18:06:12 -040058 struct perf_probe_event *pev; /* Target probe event */
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090059
60 /* Callback when a probe point is found */
Masami Hiramatsu221d0612011-08-11 20:02:59 +090061 int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf);
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040062
63 /* For function searching */
Arnaldo Carvalho de Meloeed05fe2010-04-05 12:53:45 -030064 int lno; /* Line number */
Masami Hiramatsu804b3602010-02-25 08:35:42 -050065 Dwarf_Addr addr; /* Address */
Masami Hiramatsu4235b042010-03-16 18:06:12 -040066 const char *fname; /* Real file name */
Masami Hiramatsu804b3602010-02-25 08:35:42 -050067 Dwarf_Die cu_die; /* Current CU */
Lin Mingcd25f8b2011-03-25 16:27:48 +080068 Dwarf_Die sp_die;
Masami Hiramatsu4235b042010-03-16 18:06:12 -040069 struct list_head lcache; /* Line cache for lazy match */
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040070
71 /* For variable searching */
Masami Hiramatsu7752f1b2010-05-10 13:12:07 -040072#if _ELFUTILS_PREREQ(0, 142)
Masami Hiramatsua34a9852010-04-12 13:17:29 -040073 Dwarf_CFI *cfi; /* Call Frame Information */
Masami Hiramatsu7752f1b2010-05-10 13:12:07 -040074#endif
Masami Hiramatsu804b3602010-02-25 08:35:42 -050075 Dwarf_Op *fb_ops; /* Frame base attribute */
Masami Hiramatsu4235b042010-03-16 18:06:12 -040076 struct perf_probe_arg *pvar; /* Current target variable */
Srikar Dronamraju0e608362010-07-29 19:43:51 +053077 struct probe_trace_arg *tvar; /* Current result variable */
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040078};
Masami Hiramatsu631c9de2010-01-06 09:45:34 -050079
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090080struct trace_event_finder {
81 struct probe_finder pf;
Masami Hiramatsu576b5232013-09-25 22:16:16 +090082 Dwfl_Module *mod; /* For solving symbols */
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090083 struct probe_trace_event *tevs; /* Found trace events */
84 int ntevs; /* Number of trace events */
85 int max_tevs; /* Max number of trace events */
86};
87
88struct available_var_finder {
89 struct probe_finder pf;
Masami Hiramatsu576b5232013-09-25 22:16:16 +090090 Dwfl_Module *mod; /* For solving symbols */
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090091 struct variable_list *vls; /* Found variable lists */
92 int nvls; /* Number of variable lists */
93 int max_vls; /* Max no. of variable lists */
Masami Hiramatsufb8c5a52010-10-21 19:13:35 +090094 bool externs; /* Find external vars too */
95 bool child; /* Search child scopes */
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090096};
97
Masami Hiramatsu631c9de2010-01-06 09:45:34 -050098struct line_finder {
Masami Hiramatsu804b3602010-02-25 08:35:42 -050099 struct line_range *lr; /* Target line range */
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500100
Masami Hiramatsu804b3602010-02-25 08:35:42 -0500101 const char *fname; /* File name */
102 int lno_s; /* Start line number */
103 int lno_e; /* End line number */
Masami Hiramatsu804b3602010-02-25 08:35:42 -0500104 Dwarf_Die cu_die; /* Current CU */
Lin Mingcd25f8b2011-03-25 16:27:48 +0800105 Dwarf_Die sp_die;
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500106 int found;
107};
108
Ingo Molnar89fe8082013-09-30 12:07:11 +0200109#endif /* HAVE_DWARF_SUPPORT */
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400110
111#endif /*_PROBE_FINDER_H */