14ea42b18SMasami Hiramatsu #ifndef _PROBE_FINDER_H 24ea42b18SMasami Hiramatsu #define _PROBE_FINDER_H 34ea42b18SMasami Hiramatsu 44ea42b18SMasami Hiramatsu #define _stringify(n) #n 54ea42b18SMasami Hiramatsu #define stringify(n) _stringify(n) 64ea42b18SMasami Hiramatsu 74ea42b18SMasami Hiramatsu #ifdef DEBUG 84ea42b18SMasami Hiramatsu #define debug(fmt ...) \ 94ea42b18SMasami Hiramatsu fprintf(stderr, "DBG(" __FILE__ ":" stringify(__LINE__) "): " fmt) 104ea42b18SMasami Hiramatsu #else 114ea42b18SMasami Hiramatsu #define debug(fmt ...) do {} while (0) 124ea42b18SMasami Hiramatsu #endif 134ea42b18SMasami Hiramatsu 144ea42b18SMasami Hiramatsu #define ERR_IF(cnd) \ 154ea42b18SMasami Hiramatsu do { if (cnd) { \ 164ea42b18SMasami Hiramatsu fprintf(stderr, "Error (" __FILE__ ":" stringify(__LINE__) \ 174ea42b18SMasami Hiramatsu "): " stringify(cnd) "\n"); \ 184ea42b18SMasami Hiramatsu exit(1); \ 194ea42b18SMasami Hiramatsu } } while (0) 204ea42b18SMasami Hiramatsu 214ea42b18SMasami Hiramatsu #define MAX_PATH_LEN 256 224ea42b18SMasami Hiramatsu #define MAX_PROBE_BUFFER 1024 234ea42b18SMasami Hiramatsu #define MAX_PROBES 128 244ea42b18SMasami Hiramatsu 254ea42b18SMasami Hiramatsu static inline int is_c_varname(const char *name) 264ea42b18SMasami Hiramatsu { 274ea42b18SMasami Hiramatsu /* TODO */ 284ea42b18SMasami Hiramatsu return isalpha(name[0]) || name[0] == '_'; 294ea42b18SMasami Hiramatsu } 304ea42b18SMasami Hiramatsu 314ea42b18SMasami Hiramatsu struct probe_point { 324ea42b18SMasami Hiramatsu /* Inputs */ 334ea42b18SMasami Hiramatsu char *file; /* File name */ 344ea42b18SMasami Hiramatsu int line; /* Line number */ 354ea42b18SMasami Hiramatsu 364ea42b18SMasami Hiramatsu char *function; /* Function name */ 374ea42b18SMasami Hiramatsu int offset; /* Offset bytes */ 384ea42b18SMasami Hiramatsu 394ea42b18SMasami Hiramatsu int nr_args; /* Number of arguments */ 404ea42b18SMasami Hiramatsu char **args; /* Arguments */ 414ea42b18SMasami Hiramatsu 424ea42b18SMasami Hiramatsu /* Output */ 434ea42b18SMasami Hiramatsu int found; /* Number of found probe points */ 444ea42b18SMasami Hiramatsu char *probes[MAX_PROBES]; /* Output buffers (will be allocated)*/ 454ea42b18SMasami Hiramatsu }; 464ea42b18SMasami Hiramatsu 4723e8ec0dSMasami Hiramatsu #ifndef NO_LIBDWARF 484ea42b18SMasami Hiramatsu extern int find_probepoint(int fd, struct probe_point *pp); 494ea42b18SMasami Hiramatsu 504ea42b18SMasami Hiramatsu #include <libdwarf/dwarf.h> 514ea42b18SMasami Hiramatsu #include <libdwarf/libdwarf.h> 524ea42b18SMasami Hiramatsu 534ea42b18SMasami Hiramatsu struct probe_finder { 544ea42b18SMasami Hiramatsu struct probe_point *pp; /* Target probe point */ 554ea42b18SMasami Hiramatsu 564ea42b18SMasami Hiramatsu /* For function searching */ 574ea42b18SMasami Hiramatsu Dwarf_Addr addr; /* Address */ 584ea42b18SMasami Hiramatsu Dwarf_Unsigned fno; /* File number */ 594ea42b18SMasami Hiramatsu Dwarf_Off inl_offs; /* Inline offset */ 604ea42b18SMasami Hiramatsu 614ea42b18SMasami Hiramatsu /* For variable searching */ 624ea42b18SMasami Hiramatsu Dwarf_Addr cu_base; /* Current CU base address */ 634ea42b18SMasami Hiramatsu Dwarf_Locdesc fbloc; /* Location of Current Frame Base */ 644ea42b18SMasami Hiramatsu const char *var; /* Current variable name */ 654ea42b18SMasami Hiramatsu char *buf; /* Current output buffer */ 664ea42b18SMasami Hiramatsu int len; /* Length of output buffer */ 674ea42b18SMasami Hiramatsu }; 6823e8ec0dSMasami Hiramatsu #endif /* NO_LIBDWARF */ 694ea42b18SMasami Hiramatsu 704ea42b18SMasami Hiramatsu #endif /*_PROBE_FINDER_H */ 71