summary refs log tree commit diff
path: root/lisc/main.c
blob: 9ac02865686393bec9c4aa8148608144c785e99a (plain) (blame)
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
#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 */
};

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");
}

int
main(int ac, char *av[])
{
	char *o, *f;
	FILE *inf;
	Fn *fn;
	int n, dbg;

	dbg = 0;

	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;
		}
	}

	fn = parse(inf);
	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);
	else
		fprintf(stderr, "\n");
	exit(0);

Usage:
	fprintf(stderr, "usage: %s [-d PCILSR] {file.ssa, -}\n", av[0]);
	exit(1);
}