xref: /plan9-contrib/sys/src/cmd/il/list.c (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1*ce95e1b3SDavid du Colombier #include "l.h"
2*ce95e1b3SDavid du Colombier 
3*ce95e1b3SDavid du Colombier void
listinit(void)4*ce95e1b3SDavid du Colombier listinit(void)
5*ce95e1b3SDavid du Colombier {
6*ce95e1b3SDavid du Colombier 
7*ce95e1b3SDavid du Colombier 	fmtinstall('A', Aconv);
8*ce95e1b3SDavid du Colombier 	fmtinstall('D', Dconv);
9*ce95e1b3SDavid du Colombier 	fmtinstall('P', Pconv);
10*ce95e1b3SDavid du Colombier 	fmtinstall('S', Sconv);
11*ce95e1b3SDavid du Colombier 	fmtinstall('N', Nconv);
12*ce95e1b3SDavid du Colombier }
13*ce95e1b3SDavid du Colombier 
14*ce95e1b3SDavid du Colombier void
prasm(Prog * p)15*ce95e1b3SDavid du Colombier prasm(Prog *p)
16*ce95e1b3SDavid du Colombier {
17*ce95e1b3SDavid du Colombier 	print("%P\n", p);
18*ce95e1b3SDavid du Colombier }
19*ce95e1b3SDavid du Colombier 
20*ce95e1b3SDavid du Colombier int
Pconv(Fmt * fp)21*ce95e1b3SDavid du Colombier Pconv(Fmt *fp)
22*ce95e1b3SDavid du Colombier {
23*ce95e1b3SDavid du Colombier 	char str[STRINGSZ], *s;
24*ce95e1b3SDavid du Colombier 	Prog *p;
25*ce95e1b3SDavid du Colombier 	int a;
26*ce95e1b3SDavid du Colombier 
27*ce95e1b3SDavid du Colombier 	p = va_arg(fp->args, Prog*);
28*ce95e1b3SDavid du Colombier 	curp = p;
29*ce95e1b3SDavid du Colombier 	a = p->as;
30*ce95e1b3SDavid du Colombier 	if(a == ADATA || a == ADYNT || a == AINIT)
31*ce95e1b3SDavid du Colombier 		sprint(str, "(%ld)	%A	%D/%d,%D",
32*ce95e1b3SDavid du Colombier 			p->line, a, &p->from, p->reg, &p->to);
33*ce95e1b3SDavid du Colombier 	else{
34*ce95e1b3SDavid du Colombier 		s = str;
35*ce95e1b3SDavid du Colombier 		s += sprint(s, "(%ld)", p->line);
36*ce95e1b3SDavid du Colombier 		if(p->reg == NREG)
37*ce95e1b3SDavid du Colombier 			sprint(s, "	%A	%D,%D",
38*ce95e1b3SDavid du Colombier 				a, &p->from, &p->to);
39*ce95e1b3SDavid du Colombier 		else
40*ce95e1b3SDavid du Colombier 		if(p->from.type != D_FREG)
41*ce95e1b3SDavid du Colombier 			sprint(s, "	%A	%D,R%d,%D",
42*ce95e1b3SDavid du Colombier 				a, &p->from, p->reg, &p->to);
43*ce95e1b3SDavid du Colombier 		else
44*ce95e1b3SDavid du Colombier 			sprint(s, "	%A	%D,F%d,%D",
45*ce95e1b3SDavid du Colombier 				a, &p->from, p->reg, &p->to);
46*ce95e1b3SDavid du Colombier 	}
47*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
48*ce95e1b3SDavid du Colombier }
49*ce95e1b3SDavid du Colombier 
50*ce95e1b3SDavid du Colombier int
Aconv(Fmt * fp)51*ce95e1b3SDavid du Colombier Aconv(Fmt *fp)
52*ce95e1b3SDavid du Colombier {
53*ce95e1b3SDavid du Colombier 	char *s;
54*ce95e1b3SDavid du Colombier 	int a;
55*ce95e1b3SDavid du Colombier 
56*ce95e1b3SDavid du Colombier 	a = va_arg(fp->args, int);
57*ce95e1b3SDavid du Colombier 	s = "???";
58*ce95e1b3SDavid du Colombier 	if(a >= AXXX && a < ALAST)
59*ce95e1b3SDavid du Colombier 		s = anames[a];
60*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, s);
61*ce95e1b3SDavid du Colombier }
62*ce95e1b3SDavid du Colombier 
63*ce95e1b3SDavid du Colombier int
Dconv(Fmt * fp)64*ce95e1b3SDavid du Colombier Dconv(Fmt *fp)
65*ce95e1b3SDavid du Colombier {
66*ce95e1b3SDavid du Colombier 	char str[STRINGSZ];
67*ce95e1b3SDavid du Colombier 	Adr *a;
68*ce95e1b3SDavid du Colombier 	long v;
69*ce95e1b3SDavid du Colombier 
70*ce95e1b3SDavid du Colombier 	a = va_arg(fp->args, Adr*);
71*ce95e1b3SDavid du Colombier 	switch(a->type) {
72*ce95e1b3SDavid du Colombier 
73*ce95e1b3SDavid du Colombier 	default:
74*ce95e1b3SDavid du Colombier 		sprint(str, "GOK-type(%d)", a->type);
75*ce95e1b3SDavid du Colombier 		break;
76*ce95e1b3SDavid du Colombier 
77*ce95e1b3SDavid du Colombier 	case D_NONE:
78*ce95e1b3SDavid du Colombier 		str[0] = 0;
79*ce95e1b3SDavid du Colombier 		if(a->name != D_NONE || a->reg != NREG || a->sym != S)
80*ce95e1b3SDavid du Colombier 			sprint(str, "%N(R%d)(NONE)", a, a->reg);
81*ce95e1b3SDavid du Colombier 		break;
82*ce95e1b3SDavid du Colombier 
83*ce95e1b3SDavid du Colombier 	case D_CONST:
84*ce95e1b3SDavid du Colombier 		if(a->reg == NREG)
85*ce95e1b3SDavid du Colombier 			sprint(str, "$%N", a);
86*ce95e1b3SDavid du Colombier 		else
87*ce95e1b3SDavid du Colombier 			sprint(str, "$%N(R%d)", a, a->reg);
88*ce95e1b3SDavid du Colombier 		break;
89*ce95e1b3SDavid du Colombier 
90*ce95e1b3SDavid du Colombier 	case D_VCONST:
91*ce95e1b3SDavid du Colombier 		sprint(str, "$%lld", *a->vval);
92*ce95e1b3SDavid du Colombier 		break;
93*ce95e1b3SDavid du Colombier 
94*ce95e1b3SDavid du Colombier 	case D_OREG:
95*ce95e1b3SDavid du Colombier 		if(a->reg != NREG)
96*ce95e1b3SDavid du Colombier 			sprint(str, "%N(R%d)", a, a->reg);
97*ce95e1b3SDavid du Colombier 		else
98*ce95e1b3SDavid du Colombier 			sprint(str, "%N", a);
99*ce95e1b3SDavid du Colombier 		break;
100*ce95e1b3SDavid du Colombier 
101*ce95e1b3SDavid du Colombier 	case D_REG:
102*ce95e1b3SDavid du Colombier 		sprint(str, "R%d", a->reg);
103*ce95e1b3SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
104*ce95e1b3SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
105*ce95e1b3SDavid du Colombier 		break;
106*ce95e1b3SDavid du Colombier 
107*ce95e1b3SDavid du Colombier 	case D_FREG:
108*ce95e1b3SDavid du Colombier 		sprint(str, "F%d", a->reg);
109*ce95e1b3SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
110*ce95e1b3SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
111*ce95e1b3SDavid du Colombier 		break;
112*ce95e1b3SDavid du Colombier 
113*ce95e1b3SDavid du Colombier 	case D_CTLREG:
114*ce95e1b3SDavid du Colombier 		sprint(str, "CSR(0x%lx)", a->offset);
115*ce95e1b3SDavid du Colombier 		break;
116*ce95e1b3SDavid du Colombier 
117*ce95e1b3SDavid du Colombier 	case D_BRANCH:	/* botch */
118*ce95e1b3SDavid du Colombier 		if(curp->cond != P) {
119*ce95e1b3SDavid du Colombier 			v = curp->cond->pc + INITTEXT;
120*ce95e1b3SDavid du Colombier 			if(a->sym != S)
121*ce95e1b3SDavid du Colombier 				sprint(str, "%s+%.5lux(BRANCH)", a->sym->name, v);
122*ce95e1b3SDavid du Colombier 			else
123*ce95e1b3SDavid du Colombier 				sprint(str, "%.5lux(BRANCH)", v);
124*ce95e1b3SDavid du Colombier 		} else
125*ce95e1b3SDavid du Colombier 			if(a->sym != S)
126*ce95e1b3SDavid du Colombier 				sprint(str, "%s+%ld(APC)", a->sym->name, a->offset);
127*ce95e1b3SDavid du Colombier 			else
128*ce95e1b3SDavid du Colombier 				sprint(str, "%ld(APC)", a->offset);
129*ce95e1b3SDavid du Colombier 		break;
130*ce95e1b3SDavid du Colombier 
131*ce95e1b3SDavid du Colombier 	case D_FCONST:
132*ce95e1b3SDavid du Colombier 		sprint(str, "$%e", ieeedtod(a->ieee));
133*ce95e1b3SDavid du Colombier 		break;
134*ce95e1b3SDavid du Colombier 
135*ce95e1b3SDavid du Colombier 	case D_SCONST:
136*ce95e1b3SDavid du Colombier 		sprint(str, "$\"%S\"", a->sval);
137*ce95e1b3SDavid du Colombier 		break;
138*ce95e1b3SDavid du Colombier 	}
139*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
140*ce95e1b3SDavid du Colombier }
141*ce95e1b3SDavid du Colombier 
142*ce95e1b3SDavid du Colombier int
Nconv(Fmt * fp)143*ce95e1b3SDavid du Colombier Nconv(Fmt *fp)
144*ce95e1b3SDavid du Colombier {
145*ce95e1b3SDavid du Colombier 	char str[STRINGSZ];
146*ce95e1b3SDavid du Colombier 	Adr *a;
147*ce95e1b3SDavid du Colombier 	Sym *s;
148*ce95e1b3SDavid du Colombier 
149*ce95e1b3SDavid du Colombier 	a = va_arg(fp->args, Adr*);
150*ce95e1b3SDavid du Colombier 	s = a->sym;
151*ce95e1b3SDavid du Colombier 	switch(a->name) {
152*ce95e1b3SDavid du Colombier 	default:
153*ce95e1b3SDavid du Colombier 		sprint(str, "GOK-name(%d)", a->name);
154*ce95e1b3SDavid du Colombier 		break;
155*ce95e1b3SDavid du Colombier 
156*ce95e1b3SDavid du Colombier 	case D_NONE:
157*ce95e1b3SDavid du Colombier 		sprint(str, "%ld", a->offset);
158*ce95e1b3SDavid du Colombier 		break;
159*ce95e1b3SDavid du Colombier 
160*ce95e1b3SDavid du Colombier 	case D_EXTERN:
161*ce95e1b3SDavid du Colombier 		if(s == S)
162*ce95e1b3SDavid du Colombier 			sprint(str, "%ld(SB)", a->offset);
163*ce95e1b3SDavid du Colombier 		else
164*ce95e1b3SDavid du Colombier 			sprint(str, "%s+%ld(SB)", s->name, a->offset);
165*ce95e1b3SDavid du Colombier 		break;
166*ce95e1b3SDavid du Colombier 
167*ce95e1b3SDavid du Colombier 	case D_STATIC:
168*ce95e1b3SDavid du Colombier 		if(s == S)
169*ce95e1b3SDavid du Colombier 			sprint(str, "<>+%ld(SB)", a->offset);
170*ce95e1b3SDavid du Colombier 		else
171*ce95e1b3SDavid du Colombier 			sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
172*ce95e1b3SDavid du Colombier 		break;
173*ce95e1b3SDavid du Colombier 
174*ce95e1b3SDavid du Colombier 	case D_AUTO:
175*ce95e1b3SDavid du Colombier 		if(s == S)
176*ce95e1b3SDavid du Colombier 			sprint(str, "%ld(SP)", a->offset);
177*ce95e1b3SDavid du Colombier 		else
178*ce95e1b3SDavid du Colombier 			sprint(str, "%s-%ld(SP)", s->name, -a->offset);
179*ce95e1b3SDavid du Colombier 		break;
180*ce95e1b3SDavid du Colombier 
181*ce95e1b3SDavid du Colombier 	case D_PARAM:
182*ce95e1b3SDavid du Colombier 		if(s == S)
183*ce95e1b3SDavid du Colombier 			sprint(str, "%ld(FP)", a->offset);
184*ce95e1b3SDavid du Colombier 		else
185*ce95e1b3SDavid du Colombier 			sprint(str, "%s+%ld(FP)", s->name, a->offset);
186*ce95e1b3SDavid du Colombier 		break;
187*ce95e1b3SDavid du Colombier 	}
188*ce95e1b3SDavid du Colombier 
189*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
190*ce95e1b3SDavid du Colombier }
191*ce95e1b3SDavid du Colombier 
192*ce95e1b3SDavid du Colombier int
Sconv(Fmt * fp)193*ce95e1b3SDavid du Colombier Sconv(Fmt *fp)
194*ce95e1b3SDavid du Colombier {
195*ce95e1b3SDavid du Colombier 	int i, c;
196*ce95e1b3SDavid du Colombier 	char str[STRINGSZ], *p, *a;
197*ce95e1b3SDavid du Colombier 
198*ce95e1b3SDavid du Colombier 	a = va_arg(fp->args, char*);
199*ce95e1b3SDavid du Colombier 	p = str;
200*ce95e1b3SDavid du Colombier 	for(i=0; i<sizeof(long); i++) {
201*ce95e1b3SDavid du Colombier 		c = a[i] & 0xff;
202*ce95e1b3SDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
203*ce95e1b3SDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
204*ce95e1b3SDavid du Colombier 		   c >= '0' && c <= '9' ||
205*ce95e1b3SDavid du Colombier 		   c == ' ' || c == '%') {
206*ce95e1b3SDavid du Colombier 			*p++ = c;
207*ce95e1b3SDavid du Colombier 			continue;
208*ce95e1b3SDavid du Colombier 		}
209*ce95e1b3SDavid du Colombier 		*p++ = '\\';
210*ce95e1b3SDavid du Colombier 		switch(c) {
211*ce95e1b3SDavid du Colombier 		case 0:
212*ce95e1b3SDavid du Colombier 			*p++ = 'z';
213*ce95e1b3SDavid du Colombier 			continue;
214*ce95e1b3SDavid du Colombier 		case '\\':
215*ce95e1b3SDavid du Colombier 		case '"':
216*ce95e1b3SDavid du Colombier 			*p++ = c;
217*ce95e1b3SDavid du Colombier 			continue;
218*ce95e1b3SDavid du Colombier 		case '\n':
219*ce95e1b3SDavid du Colombier 			*p++ = 'n';
220*ce95e1b3SDavid du Colombier 			continue;
221*ce95e1b3SDavid du Colombier 		case '\t':
222*ce95e1b3SDavid du Colombier 			*p++ = 't';
223*ce95e1b3SDavid du Colombier 			continue;
224*ce95e1b3SDavid du Colombier 		}
225*ce95e1b3SDavid du Colombier 		*p++ = (c>>6) + '0';
226*ce95e1b3SDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
227*ce95e1b3SDavid du Colombier 		*p++ = (c & 7) + '0';
228*ce95e1b3SDavid du Colombier 	}
229*ce95e1b3SDavid du Colombier 	*p = 0;
230*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
231*ce95e1b3SDavid du Colombier }
232*ce95e1b3SDavid du Colombier 
233*ce95e1b3SDavid du Colombier void
diag(char * fmt,...)234*ce95e1b3SDavid du Colombier diag(char *fmt, ...)
235*ce95e1b3SDavid du Colombier {
236*ce95e1b3SDavid du Colombier 	char buf[STRINGSZ], *tn;
237*ce95e1b3SDavid du Colombier 	va_list arg;
238*ce95e1b3SDavid du Colombier 
239*ce95e1b3SDavid du Colombier 	tn = "??none??";
240*ce95e1b3SDavid du Colombier 	if(curtext != P && curtext->from.sym != S)
241*ce95e1b3SDavid du Colombier 		tn = curtext->from.sym->name;
242*ce95e1b3SDavid du Colombier 	va_start(arg, fmt);
243*ce95e1b3SDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
244*ce95e1b3SDavid du Colombier 	va_end(arg);
245*ce95e1b3SDavid du Colombier 	print("%s: %s\n", tn, buf);
246*ce95e1b3SDavid du Colombier 
247*ce95e1b3SDavid du Colombier 	nerrors++;
248*ce95e1b3SDavid du Colombier 	if(nerrors > 10) {
249*ce95e1b3SDavid du Colombier 		print("too many errors\n");
250*ce95e1b3SDavid du Colombier 		errorexit();
251*ce95e1b3SDavid du Colombier 	}
252*ce95e1b3SDavid du Colombier }
253