110 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _PROBE_FINDER_H3#define _PROBE_FINDER_H4 5#include <stdbool.h>6#include "intlist.h"7#include "build-id.h"8#include "probe-event.h"9#include <linux/ctype.h>10 11#define MAX_PROBE_BUFFER 102412#define MAX_PROBES 12813#define MAX_PROBE_ARGS 12814 15#define PROBE_ARG_VARS "$vars"16#define PROBE_ARG_PARAMS "$params"17 18static inline int is_c_varname(const char *name)19{20 /* TODO */21 return isalpha(name[0]) || name[0] == '_';22}23 24#ifdef HAVE_DWARF_SUPPORT25 26#include "dwarf-aux.h"27#include "debuginfo.h"28 29/* Find probe_trace_events specified by perf_probe_event from debuginfo */30int debuginfo__find_trace_events(struct debuginfo *dbg,31 struct perf_probe_event *pev,32 struct probe_trace_event **tevs);33 34/* Find a perf_probe_point from debuginfo */35int debuginfo__find_probe_point(struct debuginfo *dbg, u64 addr,36 struct perf_probe_point *ppt);37 38/* Find a line range */39int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr);40 41/* Find available variables */42int debuginfo__find_available_vars_at(struct debuginfo *dbg,43 struct perf_probe_event *pev,44 struct variable_list **vls);45 46/* Find a src file from a DWARF tag path */47int find_source_path(const char *raw_path, const char *sbuild_id,48 const char *comp_dir, char **new_path);49 50struct probe_finder {51 struct perf_probe_event *pev; /* Target probe event */52 struct debuginfo *dbg;53 54 /* Callback when a probe point is found */55 int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf);56 57 /* For function searching */58 int lno; /* Line number */59 Dwarf_Addr addr; /* Address */60 const char *fname; /* Real file name */61 Dwarf_Die cu_die; /* Current CU */62 Dwarf_Die sp_die;63 struct intlist *lcache; /* Line cache for lazy match */64 65 /* For variable searching */66#if _ELFUTILS_PREREQ(0, 142)67 /* Call Frame Information from .eh_frame */68 Dwarf_CFI *cfi_eh;69 /* Call Frame Information from .debug_frame */70 Dwarf_CFI *cfi_dbg;71#endif72 Dwarf_Op *fb_ops; /* Frame base attribute */73 unsigned int machine; /* Target machine arch */74 struct perf_probe_arg *pvar; /* Current target variable */75 struct probe_trace_arg *tvar; /* Current result variable */76 bool skip_empty_arg; /* Skip non-exist args */77};78 79struct trace_event_finder {80 struct probe_finder pf;81 Dwfl_Module *mod; /* For solving symbols */82 struct probe_trace_event *tevs; /* Found trace events */83 int ntevs; /* Number of trace events */84 int max_tevs; /* Max number of trace events */85};86 87struct available_var_finder {88 struct probe_finder pf;89 Dwfl_Module *mod; /* For solving symbols */90 struct variable_list *vls; /* Found variable lists */91 int nvls; /* Number of variable lists */92 int max_vls; /* Max no. of variable lists */93 bool child; /* Search child scopes */94};95 96struct line_finder {97 struct line_range *lr; /* Target line range */98 99 const char *fname; /* File name */100 int lno_s; /* Start line number */101 int lno_e; /* End line number */102 Dwarf_Die cu_die; /* Current CU */103 Dwarf_Die sp_die;104 int found;105};106 107#endif /* HAVE_DWARF_SUPPORT */108 109#endif /*_PROBE_FINDER_H */110