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 10 static void output_bb(struct basic_block *bb, unsigned long generation) 11 { 12 struct instruction *insn; 13 14 bb->generation = generation; 15 printf(".L%u\n", bb->nr); 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 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 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 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 (ep) 66 output_fn(ep); 67 else 68 output_data(sym); 69 } 70 END_FOR_EACH_PTR(sym); 71 72 return 0; 73 } 74 75 int main(int argc, char **argv) 76 { 77 struct string_list * filelist = NULL; 78 char *file; 79 80 compile(sparse_initialize(argc, argv, &filelist)); 81 FOR_EACH_PTR_NOTAG(filelist, file) { 82 compile(sparse(file)); 83 } END_FOR_EACH_PTR_NOTAG(file); 84 85 report_stats(); 86 return 0; 87 }