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 "intlist.h"
   6#include "probe-event.h"
   7#include "sane_ctype.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
  49int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs,
  50                               bool adjust_offset);
  51
  52/* Find a line range */
  53int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr);
  54
  55/* Find available variables */
  56int debuginfo__find_available_vars_at(struct debuginfo *dbg,
  57                                      struct perf_probe_event *pev,
  58                                      struct variable_list **vls);
  59
  60/* Find a src file from a DWARF tag path */
  61int get_real_path(const char *raw_path, const char *comp_dir,
  62                         char **new_path);
  63
  64struct probe_finder {
  65        struct perf_probe_event *pev;           /* Target probe event */
  66
  67        /* Callback when a probe point is found */
  68        int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf);
  69
  70        /* For function searching */
  71        int                     lno;            /* Line number */
  72        Dwarf_Addr              addr;           /* Address */
  73        const char              *fname;         /* Real file name */
  74        Dwarf_Die               cu_die;         /* Current CU */
  75        Dwarf_Die               sp_die;
  76        struct intlist          *lcache;        /* Line cache for lazy match */
  77
  78        /* For variable searching */
  79#if _ELFUTILS_PREREQ(0, 142)
  80        /* Call Frame Information from .eh_frame */
  81        Dwarf_CFI               *cfi_eh;
  82        /* Call Frame Information from .debug_frame */
  83        Dwarf_CFI               *cfi_dbg;
  84#endif
  85        Dwarf_Op                *fb_ops;        /* Frame base attribute */
  86        unsigned int            machine;        /* Target machine arch */
  87        struct perf_probe_arg   *pvar;          /* Current target variable */
  88        struct probe_trace_arg  *tvar;          /* Current result variable */
  89};
  90
  91struct trace_event_finder {
  92        struct probe_finder     pf;
  93        Dwfl_Module             *mod;           /* For solving symbols */
  94        struct probe_trace_event *tevs;         /* Found trace events */
  95        int                     ntevs;          /* Number of trace events */
  96        int                     max_tevs;       /* Max number of trace events */
  97};
  98
  99struct available_var_finder {
 100        struct probe_finder     pf;
 101        Dwfl_Module             *mod;           /* For solving symbols */
 102        struct variable_list    *vls;           /* Found variable lists */
 103        int                     nvls;           /* Number of variable lists */
 104        int                     max_vls;        /* Max no. of variable lists */
 105        bool                    child;          /* Search child scopes */
 106};
 107
 108struct line_finder {
 109        struct line_range       *lr;            /* Target line range */
 110
 111        const char              *fname;         /* File name */
 112        int                     lno_s;          /* Start line number */
 113        int                     lno_e;          /* End line number */
 114        Dwarf_Die               cu_die;         /* Current CU */
 115        Dwarf_Die               sp_die;
 116        int                     found;
 117};
 118
 119#endif /* HAVE_DWARF_SUPPORT */
 120
 121#endif /*_PROBE_FINDER_H */
 122