xref: /plan9/sys/src/cmd/qc/list.c (revision 6891d8578618fb7ccda4a131c122d4d0e6580c4b)
17dd7cddfSDavid du Colombier #define EXTERN
27dd7cddfSDavid du Colombier #include "gc.h"
37dd7cddfSDavid du Colombier 
47dd7cddfSDavid du Colombier void
listinit(void)57dd7cddfSDavid du Colombier listinit(void)
67dd7cddfSDavid du Colombier {
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier 	fmtinstall('A', Aconv);
97dd7cddfSDavid du Colombier 	fmtinstall('P', Pconv);
107dd7cddfSDavid du Colombier 	fmtinstall('S', Sconv);
117dd7cddfSDavid du Colombier 	fmtinstall('N', Nconv);
127dd7cddfSDavid du Colombier 	fmtinstall('D', Dconv);
137dd7cddfSDavid du Colombier 	fmtinstall('B', Bconv);
147dd7cddfSDavid du Colombier }
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier int
Bconv(Fmt * fp)179a747e4fSDavid du Colombier Bconv(Fmt *fp)
187dd7cddfSDavid du Colombier {
197dd7cddfSDavid du Colombier 	char str[STRINGSZ], ss[STRINGSZ], *s;
207dd7cddfSDavid du Colombier 	Bits bits;
217dd7cddfSDavid du Colombier 	int i;
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier 	str[0] = 0;
249a747e4fSDavid du Colombier 	bits = va_arg(fp->args, Bits);
257dd7cddfSDavid du Colombier 	while(bany(&bits)) {
267dd7cddfSDavid du Colombier 		i = bnum(bits);
277dd7cddfSDavid du Colombier 		if(str[0])
287dd7cddfSDavid du Colombier 			strcat(str, " ");
297dd7cddfSDavid du Colombier 		if(var[i].sym == S) {
307dd7cddfSDavid du Colombier 			sprint(ss, "$%ld", var[i].offset);
317dd7cddfSDavid du Colombier 			s = ss;
327dd7cddfSDavid du Colombier 		} else
337dd7cddfSDavid du Colombier 			s = var[i].sym->name;
347dd7cddfSDavid du Colombier 		if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
357dd7cddfSDavid du Colombier 			break;
367dd7cddfSDavid du Colombier 		strcat(str, s);
377dd7cddfSDavid du Colombier 		bits.b[i/32] &= ~(1L << (i%32));
387dd7cddfSDavid du Colombier 	}
399a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
407dd7cddfSDavid du Colombier }
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier int
Pconv(Fmt * fp)439a747e4fSDavid du Colombier Pconv(Fmt *fp)
447dd7cddfSDavid du Colombier {
45*6891d857SDavid du Colombier 	char str[STRINGSZ], *s;
467dd7cddfSDavid du Colombier 	Prog *p;
477dd7cddfSDavid du Colombier 	int a;
487dd7cddfSDavid du Colombier 
499a747e4fSDavid du Colombier 	p = va_arg(fp->args, Prog*);
507dd7cddfSDavid du Colombier 	a = p->as;
517dd7cddfSDavid du Colombier 	if(a == ADATA)
527dd7cddfSDavid du Colombier 		sprint(str, "	%A	%D/%d,%D", a, &p->from, p->reg, &p->to);
53*6891d857SDavid du Colombier 	else if(p->as == ATEXT)
54e288d156SDavid du Colombier 		sprint(str, "	%A	%D,%d,%D", a, &p->from, p->reg, &p->to);
55*6891d857SDavid du Colombier 	else {
56*6891d857SDavid du Colombier 		s = seprint(str, str+sizeof(str), "	%A	%D", a, &p->from);
57*6891d857SDavid du Colombier 		if(p->reg != NREG)
58*6891d857SDavid du Colombier 			s = seprint(s, str+sizeof(str), ",%c%d", p->from.type==D_FREG? 'F': 'R', p->reg);
59*6891d857SDavid du Colombier 		if(p->from3.type != D_NONE)
60*6891d857SDavid du Colombier 			s = seprint(s, str+sizeof(str), ",%D", &p->from3);
61*6891d857SDavid du Colombier 		seprint(s, s+sizeof(str), ",%D", &p->to);
62*6891d857SDavid du Colombier 	}
639a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
647dd7cddfSDavid du Colombier }
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier int
Aconv(Fmt * fp)679a747e4fSDavid du Colombier Aconv(Fmt *fp)
687dd7cddfSDavid du Colombier {
697dd7cddfSDavid du Colombier 	char *s;
707dd7cddfSDavid du Colombier 	int a;
717dd7cddfSDavid du Colombier 
729a747e4fSDavid du Colombier 	a = va_arg(fp->args, int);
737dd7cddfSDavid du Colombier 	s = "???";
74*6891d857SDavid du Colombier 	if(a >= AXXX && a <= ALAST)
757dd7cddfSDavid du Colombier 		s = anames[a];
769a747e4fSDavid du Colombier 	return fmtstrcpy(fp, s);
777dd7cddfSDavid du Colombier }
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier int
Dconv(Fmt * fp)809a747e4fSDavid du Colombier Dconv(Fmt *fp)
817dd7cddfSDavid du Colombier {
827dd7cddfSDavid du Colombier 	char str[STRINGSZ];
837dd7cddfSDavid du Colombier 	Adr *a;
847dd7cddfSDavid du Colombier 
859a747e4fSDavid du Colombier 	a = va_arg(fp->args, Adr*);
867dd7cddfSDavid du Colombier 	switch(a->type) {
877dd7cddfSDavid du Colombier 
887dd7cddfSDavid du Colombier 	default:
897dd7cddfSDavid du Colombier 		sprint(str, "GOK-type(%d)", a->type);
907dd7cddfSDavid du Colombier 		break;
917dd7cddfSDavid du Colombier 
927dd7cddfSDavid du Colombier 	case D_NONE:
937dd7cddfSDavid du Colombier 		str[0] = 0;
947dd7cddfSDavid du Colombier 		if(a->name != D_NONE || a->reg != NREG || a->sym != S)
957dd7cddfSDavid du Colombier 			sprint(str, "%N(R%d)(NONE)", a, a->reg);
967dd7cddfSDavid du Colombier 		break;
977dd7cddfSDavid du Colombier 
987dd7cddfSDavid du Colombier 	case D_CONST:
997dd7cddfSDavid du Colombier 		if(a->reg != NREG)
1007dd7cddfSDavid du Colombier 			sprint(str, "$%N(R%d)", a, a->reg);
1017dd7cddfSDavid du Colombier 		else
1027dd7cddfSDavid du Colombier 			sprint(str, "$%N", a);
1037dd7cddfSDavid du Colombier 		break;
1047dd7cddfSDavid du Colombier 
1057dd7cddfSDavid du Colombier 	case D_OREG:
1067dd7cddfSDavid du Colombier 		if(a->reg != NREG)
1077dd7cddfSDavid du Colombier 			sprint(str, "%N(R%d)", a, a->reg);
1087dd7cddfSDavid du Colombier 		else
1097dd7cddfSDavid du Colombier 			sprint(str, "%N", a);
1107dd7cddfSDavid du Colombier 		break;
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier 	case D_REG:
1137dd7cddfSDavid du Colombier 		sprint(str, "R%d", a->reg);
1147dd7cddfSDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1157dd7cddfSDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
1167dd7cddfSDavid du Colombier 		break;
1177dd7cddfSDavid du Colombier 
1187dd7cddfSDavid du Colombier 	case D_FREG:
1197dd7cddfSDavid du Colombier 		sprint(str, "F%d", a->reg);
1207dd7cddfSDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1217dd7cddfSDavid du Colombier 			sprint(str, "%N(F%d)(REG)", a, a->reg);
1227dd7cddfSDavid du Colombier 		break;
1237dd7cddfSDavid du Colombier 
1247dd7cddfSDavid du Colombier 	case D_CREG:
1257dd7cddfSDavid du Colombier 		sprint(str, "C%d", a->reg);
1267dd7cddfSDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1277dd7cddfSDavid du Colombier 			sprint(str, "%N(C%d)(REG)", a, a->reg);
1287dd7cddfSDavid du Colombier 		break;
1297dd7cddfSDavid du Colombier 
1307dd7cddfSDavid du Colombier 	case D_BRANCH:
1317dd7cddfSDavid du Colombier 		sprint(str, "%ld(PC)", a->offset-pc);
1327dd7cddfSDavid du Colombier 		break;
1337dd7cddfSDavid du Colombier 
1347dd7cddfSDavid du Colombier 	case D_FCONST:
1357dd7cddfSDavid du Colombier 		sprint(str, "$%.17e", a->dval);
1367dd7cddfSDavid du Colombier 		break;
1377dd7cddfSDavid du Colombier 
1387dd7cddfSDavid du Colombier 	case D_SCONST:
1397dd7cddfSDavid du Colombier 		sprint(str, "$\"%S\"", a->sval);
1407dd7cddfSDavid du Colombier 		break;
1417dd7cddfSDavid du Colombier 	}
1429a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
1437dd7cddfSDavid du Colombier }
1447dd7cddfSDavid du Colombier 
1457dd7cddfSDavid du Colombier int
Sconv(Fmt * fp)1469a747e4fSDavid du Colombier Sconv(Fmt *fp)
1477dd7cddfSDavid du Colombier {
1487dd7cddfSDavid du Colombier 	int i, c;
1497dd7cddfSDavid du Colombier 	char str[STRINGSZ], *p, *a;
1507dd7cddfSDavid du Colombier 
1519a747e4fSDavid du Colombier 	a = va_arg(fp->args, char*);
1527dd7cddfSDavid du Colombier 	p = str;
1537dd7cddfSDavid du Colombier 	for(i=0; i<NSNAME; i++) {
1547dd7cddfSDavid du Colombier 		c = a[i] & 0xff;
1557dd7cddfSDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
1567dd7cddfSDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
1577dd7cddfSDavid du Colombier 		   c >= '0' && c <= '9' ||
1587dd7cddfSDavid du Colombier 		   c == ' ' || c == '%') {
1597dd7cddfSDavid du Colombier 			*p++ = c;
1607dd7cddfSDavid du Colombier 			continue;
1617dd7cddfSDavid du Colombier 		}
1627dd7cddfSDavid du Colombier 		*p++ = '\\';
1637dd7cddfSDavid du Colombier 		switch(c) {
1647dd7cddfSDavid du Colombier 		case 0:
1657dd7cddfSDavid du Colombier 			*p++ = 'z';
1667dd7cddfSDavid du Colombier 			continue;
1677dd7cddfSDavid du Colombier 		case '\\':
1687dd7cddfSDavid du Colombier 		case '"':
1697dd7cddfSDavid du Colombier 			*p++ = c;
1707dd7cddfSDavid du Colombier 			continue;
1717dd7cddfSDavid du Colombier 		case '\n':
1727dd7cddfSDavid du Colombier 			*p++ = 'n';
1737dd7cddfSDavid du Colombier 			continue;
1747dd7cddfSDavid du Colombier 		case '\t':
1757dd7cddfSDavid du Colombier 			*p++ = 't';
1767dd7cddfSDavid du Colombier 			continue;
1777dd7cddfSDavid du Colombier 		case '\r':
1787dd7cddfSDavid du Colombier 			*p++ = 'r';
1797dd7cddfSDavid du Colombier 			continue;
1807dd7cddfSDavid du Colombier 		case '\f':
1817dd7cddfSDavid du Colombier 			*p++ = 'f';
1827dd7cddfSDavid du Colombier 			continue;
1837dd7cddfSDavid du Colombier 		}
1847dd7cddfSDavid du Colombier 		*p++ = (c>>6) + '0';
1857dd7cddfSDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
1867dd7cddfSDavid du Colombier 		*p++ = (c & 7) + '0';
1877dd7cddfSDavid du Colombier 	}
1887dd7cddfSDavid du Colombier 	*p = 0;
1899a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
1907dd7cddfSDavid du Colombier }
1917dd7cddfSDavid du Colombier 
1927dd7cddfSDavid du Colombier int
Nconv(Fmt * fp)1939a747e4fSDavid du Colombier Nconv(Fmt *fp)
1947dd7cddfSDavid du Colombier {
1957dd7cddfSDavid du Colombier 	char str[STRINGSZ];
1967dd7cddfSDavid du Colombier 	Adr *a;
1977dd7cddfSDavid du Colombier 	Sym *s;
198*6891d857SDavid du Colombier 	int i, l, b, n;
1997dd7cddfSDavid du Colombier 
2009a747e4fSDavid du Colombier 	a = va_arg(fp->args, Adr*);
2017dd7cddfSDavid du Colombier 	s = a->sym;
2027dd7cddfSDavid du Colombier 	if(s == S) {
203*6891d857SDavid du Colombier 		if(a->offset > 64 || -a->offset > 64) {
204*6891d857SDavid du Colombier 			n = 0;
205*6891d857SDavid du Colombier 			l = a->offset & 1;
206*6891d857SDavid du Colombier 			for(i=0; i<32; i++){
207*6891d857SDavid du Colombier 				b = (a->offset >> i) & 1;
208*6891d857SDavid du Colombier 				if(b != l)
209*6891d857SDavid du Colombier 					n++;
210*6891d857SDavid du Colombier 				l = b;
211*6891d857SDavid du Colombier 			}
212*6891d857SDavid du Colombier 			if(n < 2) {
213*6891d857SDavid du Colombier 				sprint(str, "%#lux", a->offset);
214*6891d857SDavid du Colombier 				goto out;
215*6891d857SDavid du Colombier 			}
216*6891d857SDavid du Colombier 		}
2177dd7cddfSDavid du Colombier 		sprint(str, "%ld", a->offset);
2187dd7cddfSDavid du Colombier 		goto out;
2197dd7cddfSDavid du Colombier 	}
2207dd7cddfSDavid du Colombier 	switch(a->name) {
2217dd7cddfSDavid du Colombier 	default:
2227dd7cddfSDavid du Colombier 		sprint(str, "GOK-name(%d)", a->name);
2237dd7cddfSDavid du Colombier 		break;
2247dd7cddfSDavid du Colombier 
2257dd7cddfSDavid du Colombier 	case D_EXTERN:
2267dd7cddfSDavid du Colombier 		sprint(str, "%s+%ld(SB)", s->name, a->offset);
2277dd7cddfSDavid du Colombier 		break;
2287dd7cddfSDavid du Colombier 
2297dd7cddfSDavid du Colombier 	case D_STATIC:
2307dd7cddfSDavid du Colombier 		sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
2317dd7cddfSDavid du Colombier 		break;
2327dd7cddfSDavid du Colombier 
2337dd7cddfSDavid du Colombier 	case D_AUTO:
2347dd7cddfSDavid du Colombier 		sprint(str, "%s-%ld(SP)", s->name, -a->offset);
2357dd7cddfSDavid du Colombier 		break;
2367dd7cddfSDavid du Colombier 
2377dd7cddfSDavid du Colombier 	case D_PARAM:
2387dd7cddfSDavid du Colombier 		sprint(str, "%s+%ld(FP)", s->name, a->offset);
2397dd7cddfSDavid du Colombier 		break;
2407dd7cddfSDavid du Colombier 	}
2417dd7cddfSDavid du Colombier out:
2429a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
2437dd7cddfSDavid du Colombier }
244