1 #include "dissect.h" 2 3 static unsigned dotc_stream; 4 5 static inline char storage(struct symbol *sym) 6 { 7 int t = sym->type; 8 unsigned m = sym->ctype.modifiers; 9 10 if (m & MOD_INLINE || t == SYM_STRUCT || t == SYM_UNION /*|| t == SYM_ENUM*/) 11 return sym->pos.stream == dotc_stream ? 's' : 'g'; 12 13 return (m & MOD_STATIC) ? 's' : (m & MOD_NONLOCAL) ? 'g' : 'l'; 14 } 15 16 static inline const char *show_mode(unsigned mode) 17 { 18 static char str[3]; 19 20 if (mode == -1) 21 return "def"; 22 23 #define U(u_r) "-rwm"[(mode / u_r) & 3] 24 str[0] = U(U_R_AOF); 25 str[1] = U(U_R_VAL); 26 str[2] = U(U_R_PTR); 27 #undef U 28 29 return str; 30 } 31 32 static void print_usage(struct position *pos, struct symbol *sym, unsigned mode) 33 { 34 static unsigned curr_stream = -1; 35 36 if (curr_stream != pos->stream) { 37 curr_stream = pos->stream; 38 printf("\nFILE: %s\n\n", stream_name(curr_stream)); 39 } 40 41 printf("%4d:%-3d %c %-5.3s", 42 pos->line, pos->pos, storage(sym), show_mode(mode)); 43 } 44 45 static void r_symbol(unsigned mode, struct position *pos, struct symbol *sym) 46 { 47 print_usage(pos, sym, mode); 48 49 if (!sym->ident) 50 sym->ident = built_in_ident("__asm__"); 51 52 printf("%-32.*s %s\n", 53 sym->ident->len, sym->ident->name, 54 show_typename(sym->ctype.base_type)); 55 } 56 57 static void r_member(unsigned mode, struct position *pos, struct symbol *sym, struct symbol *mem) 58 { 59 struct ident *ni, *si, *mi; 60 61 print_usage(pos, sym, mode); 62 63 ni = built_in_ident("?"); 64 si = sym->ident ?: ni; 65 /* mem == NULL means entire struct accessed */ 66 mi = mem ? (mem->ident ?: ni) : built_in_ident("*"); 67 68 printf("%.*s.%-*.*s %s\n", 69 si->len, si->name, 70 32-1 - si->len, mi->len, mi->name, 71 show_typename(mem ? mem->ctype.base_type : sym)); 72 } 73 74 static void r_symdef(struct symbol *sym) 75 { 76 r_symbol(-1, &sym->pos, sym); 77 } 78 79 int main(int argc, char **argv) 80 { 81 static struct reporter reporter = { 82 .r_symdef = r_symdef, 83 .r_symbol = r_symbol, 84 .r_member = r_member, 85 }; 86 struct string_list *filelist = NULL; 87 char *file; 88 89 sparse_initialize(argc, argv, &filelist); 90 91 FOR_EACH_PTR_NOTAG(filelist, file) { 92 dotc_stream = input_stream_nr; 93 dissect(__sparse(file), &reporter); 94 } END_FOR_EACH_PTR_NOTAG(file); 95 96 return 0; 97 }