1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#include "lisc.h"
#include <ctype.h>
char debug['Z'+1] = {
['P'] = 0, /* parsing */
['C'] = 0, /* call lowering */
['I'] = 0, /* instruction selection */
['L'] = 0, /* liveness */
['S'] = 0, /* spilling */
['R'] = 0, /* reg. allocation */
};
static int dbg;
void
dumpts(Bits *b, Tmp *tmp, FILE *f)
{
int t;
fprintf(f, "[");
for (t=Tmp0; t<BITS*NBit; t++)
if (BGET(*b, t))
fprintf(f, " %s", tmp[t].name);
fprintf(f, " ]\n");
}
static void
data(Dat *d)
{
if (dbg)
return;
if (d->type == DEnd) {
puts("/* end data */\n");
freeall();
}
emitdat(d, stdout);
}
static void
func(Fn *fn)
{
int n;
if (dbg)
fprintf(stderr, "**** Function %s ****", fn->name);
if (debug['P']) {
fprintf(stderr, "\n> After parsing:\n");
printfn(fn, stderr);
}
isel(fn);
fillrpo(fn);
fillpreds(fn);
filllive(fn);
fillcost(fn);
fillphi(fn);
spill(fn);
rega(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) {
emitfn(fn, stdout);
printf("/* end function %s */\n\n", fn->name);
} else
fprintf(stderr, "\n");
freeall();
}
int
main(int ac, char *av[])
{
char *o, *f;
FILE *inf;
if (ac > 1 && strncmp(av[1], "-d", 2) == 0) {
if (av[1][2] == 0) {
if (ac <= 2)
goto Usage;
o = av[2];
f = av[3];
} else {
o = &av[1][2];
f = av[2];
}
for (; *o; o++)
if (isalpha(*o)) {
debug[toupper(*o)] = 1;
dbg = 1;
}
} else
f = av[1];
if (!f || strcmp(f, "-") == 0)
inf = stdin;
else {
inf = fopen(f, "r");
if (!inf) {
fprintf(stderr, "cannot open '%s'\n", f);
goto Usage;
}
}
parse(inf, data, func);
fclose(inf);
exit(0);
Usage:
fprintf(stderr, "usage: %s [-d PCILSR] {file.ssa, -}\n", av[0]);
exit(1);
}
|