summary refs log tree commit diff
path: root/lisc/main.c
blob: 68196d942d0e344fa9572290828e5f4b17f4f236 (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
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);
}