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