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, "%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 return fmtstrcpy(fp, str);
155 }
156
157 int
Sconv(Fmt * fp)158 Sconv(Fmt *fp)
159 {
160 int i, c;
161 char str[STRINGSZ], *p, *a;
162
163 a = va_arg(fp->args, char*);
164 p = str;
165 for(i=0; i<NSNAME; i++) {
166 c = a[i] & 0xff;
167 if(c >= 'a' && c <= 'z' ||
168 c >= 'A' && c <= 'Z' ||
169 c >= '0' && c <= '9' ||
170 c == ' ' || c == '%') {
171 *p++ = c;
172 continue;
173 }
174 *p++ = '\\';
175 switch(c) {
176 case 0:
177 *p++ = 'z';
178 continue;
179 case '\\':
180 case '"':
181 *p++ = c;
182 continue;
183 case '\n':
184 *p++ = 'n';
185 continue;
186 case '\t':
187 *p++ = 't';
188 continue;
189 case '\r':
190 *p++ = 'r';
191 continue;
192 case '\f':
193 *p++ = 'f';
194 continue;
195 }
196 *p++ = (c>>6) + '0';
197 *p++ = ((c>>3) & 7) + '0';
198 *p++ = (c & 7) + '0';
199 }
200 *p = 0;
201 return fmtstrcpy(fp, str);
202 }
203
204 int
Nconv(Fmt * fp)205 Nconv(Fmt *fp)
206 {
207 char str[STRINGSZ];
208 Adr *a;
209 Sym *s;
210
211 a = va_arg(fp->args, Adr*);
212 s = a->sym;
213 if(s == S) {
214 sprint(str, "%ld", a->offset);
215 goto out;
216 }
217 switch(a->name) {
218 default:
219 sprint(str, "GOK-name(%d)", a->name);
220 break;
221
222 case D_NONE:
223 sprint(str, "%ld", a->offset);
224 break;
225
226 case D_EXTERN:
227 sprint(str, "%s+%ld(SB)", s->name, a->offset);
228 break;
229
230 case D_STATIC:
231 sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
232 break;
233
234 case D_AUTO:
235 sprint(str, "%s-%ld(SP)", s->name, -a->offset);
236 break;
237
238 case D_PARAM:
239 sprint(str, "%s+%ld(FP)", s->name, a->offset);
240 break;
241 }
242 out:
243 return fmtstrcpy(fp, str);
244 }
245