xref: /illumos-gate/usr/src/tools/smatch/src/test-dissect.c (revision c85f09cc92abd00c84e58ec9f0f5d942906cb713)
11f5207b7SJohn Levon #include "dissect.h"
21f5207b7SJohn Levon 
31f5207b7SJohn Levon static unsigned dotc_stream;
41f5207b7SJohn Levon 
storage(struct symbol * sym)51f5207b7SJohn Levon static inline char storage(struct symbol *sym)
61f5207b7SJohn Levon {
71f5207b7SJohn Levon 	int t = sym->type;
81f5207b7SJohn Levon 	unsigned m = sym->ctype.modifiers;
91f5207b7SJohn Levon 
101f5207b7SJohn Levon 	if (m & MOD_INLINE || t == SYM_STRUCT || t == SYM_UNION /*|| t == SYM_ENUM*/)
111f5207b7SJohn Levon 		return sym->pos.stream == dotc_stream ? 's' : 'g';
121f5207b7SJohn Levon 
131f5207b7SJohn Levon 	return (m & MOD_STATIC) ? 's' : (m & MOD_NONLOCAL) ? 'g' : 'l';
141f5207b7SJohn Levon }
151f5207b7SJohn Levon 
show_mode(unsigned mode)161f5207b7SJohn Levon static inline const char *show_mode(unsigned mode)
171f5207b7SJohn Levon {
181f5207b7SJohn Levon 	static char str[3];
191f5207b7SJohn Levon 
201f5207b7SJohn Levon 	if (mode == -1)
211f5207b7SJohn Levon 		return "def";
221f5207b7SJohn Levon 
231f5207b7SJohn Levon #define	U(u_r)	"-rwm"[(mode / u_r) & 3]
241f5207b7SJohn Levon 	str[0] = U(U_R_AOF);
251f5207b7SJohn Levon 	str[1] = U(U_R_VAL);
261f5207b7SJohn Levon 	str[2] = U(U_R_PTR);
271f5207b7SJohn Levon #undef	U
281f5207b7SJohn Levon 
291f5207b7SJohn Levon 	return str;
301f5207b7SJohn Levon }
311f5207b7SJohn Levon 
print_usage(struct position * pos,struct symbol * sym,unsigned mode)321f5207b7SJohn Levon static void print_usage(struct position *pos, struct symbol *sym, unsigned mode)
331f5207b7SJohn Levon {
341f5207b7SJohn Levon 	static unsigned curr_stream = -1;
351f5207b7SJohn Levon 
361f5207b7SJohn Levon 	if (curr_stream != pos->stream) {
371f5207b7SJohn Levon 		curr_stream = pos->stream;
381f5207b7SJohn Levon 		printf("\nFILE: %s\n\n", stream_name(curr_stream));
391f5207b7SJohn Levon 	}
401f5207b7SJohn Levon 
411f5207b7SJohn Levon 	printf("%4d:%-3d %c %-5.3s",
421f5207b7SJohn Levon 		pos->line, pos->pos, storage(sym), show_mode(mode));
431f5207b7SJohn Levon }
441f5207b7SJohn Levon 
r_symbol(unsigned mode,struct position * pos,struct symbol * sym)451f5207b7SJohn Levon static void r_symbol(unsigned mode, struct position *pos, struct symbol *sym)
461f5207b7SJohn Levon {
471f5207b7SJohn Levon 	print_usage(pos, sym, mode);
481f5207b7SJohn Levon 
491f5207b7SJohn Levon 	if (!sym->ident)
501f5207b7SJohn Levon 		sym->ident = built_in_ident("__asm__");
511f5207b7SJohn Levon 
521f5207b7SJohn Levon 	printf("%-32.*s %s\n",
531f5207b7SJohn Levon 		sym->ident->len, sym->ident->name,
541f5207b7SJohn Levon 		show_typename(sym->ctype.base_type));
551f5207b7SJohn Levon }
561f5207b7SJohn Levon 
r_member(unsigned mode,struct position * pos,struct symbol * sym,struct symbol * mem)571f5207b7SJohn Levon static void r_member(unsigned mode, struct position *pos, struct symbol *sym, struct symbol *mem)
581f5207b7SJohn Levon {
591f5207b7SJohn Levon 	struct ident *ni, *si, *mi;
601f5207b7SJohn Levon 
611f5207b7SJohn Levon 	print_usage(pos, sym, mode);
621f5207b7SJohn Levon 
631f5207b7SJohn Levon 	ni = built_in_ident("?");
641f5207b7SJohn Levon 	si = sym->ident ?: ni;
651f5207b7SJohn Levon 	/* mem == NULL means entire struct accessed */
661f5207b7SJohn Levon 	mi = mem ? (mem->ident ?: ni) : built_in_ident("*");
671f5207b7SJohn Levon 
681f5207b7SJohn Levon 	printf("%.*s.%-*.*s %s\n",
691f5207b7SJohn Levon 		si->len, si->name,
701f5207b7SJohn Levon 		32-1 - si->len, mi->len, mi->name,
711f5207b7SJohn Levon 		show_typename(mem ? mem->ctype.base_type : sym));
721f5207b7SJohn Levon }
731f5207b7SJohn Levon 
r_symdef(struct symbol * sym)741f5207b7SJohn Levon static void r_symdef(struct symbol *sym)
751f5207b7SJohn Levon {
761f5207b7SJohn Levon 	r_symbol(-1, &sym->pos, sym);
771f5207b7SJohn Levon }
781f5207b7SJohn Levon 
main(int argc,char ** argv)791f5207b7SJohn Levon int main(int argc, char **argv)
801f5207b7SJohn Levon {
811f5207b7SJohn Levon 	static struct reporter reporter = {
821f5207b7SJohn Levon 		.r_symdef = r_symdef,
831f5207b7SJohn Levon 		.r_symbol = r_symbol,
841f5207b7SJohn Levon 		.r_member = r_member,
851f5207b7SJohn Levon 	};
861f5207b7SJohn Levon 	struct string_list *filelist = NULL;
871f5207b7SJohn Levon 	char *file;
881f5207b7SJohn Levon 
891f5207b7SJohn Levon 	sparse_initialize(argc, argv, &filelist);
901f5207b7SJohn Levon 
91*c85f09ccSJohn Levon 	FOR_EACH_PTR(filelist, file) {
921f5207b7SJohn Levon 		dotc_stream = input_stream_nr;
931f5207b7SJohn Levon 		dissect(__sparse(file), &reporter);
94*c85f09ccSJohn Levon 	} END_FOR_EACH_PTR(file);
951f5207b7SJohn Levon 
961f5207b7SJohn Levon 	return 0;
971f5207b7SJohn Levon }
98