xref: /plan9/sys/src/cmd/kl/list.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include "l.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier void
listinit(void)43e12c5d1SDavid du Colombier listinit(void)
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier 	fmtinstall('A', Aconv);
83e12c5d1SDavid du Colombier 	fmtinstall('D', Dconv);
93e12c5d1SDavid du Colombier 	fmtinstall('P', Pconv);
103e12c5d1SDavid du Colombier 	fmtinstall('S', Sconv);
113e12c5d1SDavid du Colombier 	fmtinstall('N', Nconv);
123e12c5d1SDavid du Colombier }
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier void
prasm(Prog * p)153e12c5d1SDavid du Colombier prasm(Prog *p)
163e12c5d1SDavid du Colombier {
173e12c5d1SDavid du Colombier 	print("%P\n", p);
183e12c5d1SDavid du Colombier }
193e12c5d1SDavid du Colombier 
203e12c5d1SDavid du Colombier int
Pconv(Fmt * fp)21*9a747e4fSDavid du Colombier Pconv(Fmt *fp)
223e12c5d1SDavid du Colombier {
23219b2ee8SDavid du Colombier 	char str[STRINGSZ], *s;
243e12c5d1SDavid du Colombier 	Prog *p;
253e12c5d1SDavid du Colombier 	int a;
263e12c5d1SDavid du Colombier 
27*9a747e4fSDavid du Colombier 	p = va_arg(fp->args, Prog*);
283e12c5d1SDavid du Colombier 	curp = p;
293e12c5d1SDavid du Colombier 	a = p->as;
30219b2ee8SDavid du Colombier 	if(a == ADATA || a == AINIT || a == ADYNT)
313e12c5d1SDavid du Colombier 		sprint(str, "	%A	%D/%d,%D", a, &p->from, p->reg, &p->to);
32219b2ee8SDavid du Colombier 	else{
33219b2ee8SDavid du Colombier 		s = str;
34219b2ee8SDavid du Colombier 		if(p->mark & NOSCHED)
35219b2ee8SDavid du Colombier 			s += sprint(s, "*");
363e12c5d1SDavid du Colombier 		if(p->reg == NREG)
37219b2ee8SDavid du Colombier 			sprint(s, "	%A	%D,%D", a, &p->from, &p->to);
383e12c5d1SDavid du Colombier 		else
393e12c5d1SDavid du Colombier 		if(p->from.type == D_OREG) {
40219b2ee8SDavid du Colombier 			sprint(s, "	%A	%ld(R%d+R%d),%D", a,
413e12c5d1SDavid du Colombier 				p->from.offset, p->from.reg, p->reg, &p->to);
423e12c5d1SDavid du Colombier 		} else
433e12c5d1SDavid du Colombier 		if(p->to.type == D_OREG) {
44219b2ee8SDavid du Colombier 			sprint(s, "	%A	%D,%ld(R%d+R%d)", a,
453e12c5d1SDavid du Colombier 				&p->from, p->to.offset, p->to.reg, p->reg);
463e12c5d1SDavid du Colombier 		} else
473e12c5d1SDavid du Colombier 		if(p->from.type == D_FREG)
48219b2ee8SDavid du Colombier 			sprint(s, "	%A	%D,F%d,%D", a, &p->from, p->reg, &p->to);
493e12c5d1SDavid du Colombier 		else
50219b2ee8SDavid du Colombier 			sprint(s, "	%A	%D,R%d,%D", a, &p->from, p->reg, &p->to);
51219b2ee8SDavid du Colombier 	}
52*9a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
533e12c5d1SDavid du Colombier }
543e12c5d1SDavid du Colombier 
553e12c5d1SDavid du Colombier int
Aconv(Fmt * fp)56*9a747e4fSDavid du Colombier Aconv(Fmt *fp)
573e12c5d1SDavid du Colombier {
583e12c5d1SDavid du Colombier 	char *s;
593e12c5d1SDavid du Colombier 	int a;
603e12c5d1SDavid du Colombier 
61*9a747e4fSDavid du Colombier 	a = va_arg(fp->args, int);
623e12c5d1SDavid du Colombier 	s = "???";
63219b2ee8SDavid du Colombier 	if(a >= AXXX && a <= ALAST)
643e12c5d1SDavid du Colombier 		s = anames[a];
65*9a747e4fSDavid du Colombier 	return fmtstrcpy(fp, s);
663e12c5d1SDavid du Colombier }
673e12c5d1SDavid du Colombier 
683e12c5d1SDavid du Colombier int
Dconv(Fmt * fp)69*9a747e4fSDavid du Colombier Dconv(Fmt *fp)
703e12c5d1SDavid du Colombier {
713e12c5d1SDavid du Colombier 	char str[STRINGSZ];
723e12c5d1SDavid du Colombier 	Adr *a;
733e12c5d1SDavid du Colombier 	long v;
743e12c5d1SDavid du Colombier 
75*9a747e4fSDavid du Colombier 	a = va_arg(fp->args, Adr*);
763e12c5d1SDavid du Colombier 	switch(a->type) {
773e12c5d1SDavid du Colombier 
783e12c5d1SDavid du Colombier 	default:
793e12c5d1SDavid du Colombier 		sprint(str, "GOK-type(%d)", a->type);
803e12c5d1SDavid du Colombier 		break;
813e12c5d1SDavid du Colombier 
823e12c5d1SDavid du Colombier 	case D_NONE:
833e12c5d1SDavid du Colombier 		str[0] = 0;
843e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->reg != NREG || a->sym != S)
853e12c5d1SDavid du Colombier 			sprint(str, "%N(R%d)(NONE)", a, a->reg);
863e12c5d1SDavid du Colombier 		break;
873e12c5d1SDavid du Colombier 
883e12c5d1SDavid du Colombier 	case D_CONST:
893e12c5d1SDavid du Colombier 		if(a->reg != NREG)
903e12c5d1SDavid du Colombier 			sprint(str, "$%N(R%d)", a, a->reg);
913e12c5d1SDavid du Colombier 		else
923e12c5d1SDavid du Colombier 			sprint(str, "$%N", a);
933e12c5d1SDavid du Colombier 		break;
943e12c5d1SDavid du Colombier 
953e12c5d1SDavid du Colombier 	case D_ASI:
963e12c5d1SDavid du Colombier 		if(a->reg != NREG)
973e12c5d1SDavid du Colombier 			sprint(str, "(R%d,%ld)", a->reg, a->offset);
983e12c5d1SDavid du Colombier 		else
993e12c5d1SDavid du Colombier 			sprint(str, "(R%d,%ld)", 0, a->offset);
1003e12c5d1SDavid du Colombier 		break;
1013e12c5d1SDavid du Colombier 
1023e12c5d1SDavid du Colombier 	case D_OREG:
1033e12c5d1SDavid du Colombier 		if(a->reg != NREG)
1043e12c5d1SDavid du Colombier 			sprint(str, "%N(R%d)", a, a->reg);
1053e12c5d1SDavid du Colombier 		else
1063e12c5d1SDavid du Colombier 			sprint(str, "%N", a);
1073e12c5d1SDavid du Colombier 		break;
1083e12c5d1SDavid du Colombier 
1093e12c5d1SDavid du Colombier 	case D_REG:
1103e12c5d1SDavid du Colombier 		sprint(str, "R%d", a->reg);
1113e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1123e12c5d1SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
1133e12c5d1SDavid du Colombier 		break;
1143e12c5d1SDavid du Colombier 
1153e12c5d1SDavid du Colombier 	case D_FREG:
1163e12c5d1SDavid du Colombier 		sprint(str, "F%d", a->reg);
1173e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1183e12c5d1SDavid du Colombier 			sprint(str, "%N(F%d)(REG)", a, a->reg);
1193e12c5d1SDavid du Colombier 		break;
1203e12c5d1SDavid du Colombier 
1213e12c5d1SDavid du Colombier 	case D_CREG:
1223e12c5d1SDavid du Colombier 		sprint(str, "C%d", a->reg);
1233e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1243e12c5d1SDavid du Colombier 			sprint(str, "%N(C%d)(REG)", a, a->reg);
1253e12c5d1SDavid du Colombier 		break;
1263e12c5d1SDavid du Colombier 
1273e12c5d1SDavid du Colombier 	case D_PREG:
1283e12c5d1SDavid du Colombier 		sprint(str, "P%d", a->reg);
1293e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1303e12c5d1SDavid du Colombier 			sprint(str, "%N(P%d)(REG)", a, a->reg);
1313e12c5d1SDavid du Colombier 		break;
1323e12c5d1SDavid du Colombier 
1333e12c5d1SDavid du Colombier 	case D_BRANCH:
1343e12c5d1SDavid du Colombier 		if(curp->cond != P) {
1353e12c5d1SDavid du Colombier 			v = curp->cond->pc;
1363e12c5d1SDavid du Colombier 			if(v >= INITTEXT)
1373e12c5d1SDavid du Colombier 				v -= INITTEXT-HEADR;
1383e12c5d1SDavid du Colombier 			if(a->sym != S)
1393e12c5d1SDavid du Colombier 				sprint(str, "%s+%.5lux(BRANCH)", a->sym->name, v);
1403e12c5d1SDavid du Colombier 			else
1413e12c5d1SDavid du Colombier 				sprint(str, "%.5lux(BRANCH)", v);
1423e12c5d1SDavid du Colombier 		} else
1433e12c5d1SDavid du Colombier 			if(a->sym != S)
1443e12c5d1SDavid du Colombier 				sprint(str, "%s+%ld(APC)", a->sym->name, a->offset);
1453e12c5d1SDavid du Colombier 			else
1463e12c5d1SDavid du Colombier 				sprint(str, "%ld(APC)", a->offset);
1473e12c5d1SDavid du Colombier 		break;
1483e12c5d1SDavid du Colombier 
1493e12c5d1SDavid du Colombier 	case D_FCONST:
1503e12c5d1SDavid du Colombier 		sprint(str, "$%lux-%lux", a->ieee.h, a->ieee.l);
1513e12c5d1SDavid du Colombier 		break;
1523e12c5d1SDavid du Colombier 
1533e12c5d1SDavid du Colombier 	case D_SCONST:
1543e12c5d1SDavid du Colombier 		sprint(str, "$\"%S\"", a->sval);
1553e12c5d1SDavid du Colombier 		break;
1563e12c5d1SDavid du Colombier 	}
157*9a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
1583e12c5d1SDavid du Colombier }
1593e12c5d1SDavid du Colombier 
1603e12c5d1SDavid du Colombier int
Nconv(Fmt * fp)161*9a747e4fSDavid du Colombier Nconv(Fmt *fp)
1623e12c5d1SDavid du Colombier {
1633e12c5d1SDavid du Colombier 	char str[STRINGSZ];
1643e12c5d1SDavid du Colombier 	Adr *a;
1653e12c5d1SDavid du Colombier 	Sym *s;
1663e12c5d1SDavid du Colombier 
167*9a747e4fSDavid du Colombier 	a = va_arg(fp->args, Adr*);
1683e12c5d1SDavid du Colombier 	s = a->sym;
1693e12c5d1SDavid du Colombier 	if(s == S) {
1703e12c5d1SDavid du Colombier 		sprint(str, "%ld", a->offset);
1713e12c5d1SDavid du Colombier 		goto out;
1723e12c5d1SDavid du Colombier 	}
1733e12c5d1SDavid du Colombier 	switch(a->name) {
1743e12c5d1SDavid du Colombier 	default:
1753e12c5d1SDavid du Colombier 		sprint(str, "GOK-name(%d)", a->name);
1763e12c5d1SDavid du Colombier 		break;
1773e12c5d1SDavid du Colombier 
1783e12c5d1SDavid du Colombier 	case D_EXTERN:
1793e12c5d1SDavid du Colombier 		sprint(str, "%s+%ld(SB)", s->name, a->offset);
1803e12c5d1SDavid du Colombier 		break;
1813e12c5d1SDavid du Colombier 
1823e12c5d1SDavid du Colombier 	case D_STATIC:
1833e12c5d1SDavid du Colombier 		sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
1843e12c5d1SDavid du Colombier 		break;
1853e12c5d1SDavid du Colombier 
1863e12c5d1SDavid du Colombier 	case D_AUTO:
1873e12c5d1SDavid du Colombier 		sprint(str, "%s-%ld(SP)", s->name, -a->offset);
1883e12c5d1SDavid du Colombier 		break;
1893e12c5d1SDavid du Colombier 
1903e12c5d1SDavid du Colombier 	case D_PARAM:
1913e12c5d1SDavid du Colombier 		sprint(str, "%s+%ld(FP)", s->name, a->offset);
1923e12c5d1SDavid du Colombier 		break;
1933e12c5d1SDavid du Colombier 	}
1943e12c5d1SDavid du Colombier out:
195*9a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
1963e12c5d1SDavid du Colombier }
1973e12c5d1SDavid du Colombier 
1983e12c5d1SDavid du Colombier int
Sconv(Fmt * fp)199*9a747e4fSDavid du Colombier Sconv(Fmt *fp)
2003e12c5d1SDavid du Colombier {
2013e12c5d1SDavid du Colombier 	int i, c;
2023e12c5d1SDavid du Colombier 	char str[STRINGSZ], *p, *a;
2033e12c5d1SDavid du Colombier 
204*9a747e4fSDavid du Colombier 	a = va_arg(fp->args, char*);
2053e12c5d1SDavid du Colombier 	p = str;
2063e12c5d1SDavid du Colombier 	for(i=0; i<sizeof(long); i++) {
2073e12c5d1SDavid du Colombier 		c = a[i] & 0xff;
2083e12c5d1SDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
2093e12c5d1SDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
2103e12c5d1SDavid du Colombier 		   c >= '0' && c <= '9' ||
2113e12c5d1SDavid du Colombier 		   c == ' ' || c == '%') {
2123e12c5d1SDavid du Colombier 			*p++ = c;
2133e12c5d1SDavid du Colombier 			continue;
2143e12c5d1SDavid du Colombier 		}
2153e12c5d1SDavid du Colombier 		*p++ = '\\';
2163e12c5d1SDavid du Colombier 		switch(c) {
2173e12c5d1SDavid du Colombier 		case 0:
2183e12c5d1SDavid du Colombier 			*p++ = 'z';
2193e12c5d1SDavid du Colombier 			continue;
2203e12c5d1SDavid du Colombier 		case '\\':
2213e12c5d1SDavid du Colombier 		case '"':
2223e12c5d1SDavid du Colombier 			*p++ = c;
2233e12c5d1SDavid du Colombier 			continue;
2243e12c5d1SDavid du Colombier 		case '\n':
2253e12c5d1SDavid du Colombier 			*p++ = 'n';
2263e12c5d1SDavid du Colombier 			continue;
2273e12c5d1SDavid du Colombier 		case '\t':
2283e12c5d1SDavid du Colombier 			*p++ = 't';
2293e12c5d1SDavid du Colombier 			continue;
2303e12c5d1SDavid du Colombier 		}
2313e12c5d1SDavid du Colombier 		*p++ = (c>>6) + '0';
2323e12c5d1SDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
2333e12c5d1SDavid du Colombier 		*p++ = (c & 7) + '0';
2343e12c5d1SDavid du Colombier 	}
2353e12c5d1SDavid du Colombier 	*p = 0;
236*9a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
2373e12c5d1SDavid du Colombier }
2383e12c5d1SDavid du Colombier 
2393e12c5d1SDavid du Colombier void
diag(char * fmt,...)2407dd7cddfSDavid du Colombier diag(char *fmt, ...)
2413e12c5d1SDavid du Colombier {
2423e12c5d1SDavid du Colombier 	char buf[STRINGSZ], *tn;
2437dd7cddfSDavid du Colombier 	va_list arg;
2443e12c5d1SDavid du Colombier 
2453e12c5d1SDavid du Colombier 	tn = "??none??";
2463e12c5d1SDavid du Colombier 	if(curtext != P && curtext->from.sym != S)
2473e12c5d1SDavid du Colombier 		tn = curtext->from.sym->name;
2487dd7cddfSDavid du Colombier 	va_start(arg, fmt);
249*9a747e4fSDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
2507dd7cddfSDavid du Colombier 	va_end(arg);
2513e12c5d1SDavid du Colombier 	print("%s: %s\n", tn, buf);
2523e12c5d1SDavid du Colombier 
2533e12c5d1SDavid du Colombier 	nerrors++;
2543e12c5d1SDavid du Colombier 	if(nerrors > 10) {
2553e12c5d1SDavid du Colombier 		print("too many errors\n");
2563e12c5d1SDavid du Colombier 		errorexit();
2573e12c5d1SDavid du Colombier 	}
2583e12c5d1SDavid du Colombier }
259