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_VCONST:
99 case D_CONST:
100 if(a->reg != NREG)
101 sprint(str, "$%N(R%d)", a, a->reg);
102 else
103 sprint(str, "$%N", a);
104 break;
105
106 case D_OREG:
107 if(a->reg != NREG)
108 sprint(str, "%N(R%d)", a, a->reg);
109 else
110 sprint(str, "%N", a);
111 break;
112
113 case D_REG:
114 sprint(str, "R%d", a->reg);
115 if(a->name != D_NONE || a->sym != S)
116 sprint(str, "%N(R%d)(REG)", a, a->reg);
117 break;
118
119 case D_FREG:
120 sprint(str, "F%d", a->reg);
121 if(a->name != D_NONE || a->sym != S)
122 sprint(str, "%N(R%d)(FREG)", a, a->reg);
123 break;
124
125 case D_BRANCH:
126 sprint(str, "%ld(PC)", a->offset-pc);
127 break;
128
129 case D_FCONST:
130 sprint(str, "$%.17e", a->dval);
131 break;
132
133 case D_SCONST:
134 sprint(str, "$\"%S\"", a->sval);
135 break;
136 }
137 return fmtstrcpy(fp, str);
138 }
139
140 int
Sconv(Fmt * fp)141 Sconv(Fmt *fp)
142 {
143 int i, c;
144 char str[STRINGSZ], *p, *a;
145
146 a = va_arg(fp->args, char*);
147 p = str;
148 for(i=0; i<NSNAME; i++) {
149 c = a[i] & 0xff;
150 if(c >= 'a' && c <= 'z' ||
151 c >= 'A' && c <= 'Z' ||
152 c >= '0' && c <= '9' ||
153 c == ' ' || c == '%') {
154 *p++ = c;
155 continue;
156 }
157 *p++ = '\\';
158 switch(c) {
159 case 0:
160 *p++ = 'z';
161 continue;
162 case '\\':
163 case '"':
164 *p++ = c;
165 continue;
166 case '\n':
167 *p++ = 'n';
168 continue;
169 case '\t':
170 *p++ = 't';
171 continue;
172 case '\r':
173 *p++ = 'r';
174 continue;
175 case '\f':
176 *p++ = 'f';
177 continue;
178 }
179 *p++ = (c>>6) + '0';
180 *p++ = ((c>>3) & 7) + '0';
181 *p++ = (c & 7) + '0';
182 }
183 *p = 0;
184 return fmtstrcpy(fp, str);
185 }
186
187 int
Nconv(Fmt * fp)188 Nconv(Fmt *fp)
189 {
190 char str[STRINGSZ];
191 Adr *a;
192 Sym *s;
193
194 a = va_arg(fp->args, Adr*);
195 s = a->sym;
196 if(s == S) {
197 if(a->type == D_VCONST)
198 sprint(str, "%lld", *(vlong*)a->sval);
199 else
200 sprint(str, "%ld", a->offset);
201 goto out;
202 }
203 switch(a->name) {
204 default:
205 sprint(str, "GOK-name(%d)", a->name);
206 break;
207
208 case D_NONE:
209 sprint(str, "%ld", a->offset);
210 break;
211
212 case D_EXTERN:
213 sprint(str, "%s+%ld(SB)", s->name, a->offset);
214 break;
215
216 case D_STATIC:
217 sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
218 break;
219
220 case D_AUTO:
221 sprint(str, "%s-%ld(SP)", s->name, -a->offset);
222 break;
223
224 case D_PARAM:
225 sprint(str, "%s+%ld(FP)", s->name, a->offset);
226 break;
227 }
228 out:
229 return fmtstrcpy(fp, str);
230 }
231