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