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