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