| #ifndef _PROBE_FINDER_H |
| #define _PROBE_FINDER_H |
| |
| #include <stdbool.h> |
| #include "util.h" |
| |
| #define MAX_PATH_LEN 256 |
| #define MAX_PROBE_BUFFER 1024 |
| #define MAX_PROBES 128 |
| |
| static inline int is_c_varname(const char *name) |
| { |
| /* TODO */ |
| return isalpha(name[0]) || name[0] == '_'; |
| } |
| |
| struct probe_point { |
| char *event; /* Event name */ |
| char *group; /* Event group */ |
| |
| /* Inputs */ |
| char *file; /* File name */ |
| int line; /* Line number */ |
| char *lazy_line; /* Lazy line pattern */ |
| |
| char *function; /* Function name */ |
| int offset; /* Offset bytes */ |
| |
| int nr_args; /* Number of arguments */ |
| char **args; /* Arguments */ |
| |
| int retprobe; /* Return probe */ |
| |
| /* Output */ |
| int found; /* Number of found probe points */ |
| char *probes[MAX_PROBES]; /* Output buffers (will be allocated)*/ |
| }; |
| |
| /* Line number container */ |
| struct line_node { |
| struct list_head list; |
| unsigned int line; |
| }; |
| |
| /* Line range */ |
| struct line_range { |
| char *file; /* File name */ |
| char *function; /* Function name */ |
| unsigned int start; /* Start line number */ |
| unsigned int end; /* End line number */ |
| int offset; /* Start line offset */ |
| char *path; /* Real path name */ |
| struct list_head line_list; /* Visible lines */ |
| }; |
| |
| #ifndef NO_DWARF_SUPPORT |
| extern int find_probe_point(int fd, struct probe_point *pp); |
| extern int find_line_range(int fd, struct line_range *lr); |
| |
| #include <dwarf.h> |
| #include <libdw.h> |
| |
| struct probe_finder { |
| struct probe_point *pp; /* Target probe point */ |
| |
| /* For function searching */ |
| Dwarf_Addr addr; /* Address */ |
| const char *fname; /* File name */ |
| int lno; /* Line number */ |
| Dwarf_Die cu_die; /* Current CU */ |
| |
| /* For variable searching */ |
| Dwarf_Op *fb_ops; /* Frame base attribute */ |
| Dwarf_Addr cu_base; /* Current CU base address */ |
| const char *var; /* Current variable name */ |
| char *buf; /* Current output buffer */ |
| int len; /* Length of output buffer */ |
| struct list_head lcache; /* Line cache for lazy match */ |
| }; |
| |
| struct line_finder { |
| struct line_range *lr; /* Target line range */ |
| |
| const char *fname; /* File name */ |
| int lno_s; /* Start line number */ |
| int lno_e; /* End line number */ |
| Dwarf_Die cu_die; /* Current CU */ |
| int found; |
| }; |
| |
| #endif /* NO_DWARF_SUPPORT */ |
| |
| #endif /*_PROBE_FINDER_H */ |