xref: /plan9-contrib/sys/src/cmd/vc/list.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include "gc.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier void
43e12c5d1SDavid du Colombier listinit(void)
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier 	fmtinstall('A', Aconv);
83e12c5d1SDavid du Colombier 	fmtinstall('P', Pconv);
93e12c5d1SDavid du Colombier 	fmtinstall('S', Sconv);
103e12c5d1SDavid du Colombier 	fmtinstall('N', Nconv);
113e12c5d1SDavid du Colombier 	fmtinstall('B', Bconv);
123e12c5d1SDavid du Colombier 	fmtinstall('D', Dconv);
133e12c5d1SDavid du Colombier }
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier int
16bd389b36SDavid du Colombier Pconv(void *o, Fconv *fp)
173e12c5d1SDavid du Colombier {
183e12c5d1SDavid du Colombier 	char str[STRINGSZ];
193e12c5d1SDavid du Colombier 	Prog *p;
203e12c5d1SDavid du Colombier 	int a;
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier 	p = *(Prog**)o;
233e12c5d1SDavid du Colombier 	a = p->as;
243e12c5d1SDavid du Colombier 	if(a == ADATA)
253e12c5d1SDavid du Colombier 		sprint(str, "	%A	%D/%d,%D", a, &p->from, p->reg, &p->to);
263e12c5d1SDavid du Colombier 	else
273e12c5d1SDavid du Colombier 	if(p->reg == NREG)
283e12c5d1SDavid du Colombier 		sprint(str, "	%A	%D,%D", a, &p->from, &p->to);
293e12c5d1SDavid du Colombier 	else
303e12c5d1SDavid du Colombier 	if(p->from.type != D_FREG)
313e12c5d1SDavid du Colombier 		sprint(str, "	%A	%D,R%d,%D", a, &p->from, p->reg, &p->to);
323e12c5d1SDavid du Colombier 	else
333e12c5d1SDavid du Colombier 		sprint(str, "	%A	%D,F%d,%D", a, &p->from, p->reg, &p->to);
34bd389b36SDavid du Colombier 	strconv(str, fp);
353e12c5d1SDavid du Colombier 	return sizeof(p);
363e12c5d1SDavid du Colombier }
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier int
39bd389b36SDavid du Colombier Aconv(void *o, Fconv *fp)
403e12c5d1SDavid du Colombier {
413e12c5d1SDavid du Colombier 	char *s;
423e12c5d1SDavid du Colombier 	int a;
433e12c5d1SDavid du Colombier 
443e12c5d1SDavid du Colombier 	a = *(int*)o;
453e12c5d1SDavid du Colombier 	s = "???";
46*219b2ee8SDavid du Colombier 	if(a >= AXXX && a < ALAST)
473e12c5d1SDavid du Colombier 		s = anames[a];
48bd389b36SDavid du Colombier 	strconv(s, fp);
493e12c5d1SDavid du Colombier 	return sizeof(a);
503e12c5d1SDavid du Colombier }
513e12c5d1SDavid du Colombier 
523e12c5d1SDavid du Colombier int
53bd389b36SDavid du Colombier Dconv(void *o, Fconv *fp)
543e12c5d1SDavid du Colombier {
553e12c5d1SDavid du Colombier 	char str[STRINGSZ];
563e12c5d1SDavid du Colombier 	Adr *a;
573e12c5d1SDavid du Colombier 
583e12c5d1SDavid du Colombier 	a = *(Adr**)o;
593e12c5d1SDavid du Colombier 	switch(a->type) {
603e12c5d1SDavid du Colombier 
613e12c5d1SDavid du Colombier 	default:
623e12c5d1SDavid du Colombier 		sprint(str, "GOK-type(%d)", a->type);
633e12c5d1SDavid du Colombier 		break;
643e12c5d1SDavid du Colombier 
653e12c5d1SDavid du Colombier 	case D_NONE:
663e12c5d1SDavid du Colombier 		str[0] = 0;
673e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->reg != NREG || a->sym != S)
683e12c5d1SDavid du Colombier 			sprint(str, "%N(R%d)(NONE)", a, a->reg);
693e12c5d1SDavid du Colombier 		break;
703e12c5d1SDavid du Colombier 
713e12c5d1SDavid du Colombier 	case D_CONST:
723e12c5d1SDavid du Colombier 		if(a->reg != NREG)
733e12c5d1SDavid du Colombier 			sprint(str, "$%N(R%d)", a, a->reg);
743e12c5d1SDavid du Colombier 		else
753e12c5d1SDavid du Colombier 			sprint(str, "$%N", a);
763e12c5d1SDavid du Colombier 		break;
773e12c5d1SDavid du Colombier 
783e12c5d1SDavid du Colombier 	case D_OREG:
793e12c5d1SDavid du Colombier 		if(a->reg != NREG)
803e12c5d1SDavid du Colombier 			sprint(str, "%N(R%d)", a, a->reg);
813e12c5d1SDavid du Colombier 		else
823e12c5d1SDavid du Colombier 			sprint(str, "%N", a);
833e12c5d1SDavid du Colombier 		break;
843e12c5d1SDavid du Colombier 
853e12c5d1SDavid du Colombier 	case D_REG:
863e12c5d1SDavid du Colombier 		sprint(str, "R%d", a->reg);
873e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
883e12c5d1SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
893e12c5d1SDavid du Colombier 		break;
903e12c5d1SDavid du Colombier 
913e12c5d1SDavid du Colombier 	case D_FREG:
923e12c5d1SDavid du Colombier 		sprint(str, "F%d", a->reg);
933e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
943e12c5d1SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
953e12c5d1SDavid du Colombier 		break;
963e12c5d1SDavid du Colombier 
973e12c5d1SDavid du Colombier 	case D_FCREG:
983e12c5d1SDavid du Colombier 		sprint(str, "FCR%d", a->reg);
993e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1003e12c5d1SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
1013e12c5d1SDavid du Colombier 		break;
1023e12c5d1SDavid du Colombier 
1033e12c5d1SDavid du Colombier 	case D_LO:
1043e12c5d1SDavid du Colombier 		sprint(str, "LO", a->reg);
1053e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1063e12c5d1SDavid du Colombier 			sprint(str, "%N(LO)(REG)", a, a->reg);
1073e12c5d1SDavid du Colombier 		break;
1083e12c5d1SDavid du Colombier 
1093e12c5d1SDavid du Colombier 	case D_HI:
1103e12c5d1SDavid du Colombier 		sprint(str, "HI", a->reg);
1113e12c5d1SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1123e12c5d1SDavid du Colombier 			sprint(str, "%N(HI)(REG)", a, a->reg);
1133e12c5d1SDavid du Colombier 		break;
1143e12c5d1SDavid du Colombier 
1153e12c5d1SDavid du Colombier 	case D_BRANCH:
1163e12c5d1SDavid du Colombier 		sprint(str, "%ld(PC)", a->offset-pc);
1173e12c5d1SDavid du Colombier 		break;
1183e12c5d1SDavid du Colombier 
1193e12c5d1SDavid du Colombier 	case D_FCONST:
120*219b2ee8SDavid du Colombier 		sprint(str, "$%.17e", a->dval);
1213e12c5d1SDavid du Colombier 		break;
1223e12c5d1SDavid du Colombier 
1233e12c5d1SDavid du Colombier 	case D_SCONST:
1243e12c5d1SDavid du Colombier 		sprint(str, "$\"%S\"", a->sval);
1253e12c5d1SDavid du Colombier 		break;
1263e12c5d1SDavid du Colombier 	}
127bd389b36SDavid du Colombier 	strconv(str, fp);
1283e12c5d1SDavid du Colombier 	return sizeof(a);
1293e12c5d1SDavid du Colombier }
1303e12c5d1SDavid du Colombier 
1313e12c5d1SDavid du Colombier int
132bd389b36SDavid du Colombier Sconv(void *o, Fconv *fp)
1333e12c5d1SDavid du Colombier {
1343e12c5d1SDavid du Colombier 	int i, c;
1353e12c5d1SDavid du Colombier 	char str[STRINGSZ], *p, *a;
1363e12c5d1SDavid du Colombier 
1373e12c5d1SDavid du Colombier 	a = *(char**)o;
1383e12c5d1SDavid du Colombier 	p = str;
1393e12c5d1SDavid du Colombier 	for(i=0; i<NSNAME; i++) {
1403e12c5d1SDavid du Colombier 		c = a[i] & 0xff;
1413e12c5d1SDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
1423e12c5d1SDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
1433e12c5d1SDavid du Colombier 		   c >= '0' && c <= '9' ||
1443e12c5d1SDavid du Colombier 		   c == ' ' || c == '%') {
1453e12c5d1SDavid du Colombier 			*p++ = c;
1463e12c5d1SDavid du Colombier 			continue;
1473e12c5d1SDavid du Colombier 		}
1483e12c5d1SDavid du Colombier 		*p++ = '\\';
1493e12c5d1SDavid du Colombier 		switch(c) {
1503e12c5d1SDavid du Colombier 		case 0:
1513e12c5d1SDavid du Colombier 			*p++ = 'z';
1523e12c5d1SDavid du Colombier 			continue;
1533e12c5d1SDavid du Colombier 		case '\\':
1543e12c5d1SDavid du Colombier 		case '"':
1553e12c5d1SDavid du Colombier 			*p++ = c;
1563e12c5d1SDavid du Colombier 			continue;
1573e12c5d1SDavid du Colombier 		case '\n':
1583e12c5d1SDavid du Colombier 			*p++ = 'n';
1593e12c5d1SDavid du Colombier 			continue;
1603e12c5d1SDavid du Colombier 		case '\t':
1613e12c5d1SDavid du Colombier 			*p++ = 't';
1623e12c5d1SDavid du Colombier 			continue;
1633e12c5d1SDavid du Colombier 		case '\r':
1643e12c5d1SDavid du Colombier 			*p++ = 'r';
1653e12c5d1SDavid du Colombier 			continue;
1663e12c5d1SDavid du Colombier 		case '\f':
1673e12c5d1SDavid du Colombier 			*p++ = 'f';
1683e12c5d1SDavid du Colombier 			continue;
1693e12c5d1SDavid du Colombier 		}
1703e12c5d1SDavid du Colombier 		*p++ = (c>>6) + '0';
1713e12c5d1SDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
1723e12c5d1SDavid du Colombier 		*p++ = (c & 7) + '0';
1733e12c5d1SDavid du Colombier 	}
1743e12c5d1SDavid du Colombier 	*p = 0;
175bd389b36SDavid du Colombier 	strconv(str, fp);
1763e12c5d1SDavid du Colombier 	return sizeof(a);
1773e12c5d1SDavid du Colombier }
1783e12c5d1SDavid du Colombier 
1793e12c5d1SDavid du Colombier int
180bd389b36SDavid du Colombier Nconv(void *o, Fconv *fp)
1813e12c5d1SDavid du Colombier {
1823e12c5d1SDavid du Colombier 	char str[STRINGSZ];
1833e12c5d1SDavid du Colombier 	Adr *a;
1843e12c5d1SDavid du Colombier 	Sym *s;
1853e12c5d1SDavid du Colombier 
1863e12c5d1SDavid du Colombier 	a = *(Adr**)o;
1873e12c5d1SDavid du Colombier 	s = a->sym;
1883e12c5d1SDavid du Colombier 	if(s == S) {
1893e12c5d1SDavid du Colombier 		sprint(str, "%ld", a->offset);
1903e12c5d1SDavid du Colombier 		goto out;
1913e12c5d1SDavid du Colombier 	}
1923e12c5d1SDavid du Colombier 	switch(a->name) {
1933e12c5d1SDavid du Colombier 	default:
1943e12c5d1SDavid du Colombier 		sprint(str, "GOK-name(%d)", a->name);
1953e12c5d1SDavid du Colombier 		break;
1963e12c5d1SDavid du Colombier 
1973e12c5d1SDavid du Colombier 	case D_NONE:
1983e12c5d1SDavid du Colombier 		sprint(str, "%ld", a->offset);
1993e12c5d1SDavid du Colombier 		break;
2003e12c5d1SDavid du Colombier 
2013e12c5d1SDavid du Colombier 	case D_EXTERN:
2023e12c5d1SDavid du Colombier 		sprint(str, "%s+%ld(SB)", s->name, a->offset);
2033e12c5d1SDavid du Colombier 		break;
2043e12c5d1SDavid du Colombier 
2053e12c5d1SDavid du Colombier 	case D_STATIC:
2063e12c5d1SDavid du Colombier 		sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
2073e12c5d1SDavid du Colombier 		break;
2083e12c5d1SDavid du Colombier 
2093e12c5d1SDavid du Colombier 	case D_AUTO:
2103e12c5d1SDavid du Colombier 		sprint(str, "%s-%ld(SP)", s->name, -a->offset);
2113e12c5d1SDavid du Colombier 		break;
2123e12c5d1SDavid du Colombier 
2133e12c5d1SDavid du Colombier 	case D_PARAM:
2143e12c5d1SDavid du Colombier 		sprint(str, "%s+%ld(FP)", s->name, a->offset);
2153e12c5d1SDavid du Colombier 		break;
2163e12c5d1SDavid du Colombier 	}
2173e12c5d1SDavid du Colombier out:
218bd389b36SDavid du Colombier 	strconv(str, fp);
2193e12c5d1SDavid du Colombier 	return sizeof(a);
2203e12c5d1SDavid du Colombier }
221