1 #define EXTERN
2 #include "gc.h"
3
4 void
listinit(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
Bconv(Fmt * fp)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
Pconv(Fmt * fp)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->as == ATEXT)
54 sprint(str, " %A %D,%d,%D", a, &p->from, p->reg, &p->to);
55 else
56 if(p->reg == NREG)
57 sprint(str, " %A %D,%D", a, &p->from, &p->to);
58 else
59 if(p->from.type != D_FREG)
60 sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to);
61 else
62 sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to);
63 return fmtstrcpy(fp, str);
64 }
65
66 int
Aconv(Fmt * fp)67 Aconv(Fmt *fp)
68 {
69 char *s;
70 int a;
71
72 a = va_arg(fp->args, int);
73 s = "???";
74 if(a >= AXXX && a < ALAST)
75 s = anames[a];
76 return fmtstrcpy(fp, s);
77 }
78
79 int
Dconv(Fmt * fp)80 Dconv(Fmt *fp)
81 {
82 char str[STRINGSZ];
83 Adr *a;
84
85 a = va_arg(fp->args, 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, "%lld(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 case D_VCONST:
155 sprint(str, "$0x%llux", a->offset);
156 break;
157 }
158 return fmtstrcpy(fp, str);
159 }
160
161 int
Sconv(Fmt * fp)162 Sconv(Fmt *fp)
163 {
164 int i, c;
165 char str[STRINGSZ], *p, *a;
166
167 a = va_arg(fp->args, char*);
168 p = str;
169 for(i=0; i<NSNAME; i++) {
170 c = a[i] & 0xff;
171 if(c >= 'a' && c <= 'z' ||
172 c >= 'A' && c <= 'Z' ||
173 c >= '0' && c <= '9' ||
174 c == ' ' || c == '%') {
175 *p++ = c;
176 continue;
177 }
178 *p++ = '\\';
179 switch(c) {
180 case 0:
181 *p++ = 'z';
182 continue;
183 case '\\':
184 case '"':
185 *p++ = c;
186 continue;
187 case '\n':
188 *p++ = 'n';
189 continue;
190 case '\t':
191 *p++ = 't';
192 continue;
193 case '\r':
194 *p++ = 'r';
195 continue;
196 case '\f':
197 *p++ = 'f';
198 continue;
199 }
200 *p++ = (c>>6) + '0';
201 *p++ = ((c>>3) & 7) + '0';
202 *p++ = (c & 7) + '0';
203 }
204 *p = 0;
205 return fmtstrcpy(fp, str);
206 }
207
208 int
Nconv(Fmt * fp)209 Nconv(Fmt *fp)
210 {
211 char str[STRINGSZ];
212 Adr *a;
213 Sym *s;
214
215 a = va_arg(fp->args, Adr*);
216 s = a->sym;
217 if(s == S) {
218 sprint(str, "%lld", a->offset);
219 goto out;
220 }
221 switch(a->name) {
222 default:
223 sprint(str, "GOK-name(%d)", a->name);
224 break;
225
226 case D_NONE:
227 sprint(str, "%lld", a->offset);
228 break;
229
230 case D_EXTERN:
231 sprint(str, "%s+%lld(SB)", s->name, a->offset);
232 break;
233
234 case D_STATIC:
235 sprint(str, "%s<>+%lld(SB)", s->name, a->offset);
236 break;
237
238 case D_AUTO:
239 sprint(str, "%s-%lld(SP)", s->name, -a->offset);
240 break;
241
242 case D_PARAM:
243 sprint(str, "%s+%lld(FP)", s->name, a->offset);
244 break;
245 }
246 out:
247 return fmtstrcpy(fp, str);
248 }
249