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 }