11f5207b7SJohn Levon #include <stdio.h>
21f5207b7SJohn Levon #include <assert.h>
31f5207b7SJohn Levon 
41f5207b7SJohn Levon #include "symbol.h"
51f5207b7SJohn Levon #include "expression.h"
61f5207b7SJohn Levon #include "linearize.h"
71f5207b7SJohn Levon #include "flow.h"
81f5207b7SJohn Levon 
91f5207b7SJohn Levon 
output_bb(struct basic_block * bb,unsigned long generation)101f5207b7SJohn Levon static void output_bb(struct basic_block *bb, unsigned long generation)
111f5207b7SJohn Levon {
121f5207b7SJohn Levon 	struct instruction *insn;
131f5207b7SJohn Levon 
141f5207b7SJohn Levon 	bb->generation = generation;
15*c85f09ccSJohn Levon 	printf("%s\n", show_label(bb));
161f5207b7SJohn Levon 
171f5207b7SJohn Levon 	FOR_EACH_PTR(bb->insns, insn) {
181f5207b7SJohn Levon 		if (!insn->bb)
191f5207b7SJohn Levon 			continue;
201f5207b7SJohn Levon 		printf("\t%s\n", show_instruction(insn));
211f5207b7SJohn Levon 	}
221f5207b7SJohn Levon 	END_FOR_EACH_PTR(insn);
231f5207b7SJohn Levon 
241f5207b7SJohn Levon 	printf("\n");
251f5207b7SJohn Levon }
261f5207b7SJohn Levon 
output_fn(struct entrypoint * ep)271f5207b7SJohn Levon static void output_fn(struct entrypoint *ep)
281f5207b7SJohn Levon {
291f5207b7SJohn Levon 	struct basic_block *bb;
301f5207b7SJohn Levon 	unsigned long generation = ++bb_generation;
311f5207b7SJohn Levon 	struct symbol *sym = ep->name;
321f5207b7SJohn Levon 	const char *name = show_ident(sym->ident);
331f5207b7SJohn Levon 
341f5207b7SJohn Levon 	if (sym->ctype.modifiers & MOD_STATIC)
351f5207b7SJohn Levon 		printf("\n\n%s:\n", name);
361f5207b7SJohn Levon 	else
371f5207b7SJohn Levon 		printf("\n\n.globl %s\n%s:\n", name, name);
381f5207b7SJohn Levon 
391f5207b7SJohn Levon 	unssa(ep);
401f5207b7SJohn Levon 
411f5207b7SJohn Levon 	FOR_EACH_PTR(ep->bbs, bb) {
421f5207b7SJohn Levon 		if (bb->generation == generation)
431f5207b7SJohn Levon 			continue;
441f5207b7SJohn Levon 		output_bb(bb, generation);
451f5207b7SJohn Levon 	}
461f5207b7SJohn Levon 	END_FOR_EACH_PTR(bb);
471f5207b7SJohn Levon }
481f5207b7SJohn Levon 
output_data(struct symbol * sym)491f5207b7SJohn Levon static int output_data(struct symbol *sym)
501f5207b7SJohn Levon {
511f5207b7SJohn Levon 	printf("symbol %s:\n", show_ident(sym->ident));
521f5207b7SJohn Levon 	printf("\ttype = %d\n", sym->ctype.base_type->type);
531f5207b7SJohn Levon 	printf("\tmodif= %lx\n", sym->ctype.modifiers);
541f5207b7SJohn Levon 
551f5207b7SJohn Levon 	return 0;
561f5207b7SJohn Levon }
571f5207b7SJohn Levon 
compile(struct symbol_list * list)581f5207b7SJohn Levon static int compile(struct symbol_list *list)
591f5207b7SJohn Levon {
601f5207b7SJohn Levon 	struct symbol *sym;
611f5207b7SJohn Levon 	FOR_EACH_PTR(list, sym) {
621f5207b7SJohn Levon 		struct entrypoint *ep;
631f5207b7SJohn Levon 		expand_symbol(sym);
641f5207b7SJohn Levon 		ep = linearize_symbol(sym);
65*c85f09ccSJohn Levon 		if (!(fdump_ir & PASS_FINAL))
66*c85f09ccSJohn Levon 			continue;
671f5207b7SJohn Levon 		if (ep)
681f5207b7SJohn Levon 			output_fn(ep);
691f5207b7SJohn Levon 		else
701f5207b7SJohn Levon 			output_data(sym);
711f5207b7SJohn Levon 	}
721f5207b7SJohn Levon 	END_FOR_EACH_PTR(sym);
731f5207b7SJohn Levon 
741f5207b7SJohn Levon 	return 0;
751f5207b7SJohn Levon }
761f5207b7SJohn Levon 
main(int argc,char ** argv)771f5207b7SJohn Levon int main(int argc, char **argv)
781f5207b7SJohn Levon {
791f5207b7SJohn Levon 	struct string_list * filelist = NULL;
801f5207b7SJohn Levon 	char *file;
811f5207b7SJohn Levon 
821f5207b7SJohn Levon 	compile(sparse_initialize(argc, argv, &filelist));
83*c85f09ccSJohn Levon 	FOR_EACH_PTR(filelist, file) {
841f5207b7SJohn Levon 		compile(sparse(file));
85*c85f09ccSJohn Levon 	} END_FOR_EACH_PTR(file);
861f5207b7SJohn Levon 
871f5207b7SJohn Levon 	report_stats();
881f5207b7SJohn Levon 	return 0;
891f5207b7SJohn Levon }
90