123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #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("%s\n", show_label(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 (!(fdump_ir & PASS_FINAL))
- continue;
- 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(filelist, file) {
- compile(sparse(file));
- } END_FOR_EACH_PTR(file);
- report_stats();
- return 0;
- }
|