#include "all.h"#include "config.h"#include "parg.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 voiddata(Dat *d){ if (dbg) return; emitdat(d, outf); if (d->type == DEnd) { fputs("/* end data */\n\n", outf); freeall(); }} static voidfunc(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();} #ifdef __plan9__void#elseint#endifmain(int ac, char *av[]){ Target **t; FILE *inf, *hf; char *f, *sep; int c, optend; struct parg_state ps; parg_init(&ps); T = Deftgt; outf = stdout; optend = parg_reorder(ac, av, "hd:o:t:", NULL); while ((c = parg_getopt(&ps, optend, av, "hd:o:t:")) != -1) switch (c) { case 1: print("! %s\n", ps.optarg); break; case 'd': if (isalpha(*ps.optarg)) { debug[toupper(*ps.optarg)] = 1; dbg = 1; } break; case 'o': if (strcmp(ps.optarg, "-") != 0) { outf = fopen(ps.optarg, "w"); if (!outf) { fprintf(stderr, "cannot open '%s'\n", ps.optarg); exit(1); } } break; case 't': if (strcmp(ps.optarg, "?") == 0) { puts(T.name); exit(0); } for (t=tlist;; t++) { if (!*t) { fprintf(stderr, "unknown target '%s'\n", ps.optarg); exit(1); } if (strcmp(ps.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[optend]; 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, data, func); fclose(inf); } while (++optend < ac); if (!dbg) T.emitfin(outf); exit(0);}
#include "all.h"
#include "config.h"
#include "parg.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();
}
#ifdef __plan9__
void
#else
int
#endif
main(int ac, char *av[])
{
Target **t;
FILE *inf, *hf;
char *f, *sep;
int c, optend;
struct parg_state ps;
parg_init(&ps);
T = Deftgt;
outf = stdout;
optend = parg_reorder(ac, av, "hd:o:t:", NULL);
while ((c = parg_getopt(&ps, optend, av, "hd:o:t:")) != -1)
switch (c) {
case 1:
print("! %s\n", ps.optarg);
break;
case 'd':
if (isalpha(*ps.optarg)) {
debug[toupper(*ps.optarg)] = 1;
dbg = 1;
}
break;
case 'o':
if (strcmp(ps.optarg, "-") != 0) {
outf = fopen(ps.optarg, "w");
if (!outf) {
fprintf(stderr, "cannot open '%s'\n", ps.optarg);
exit(1);
}
}
break;
case 't':
if (strcmp(ps.optarg, "?") == 0) {
puts(T.name);
exit(0);
}
for (t=tlist;; t++) {
if (!*t) {
fprintf(stderr, "unknown target '%s'\n", ps.optarg);
exit(1);
}
if (strcmp(ps.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[optend];
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, data, func);
fclose(inf);
} while (++optend < ac);
if (!dbg)
T.emitfin(outf);
exit(0);
}