xref: /plan9-contrib/sys/src/cmd/ic/list.c (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1*ce95e1b3SDavid du Colombier #define EXTERN
2*ce95e1b3SDavid du Colombier #include "gc.h"
3*ce95e1b3SDavid du Colombier 
4*ce95e1b3SDavid du Colombier void
listinit(void)5*ce95e1b3SDavid du Colombier listinit(void)
6*ce95e1b3SDavid du Colombier {
7*ce95e1b3SDavid du Colombier 	fmtinstall('A', Aconv);
8*ce95e1b3SDavid du Colombier 	fmtinstall('P', Pconv);
9*ce95e1b3SDavid du Colombier 	fmtinstall('S', Sconv);
10*ce95e1b3SDavid du Colombier 	fmtinstall('N', Nconv);
11*ce95e1b3SDavid du Colombier 	fmtinstall('B', Bconv);
12*ce95e1b3SDavid du Colombier 	fmtinstall('D', Dconv);
13*ce95e1b3SDavid du Colombier }
14*ce95e1b3SDavid du Colombier 
15*ce95e1b3SDavid du Colombier int
Bconv(Fmt * fp)16*ce95e1b3SDavid du Colombier Bconv(Fmt *fp)
17*ce95e1b3SDavid du Colombier {
18*ce95e1b3SDavid du Colombier 	char str[STRINGSZ], ss[STRINGSZ], *s;
19*ce95e1b3SDavid du Colombier 	Bits bits;
20*ce95e1b3SDavid du Colombier 	int i;
21*ce95e1b3SDavid du Colombier 
22*ce95e1b3SDavid du Colombier 	str[0] = 0;
23*ce95e1b3SDavid du Colombier 	bits = va_arg(fp->args, Bits);
24*ce95e1b3SDavid du Colombier 	while(bany(&bits)) {
25*ce95e1b3SDavid du Colombier 		i = bnum(bits);
26*ce95e1b3SDavid du Colombier 		if(str[0])
27*ce95e1b3SDavid du Colombier 			strcat(str, " ");
28*ce95e1b3SDavid du Colombier 		if(var[i].sym == S) {
29*ce95e1b3SDavid du Colombier 			sprint(ss, "$%ld", var[i].offset);
30*ce95e1b3SDavid du Colombier 			s = ss;
31*ce95e1b3SDavid du Colombier 		} else
32*ce95e1b3SDavid du Colombier 			s = var[i].sym->name;
33*ce95e1b3SDavid du Colombier 		if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
34*ce95e1b3SDavid du Colombier 			break;
35*ce95e1b3SDavid du Colombier 		strcat(str, s);
36*ce95e1b3SDavid du Colombier 		bits.b[i/32] &= ~(1L << (i%32));
37*ce95e1b3SDavid du Colombier 	}
38*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
39*ce95e1b3SDavid du Colombier }
40*ce95e1b3SDavid du Colombier 
41*ce95e1b3SDavid du Colombier int
Pconv(Fmt * fp)42*ce95e1b3SDavid du Colombier Pconv(Fmt *fp)
43*ce95e1b3SDavid du Colombier {
44*ce95e1b3SDavid du Colombier 	char str[STRINGSZ];
45*ce95e1b3SDavid du Colombier 	Prog *p;
46*ce95e1b3SDavid du Colombier 	int a;
47*ce95e1b3SDavid du Colombier 
48*ce95e1b3SDavid du Colombier 	p = va_arg(fp->args, Prog*);
49*ce95e1b3SDavid du Colombier 	a = p->as;
50*ce95e1b3SDavid du Colombier 	if(a == ADATA)
51*ce95e1b3SDavid du Colombier 		sprint(str, "	%A	%D/%d,%D", a, &p->from, p->reg, &p->to);
52*ce95e1b3SDavid du Colombier 	else
53*ce95e1b3SDavid du Colombier 	if(p->as == ATEXT)
54*ce95e1b3SDavid du Colombier 		sprint(str, "	%A	%D,%d,%D", a, &p->from, p->reg, &p->to);
55*ce95e1b3SDavid du Colombier 	else
56*ce95e1b3SDavid du Colombier 	if(p->reg == NREG)
57*ce95e1b3SDavid du Colombier 		sprint(str, "	%A	%D,%D", a, &p->from, &p->to);
58*ce95e1b3SDavid du Colombier 	else
59*ce95e1b3SDavid du Colombier 	if(p->from.type != D_FREG)
60*ce95e1b3SDavid du Colombier 		sprint(str, "	%A	%D,R%d,%D", a, &p->from, p->reg, &p->to);
61*ce95e1b3SDavid du Colombier 	else
62*ce95e1b3SDavid du Colombier 		sprint(str, "	%A	%D,F%d,%D", a, &p->from, p->reg, &p->to);
63*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
64*ce95e1b3SDavid du Colombier }
65*ce95e1b3SDavid du Colombier 
66*ce95e1b3SDavid du Colombier int
Aconv(Fmt * fp)67*ce95e1b3SDavid du Colombier Aconv(Fmt *fp)
68*ce95e1b3SDavid du Colombier {
69*ce95e1b3SDavid du Colombier 	char *s;
70*ce95e1b3SDavid du Colombier 	int a;
71*ce95e1b3SDavid du Colombier 
72*ce95e1b3SDavid du Colombier 	a = va_arg(fp->args, int);
73*ce95e1b3SDavid du Colombier 	s = "???";
74*ce95e1b3SDavid du Colombier 	if(a >= AXXX && a < ALAST)
75*ce95e1b3SDavid du Colombier 		s = anames[a];
76*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, s);
77*ce95e1b3SDavid du Colombier }
78*ce95e1b3SDavid du Colombier 
79*ce95e1b3SDavid du Colombier int
Dconv(Fmt * fp)80*ce95e1b3SDavid du Colombier Dconv(Fmt *fp)
81*ce95e1b3SDavid du Colombier {
82*ce95e1b3SDavid du Colombier 	char str[STRINGSZ];
83*ce95e1b3SDavid du Colombier 	Adr *a;
84*ce95e1b3SDavid du Colombier 
85*ce95e1b3SDavid du Colombier 	a = va_arg(fp->args, Adr*);
86*ce95e1b3SDavid du Colombier 	switch(a->type) {
87*ce95e1b3SDavid du Colombier 
88*ce95e1b3SDavid du Colombier 	default:
89*ce95e1b3SDavid du Colombier 		sprint(str, "GOK-type(%d)", a->type);
90*ce95e1b3SDavid du Colombier 		break;
91*ce95e1b3SDavid du Colombier 
92*ce95e1b3SDavid du Colombier 	case D_NONE:
93*ce95e1b3SDavid du Colombier 		str[0] = 0;
94*ce95e1b3SDavid du Colombier 		if(a->name != D_NONE || a->reg != NREG || a->sym != S)
95*ce95e1b3SDavid du Colombier 			sprint(str, "%N(R%d)(NONE)", a, a->reg);
96*ce95e1b3SDavid du Colombier 		break;
97*ce95e1b3SDavid du Colombier 
98*ce95e1b3SDavid du Colombier 	case D_VCONST:
99*ce95e1b3SDavid du Colombier 	case D_CONST:
100*ce95e1b3SDavid du Colombier 		if(a->reg != NREG)
101*ce95e1b3SDavid du Colombier 			sprint(str, "$%N(R%d)", a, a->reg);
102*ce95e1b3SDavid du Colombier 		else
103*ce95e1b3SDavid du Colombier 			sprint(str, "$%N", a);
104*ce95e1b3SDavid du Colombier 		break;
105*ce95e1b3SDavid du Colombier 
106*ce95e1b3SDavid du Colombier 	case D_OREG:
107*ce95e1b3SDavid du Colombier 		if(a->reg != NREG)
108*ce95e1b3SDavid du Colombier 			sprint(str, "%N(R%d)", a, a->reg);
109*ce95e1b3SDavid du Colombier 		else
110*ce95e1b3SDavid du Colombier 			sprint(str, "%N", a);
111*ce95e1b3SDavid du Colombier 		break;
112*ce95e1b3SDavid du Colombier 
113*ce95e1b3SDavid du Colombier 	case D_REG:
114*ce95e1b3SDavid du Colombier 		sprint(str, "R%d", a->reg);
115*ce95e1b3SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
116*ce95e1b3SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
117*ce95e1b3SDavid du Colombier 		break;
118*ce95e1b3SDavid du Colombier 
119*ce95e1b3SDavid du Colombier 	case D_FREG:
120*ce95e1b3SDavid du Colombier 		sprint(str, "F%d", a->reg);
121*ce95e1b3SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
122*ce95e1b3SDavid du Colombier 			sprint(str, "%N(R%d)(FREG)", a, a->reg);
123*ce95e1b3SDavid du Colombier 		break;
124*ce95e1b3SDavid du Colombier 
125*ce95e1b3SDavid du Colombier 	case D_BRANCH:
126*ce95e1b3SDavid du Colombier 		sprint(str, "%ld(PC)", a->offset-pc);
127*ce95e1b3SDavid du Colombier 		break;
128*ce95e1b3SDavid du Colombier 
129*ce95e1b3SDavid du Colombier 	case D_FCONST:
130*ce95e1b3SDavid du Colombier 		sprint(str, "$%.17e", a->dval);
131*ce95e1b3SDavid du Colombier 		break;
132*ce95e1b3SDavid du Colombier 
133*ce95e1b3SDavid du Colombier 	case D_SCONST:
134*ce95e1b3SDavid du Colombier 		sprint(str, "$\"%S\"", a->sval);
135*ce95e1b3SDavid du Colombier 		break;
136*ce95e1b3SDavid du Colombier 	}
137*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
138*ce95e1b3SDavid du Colombier }
139*ce95e1b3SDavid du Colombier 
140*ce95e1b3SDavid du Colombier int
Sconv(Fmt * fp)141*ce95e1b3SDavid du Colombier Sconv(Fmt *fp)
142*ce95e1b3SDavid du Colombier {
143*ce95e1b3SDavid du Colombier 	int i, c;
144*ce95e1b3SDavid du Colombier 	char str[STRINGSZ], *p, *a;
145*ce95e1b3SDavid du Colombier 
146*ce95e1b3SDavid du Colombier 	a = va_arg(fp->args, char*);
147*ce95e1b3SDavid du Colombier 	p = str;
148*ce95e1b3SDavid du Colombier 	for(i=0; i<NSNAME; i++) {
149*ce95e1b3SDavid du Colombier 		c = a[i] & 0xff;
150*ce95e1b3SDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
151*ce95e1b3SDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
152*ce95e1b3SDavid du Colombier 		   c >= '0' && c <= '9' ||
153*ce95e1b3SDavid du Colombier 		   c == ' ' || c == '%') {
154*ce95e1b3SDavid du Colombier 			*p++ = c;
155*ce95e1b3SDavid du Colombier 			continue;
156*ce95e1b3SDavid du Colombier 		}
157*ce95e1b3SDavid du Colombier 		*p++ = '\\';
158*ce95e1b3SDavid du Colombier 		switch(c) {
159*ce95e1b3SDavid du Colombier 		case 0:
160*ce95e1b3SDavid du Colombier 			*p++ = 'z';
161*ce95e1b3SDavid du Colombier 			continue;
162*ce95e1b3SDavid du Colombier 		case '\\':
163*ce95e1b3SDavid du Colombier 		case '"':
164*ce95e1b3SDavid du Colombier 			*p++ = c;
165*ce95e1b3SDavid du Colombier 			continue;
166*ce95e1b3SDavid du Colombier 		case '\n':
167*ce95e1b3SDavid du Colombier 			*p++ = 'n';
168*ce95e1b3SDavid du Colombier 			continue;
169*ce95e1b3SDavid du Colombier 		case '\t':
170*ce95e1b3SDavid du Colombier 			*p++ = 't';
171*ce95e1b3SDavid du Colombier 			continue;
172*ce95e1b3SDavid du Colombier 		case '\r':
173*ce95e1b3SDavid du Colombier 			*p++ = 'r';
174*ce95e1b3SDavid du Colombier 			continue;
175*ce95e1b3SDavid du Colombier 		case '\f':
176*ce95e1b3SDavid du Colombier 			*p++ = 'f';
177*ce95e1b3SDavid du Colombier 			continue;
178*ce95e1b3SDavid du Colombier 		}
179*ce95e1b3SDavid du Colombier 		*p++ = (c>>6) + '0';
180*ce95e1b3SDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
181*ce95e1b3SDavid du Colombier 		*p++ = (c & 7) + '0';
182*ce95e1b3SDavid du Colombier 	}
183*ce95e1b3SDavid du Colombier 	*p = 0;
184*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
185*ce95e1b3SDavid du Colombier }
186*ce95e1b3SDavid du Colombier 
187*ce95e1b3SDavid du Colombier int
Nconv(Fmt * fp)188*ce95e1b3SDavid du Colombier Nconv(Fmt *fp)
189*ce95e1b3SDavid du Colombier {
190*ce95e1b3SDavid du Colombier 	char str[STRINGSZ];
191*ce95e1b3SDavid du Colombier 	Adr *a;
192*ce95e1b3SDavid du Colombier 	Sym *s;
193*ce95e1b3SDavid du Colombier 
194*ce95e1b3SDavid du Colombier 	a = va_arg(fp->args, Adr*);
195*ce95e1b3SDavid du Colombier 	s = a->sym;
196*ce95e1b3SDavid du Colombier 	if(s == S) {
197*ce95e1b3SDavid du Colombier 		if(a->type == D_VCONST)
198*ce95e1b3SDavid du Colombier 			sprint(str, "%lld", *(vlong*)a->sval);
199*ce95e1b3SDavid du Colombier 		else
200*ce95e1b3SDavid du Colombier 			sprint(str, "%ld", a->offset);
201*ce95e1b3SDavid du Colombier 		goto out;
202*ce95e1b3SDavid du Colombier 	}
203*ce95e1b3SDavid du Colombier 	switch(a->name) {
204*ce95e1b3SDavid du Colombier 	default:
205*ce95e1b3SDavid du Colombier 		sprint(str, "GOK-name(%d)", a->name);
206*ce95e1b3SDavid du Colombier 		break;
207*ce95e1b3SDavid du Colombier 
208*ce95e1b3SDavid du Colombier 	case D_NONE:
209*ce95e1b3SDavid du Colombier 		sprint(str, "%ld", a->offset);
210*ce95e1b3SDavid du Colombier 		break;
211*ce95e1b3SDavid du Colombier 
212*ce95e1b3SDavid du Colombier 	case D_EXTERN:
213*ce95e1b3SDavid du Colombier 		sprint(str, "%s+%ld(SB)", s->name, a->offset);
214*ce95e1b3SDavid du Colombier 		break;
215*ce95e1b3SDavid du Colombier 
216*ce95e1b3SDavid du Colombier 	case D_STATIC:
217*ce95e1b3SDavid du Colombier 		sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
218*ce95e1b3SDavid du Colombier 		break;
219*ce95e1b3SDavid du Colombier 
220*ce95e1b3SDavid du Colombier 	case D_AUTO:
221*ce95e1b3SDavid du Colombier 		sprint(str, "%s-%ld(SP)", s->name, -a->offset);
222*ce95e1b3SDavid du Colombier 		break;
223*ce95e1b3SDavid du Colombier 
224*ce95e1b3SDavid du Colombier 	case D_PARAM:
225*ce95e1b3SDavid du Colombier 		sprint(str, "%s+%ld(FP)", s->name, a->offset);
226*ce95e1b3SDavid du Colombier 		break;
227*ce95e1b3SDavid du Colombier 	}
228*ce95e1b3SDavid du Colombier out:
229*ce95e1b3SDavid du Colombier 	return fmtstrcpy(fp, str);
230*ce95e1b3SDavid du Colombier }
231