1 #include <stdio.h>
2 #include <assert.h>
3 
4 #include "symbol.h"
5 #include "expression.h"
6 #include "linearize.h"
7 #include "flow.h"
8 
9 
output_bb(struct basic_block * bb,unsigned long generation)10 static void output_bb(struct basic_block *bb, unsigned long generation)
11 {
12 	struct instruction *insn;
13 
14 	bb->generation = generation;
15 	printf("%s\n", show_label(bb));
16 
17 	FOR_EACH_PTR(bb->insns, insn) {
18 		if (!insn->bb)
19 			continue;
20 		printf("\t%s\n", show_instruction(insn));
21 	}
22 	END_FOR_EACH_PTR(insn);
23 
24 	printf("\n");
25 }
26 
output_fn(struct entrypoint * ep)27 static void output_fn(struct entrypoint *ep)
28 {
29 	struct basic_block *bb;
30 	unsigned long generation = ++bb_generation;
31 	struct symbol *sym = ep->name;
32 	const char *name = show_ident(sym->ident);
33 
34 	if (sym->ctype.modifiers & MOD_STATIC)
35 		printf("\n\n%s:\n", name);
36 	else
37 		printf("\n\n.globl %s\n%s:\n", name, name);
38 
39 	unssa(ep);
40 
41 	FOR_EACH_PTR(ep->bbs, bb) {
42 		if (bb->generation == generation)
43 			continue;
44 		output_bb(bb, generation);
45 	}
46 	END_FOR_EACH_PTR(bb);
47 }
48 
output_data(struct symbol * sym)49 static int output_data(struct symbol *sym)
50 {
51 	printf("symbol %s:\n", show_ident(sym->ident));
52 	printf("\ttype = %d\n", sym->ctype.base_type->type);
53 	printf("\tmodif= %lx\n", sym->ctype.modifiers);
54 
55 	return 0;
56 }
57 
compile(struct symbol_list * list)58 static int compile(struct symbol_list *list)
59 {
60 	struct symbol *sym;
61 	FOR_EACH_PTR(list, sym) {
62 		struct entrypoint *ep;
63 		expand_symbol(sym);
64 		ep = linearize_symbol(sym);
65 		if (!(fdump_ir & PASS_FINAL))
66 			continue;
67 		if (ep)
68 			output_fn(ep);
69 		else
70 			output_data(sym);
71 	}
72 	END_FOR_EACH_PTR(sym);
73 
74 	return 0;
75 }
76 
main(int argc,char ** argv)77 int main(int argc, char **argv)
78 {
79 	struct string_list * filelist = NULL;
80 	char *file;
81 
82 	compile(sparse_initialize(argc, argv, &filelist));
83 	FOR_EACH_PTR(filelist, file) {
84 		compile(sparse(file));
85 	} END_FOR_EACH_PTR(file);
86 
87 	report_stats();
88 	return 0;
89 }
90