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