| #include <stdio.h> |
| #include <assert.h> |
| |
| #include "symbol.h" |
| #include "expression.h" |
| #include "linearize.h" |
| #include "flow.h" |
| |
| |
| static void output_bb(struct basic_block *bb, unsigned long generation) |
| { |
| struct instruction *insn; |
| |
| bb->generation = generation; |
| printf(".L%p\n", bb); |
| |
| FOR_EACH_PTR(bb->insns, insn) { |
| if (!insn->bb) |
| continue; |
| printf("\t%s\n", show_instruction(insn)); |
| } |
| END_FOR_EACH_PTR(insn); |
| |
| printf("\n"); |
| } |
| |
| static void output_fn(struct entrypoint *ep) |
| { |
| struct basic_block *bb; |
| unsigned long generation = ++bb_generation; |
| struct symbol *sym = ep->name; |
| const char *name = show_ident(sym->ident); |
| |
| if (sym->ctype.modifiers & MOD_STATIC) |
| printf("\n\n%s:\n", name); |
| else |
| printf("\n\n.globl %s\n%s:\n", name, name); |
| |
| unssa(ep); |
| |
| FOR_EACH_PTR(ep->bbs, bb) { |
| if (bb->generation == generation) |
| continue; |
| output_bb(bb, generation); |
| } |
| END_FOR_EACH_PTR(bb); |
| } |
| |
| static int output_data(struct symbol *sym) |
| { |
| printf("symbol %s:\n", show_ident(sym->ident)); |
| printf("\ttype = %d\n", sym->ctype.base_type->type); |
| printf("\tmodif= %lx\n", sym->ctype.modifiers); |
| |
| return 0; |
| } |
| |
| static int compile(struct symbol_list *list) |
| { |
| struct symbol *sym; |
| FOR_EACH_PTR(list, sym) { |
| struct entrypoint *ep; |
| expand_symbol(sym); |
| ep = linearize_symbol(sym); |
| if (ep) |
| output_fn(ep); |
| else |
| output_data(sym); |
| } |
| END_FOR_EACH_PTR(sym); |
| |
| return 0; |
| } |
| |
| int main(int argc, char **argv) |
| { |
| struct string_list * filelist = NULL; |
| char *file; |
| |
| compile(sparse_initialize(argc, argv, &filelist)); |
| FOR_EACH_PTR_NOTAG(filelist, file) { |
| compile(sparse(file)); |
| } END_FOR_EACH_PTR_NOTAG(file); |
| |
| return 0; |
| } |