diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 197 |
1 files changed, 0 insertions, 197 deletions
diff --git a/main.c b/main.c deleted file mode 100644 index fa60d3b..0000000 --- a/main.c +++ /dev/null @@ -1,197 +0,0 @@ -#include "all.h" -#include <ctype.h> -#include <getopt.h> - -Target T; - -char debug['Z'+1] = { - ['P'] = 0, /* parsing */ - ['M'] = 0, /* memory optimization */ - ['N'] = 0, /* ssa construction */ - ['C'] = 0, /* copy elimination */ - ['F'] = 0, /* constant folding */ - ['A'] = 0, /* abi lowering */ - ['I'] = 0, /* instruction selection */ - ['L'] = 0, /* liveness */ - ['S'] = 0, /* spilling */ - ['R'] = 0, /* reg. allocation */ -}; - -extern Target T_amd64_sysv; -extern Target T_amd64_apple; -extern Target T_arm64; -extern Target T_arm64_apple; -extern Target T_rv64; - -static Target *tlist[] = { - &T_amd64_sysv, - &T_amd64_apple, - &T_arm64, - &T_arm64_apple, - &T_rv64, - 0 -}; -static FILE *outf; -static int dbg; - -static void -data(Dat *d) -{ - if (dbg) - return; - emitdat(d, outf); - if (d->type == DEnd) { - fputs("/* end data */\n\n", outf); - freeall(); - } -} - -static void -func(Fn *fn) -{ - uint n; - - if (dbg) - fprintf(stderr, "**** Function %s ****", fn->name); - if (debug['P']) { - fprintf(stderr, "\n> After parsing:\n"); - printfn(fn, stderr); - } - T.abi0(fn); - fillrpo(fn); - fillpreds(fn); - filluse(fn); - promote(fn); - filluse(fn); - ssa(fn); - filluse(fn); - ssacheck(fn); - fillalias(fn); - loadopt(fn); - filluse(fn); - fillalias(fn); - coalesce(fn); - filluse(fn); - ssacheck(fn); - copy(fn); - filluse(fn); - fold(fn); - T.abi1(fn); - simpl(fn); - fillpreds(fn); - filluse(fn); - T.isel(fn); - fillrpo(fn); - filllive(fn); - fillloop(fn); - fillcost(fn); - spill(fn); - rega(fn); - fillrpo(fn); - simpljmp(fn); - fillpreds(fn); - fillrpo(fn); - assert(fn->rpo[0] == fn->start); - for (n=0;; n++) - if (n == fn->nblk-1) { - fn->rpo[n]->link = 0; - break; - } else - fn->rpo[n]->link = fn->rpo[n+1]; - if (!dbg) { - T.emitfn(fn, outf); - fprintf(outf, "/* end function %s */\n\n", fn->name); - } else - fprintf(stderr, "\n"); - freeall(); -} - -static void -dbgfile(char *fn) -{ - emitdbgfile(fn, outf); -} - -int -main(int ac, char *av[]) -{ - Target **t; - FILE *inf, *hf; - char *f, *sep; - int c; - - T = Deftgt; - outf = stdout; - while ((c = getopt(ac, av, "hd:o:t:")) != -1) - switch (c) { - case 'd': - for (; *optarg; optarg++) - if (isalpha(*optarg)) { - debug[toupper(*optarg)] = 1; - dbg = 1; - } - break; - case 'o': - if (strcmp(optarg, "-") != 0) { - outf = fopen(optarg, "w"); - if (!outf) { - fprintf(stderr, "cannot open '%s'\n", optarg); - exit(1); - } - } - break; - case 't': - if (strcmp(optarg, "?") == 0) { - puts(T.name); - exit(0); - } - for (t=tlist;; t++) { - if (!*t) { - fprintf(stderr, "unknown target '%s'\n", optarg); - exit(1); - } - if (strcmp(optarg, (*t)->name) == 0) { - T = **t; - break; - } - } - break; - case 'h': - default: - hf = c != 'h' ? stderr : stdout; - fprintf(hf, "%s [OPTIONS] {file.ssa, -}\n", av[0]); - fprintf(hf, "\t%-11s prints this help\n", "-h"); - fprintf(hf, "\t%-11s output to file\n", "-o file"); - fprintf(hf, "\t%-11s generate for a target among:\n", "-t <target>"); - fprintf(hf, "\t%-11s ", ""); - for (t=tlist, sep=""; *t; t++, sep=", ") { - fprintf(hf, "%s%s", sep, (*t)->name); - if (*t == &Deftgt) - fputs(" (default)", hf); - } - fprintf(hf, "\n"); - fprintf(hf, "\t%-11s dump debug information\n", "-d <flags>"); - exit(c != 'h'); - } - - do { - f = av[optind]; - if (!f || strcmp(f, "-") == 0) { - inf = stdin; - f = "-"; - } else { - inf = fopen(f, "r"); - if (!inf) { - fprintf(stderr, "cannot open '%s'\n", f); - exit(1); - } - } - parse(inf, f, dbgfile, data, func); - fclose(inf); - } while (++optind < ac); - - if (!dbg) - T.emitfin(outf); - - exit(0); -} |