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