1*ce95e1b3SDavid du Colombier #include "l.h"
2*ce95e1b3SDavid du Colombier
3*ce95e1b3SDavid du Colombier void
listinit(void)4*ce95e1b3SDavid du Colombier listinit(void)
5*ce95e1b3SDavid du Colombier {
6*ce95e1b3SDavid du Colombier
7*ce95e1b3SDavid du Colombier fmtinstall('A', Aconv);
8*ce95e1b3SDavid du Colombier fmtinstall('D', Dconv);
9*ce95e1b3SDavid du Colombier fmtinstall('P', Pconv);
10*ce95e1b3SDavid du Colombier fmtinstall('S', Sconv);
11*ce95e1b3SDavid du Colombier fmtinstall('N', Nconv);
12*ce95e1b3SDavid du Colombier }
13*ce95e1b3SDavid du Colombier
14*ce95e1b3SDavid du Colombier void
prasm(Prog * p)15*ce95e1b3SDavid du Colombier prasm(Prog *p)
16*ce95e1b3SDavid du Colombier {
17*ce95e1b3SDavid du Colombier print("%P\n", p);
18*ce95e1b3SDavid du Colombier }
19*ce95e1b3SDavid du Colombier
20*ce95e1b3SDavid du Colombier int
Pconv(Fmt * fp)21*ce95e1b3SDavid du Colombier Pconv(Fmt *fp)
22*ce95e1b3SDavid du Colombier {
23*ce95e1b3SDavid du Colombier char str[STRINGSZ], *s;
24*ce95e1b3SDavid du Colombier Prog *p;
25*ce95e1b3SDavid du Colombier int a;
26*ce95e1b3SDavid du Colombier
27*ce95e1b3SDavid du Colombier p = va_arg(fp->args, Prog*);
28*ce95e1b3SDavid du Colombier curp = p;
29*ce95e1b3SDavid du Colombier a = p->as;
30*ce95e1b3SDavid du Colombier if(a == ADATA || a == ADYNT || a == AINIT)
31*ce95e1b3SDavid du Colombier sprint(str, "(%ld) %A %D/%d,%D",
32*ce95e1b3SDavid du Colombier p->line, a, &p->from, p->reg, &p->to);
33*ce95e1b3SDavid du Colombier else{
34*ce95e1b3SDavid du Colombier s = str;
35*ce95e1b3SDavid du Colombier s += sprint(s, "(%ld)", p->line);
36*ce95e1b3SDavid du Colombier if(p->reg == NREG)
37*ce95e1b3SDavid du Colombier sprint(s, " %A %D,%D",
38*ce95e1b3SDavid du Colombier a, &p->from, &p->to);
39*ce95e1b3SDavid du Colombier else
40*ce95e1b3SDavid du Colombier if(p->from.type != D_FREG)
41*ce95e1b3SDavid du Colombier sprint(s, " %A %D,R%d,%D",
42*ce95e1b3SDavid du Colombier a, &p->from, p->reg, &p->to);
43*ce95e1b3SDavid du Colombier else
44*ce95e1b3SDavid du Colombier sprint(s, " %A %D,F%d,%D",
45*ce95e1b3SDavid du Colombier a, &p->from, p->reg, &p->to);
46*ce95e1b3SDavid du Colombier }
47*ce95e1b3SDavid du Colombier return fmtstrcpy(fp, str);
48*ce95e1b3SDavid du Colombier }
49*ce95e1b3SDavid du Colombier
50*ce95e1b3SDavid du Colombier int
Aconv(Fmt * fp)51*ce95e1b3SDavid du Colombier Aconv(Fmt *fp)
52*ce95e1b3SDavid du Colombier {
53*ce95e1b3SDavid du Colombier char *s;
54*ce95e1b3SDavid du Colombier int a;
55*ce95e1b3SDavid du Colombier
56*ce95e1b3SDavid du Colombier a = va_arg(fp->args, int);
57*ce95e1b3SDavid du Colombier s = "???";
58*ce95e1b3SDavid du Colombier if(a >= AXXX && a < ALAST)
59*ce95e1b3SDavid du Colombier s = anames[a];
60*ce95e1b3SDavid du Colombier return fmtstrcpy(fp, s);
61*ce95e1b3SDavid du Colombier }
62*ce95e1b3SDavid du Colombier
63*ce95e1b3SDavid du Colombier int
Dconv(Fmt * fp)64*ce95e1b3SDavid du Colombier Dconv(Fmt *fp)
65*ce95e1b3SDavid du Colombier {
66*ce95e1b3SDavid du Colombier char str[STRINGSZ];
67*ce95e1b3SDavid du Colombier Adr *a;
68*ce95e1b3SDavid du Colombier long v;
69*ce95e1b3SDavid du Colombier
70*ce95e1b3SDavid du Colombier a = va_arg(fp->args, Adr*);
71*ce95e1b3SDavid du Colombier switch(a->type) {
72*ce95e1b3SDavid du Colombier
73*ce95e1b3SDavid du Colombier default:
74*ce95e1b3SDavid du Colombier sprint(str, "GOK-type(%d)", a->type);
75*ce95e1b3SDavid du Colombier break;
76*ce95e1b3SDavid du Colombier
77*ce95e1b3SDavid du Colombier case D_NONE:
78*ce95e1b3SDavid du Colombier str[0] = 0;
79*ce95e1b3SDavid du Colombier if(a->name != D_NONE || a->reg != NREG || a->sym != S)
80*ce95e1b3SDavid du Colombier sprint(str, "%N(R%d)(NONE)", a, a->reg);
81*ce95e1b3SDavid du Colombier break;
82*ce95e1b3SDavid du Colombier
83*ce95e1b3SDavid du Colombier case D_CONST:
84*ce95e1b3SDavid du Colombier if(a->reg == NREG)
85*ce95e1b3SDavid du Colombier sprint(str, "$%N", a);
86*ce95e1b3SDavid du Colombier else
87*ce95e1b3SDavid du Colombier sprint(str, "$%N(R%d)", a, a->reg);
88*ce95e1b3SDavid du Colombier break;
89*ce95e1b3SDavid du Colombier
90*ce95e1b3SDavid du Colombier case D_VCONST:
91*ce95e1b3SDavid du Colombier sprint(str, "$%lld", *a->vval);
92*ce95e1b3SDavid du Colombier break;
93*ce95e1b3SDavid du Colombier
94*ce95e1b3SDavid du Colombier case D_OREG:
95*ce95e1b3SDavid du Colombier if(a->reg != NREG)
96*ce95e1b3SDavid du Colombier sprint(str, "%N(R%d)", a, a->reg);
97*ce95e1b3SDavid du Colombier else
98*ce95e1b3SDavid du Colombier sprint(str, "%N", a);
99*ce95e1b3SDavid du Colombier break;
100*ce95e1b3SDavid du Colombier
101*ce95e1b3SDavid du Colombier case D_REG:
102*ce95e1b3SDavid du Colombier sprint(str, "R%d", a->reg);
103*ce95e1b3SDavid du Colombier if(a->name != D_NONE || a->sym != S)
104*ce95e1b3SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
105*ce95e1b3SDavid du Colombier break;
106*ce95e1b3SDavid du Colombier
107*ce95e1b3SDavid du Colombier case D_FREG:
108*ce95e1b3SDavid du Colombier sprint(str, "F%d", a->reg);
109*ce95e1b3SDavid du Colombier if(a->name != D_NONE || a->sym != S)
110*ce95e1b3SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg);
111*ce95e1b3SDavid du Colombier break;
112*ce95e1b3SDavid du Colombier
113*ce95e1b3SDavid du Colombier case D_CTLREG:
114*ce95e1b3SDavid du Colombier sprint(str, "CSR(0x%lx)", a->offset);
115*ce95e1b3SDavid du Colombier break;
116*ce95e1b3SDavid du Colombier
117*ce95e1b3SDavid du Colombier case D_BRANCH: /* botch */
118*ce95e1b3SDavid du Colombier if(curp->cond != P) {
119*ce95e1b3SDavid du Colombier v = curp->cond->pc + INITTEXT;
120*ce95e1b3SDavid du Colombier if(a->sym != S)
121*ce95e1b3SDavid du Colombier sprint(str, "%s+%.5lux(BRANCH)", a->sym->name, v);
122*ce95e1b3SDavid du Colombier else
123*ce95e1b3SDavid du Colombier sprint(str, "%.5lux(BRANCH)", v);
124*ce95e1b3SDavid du Colombier } else
125*ce95e1b3SDavid du Colombier if(a->sym != S)
126*ce95e1b3SDavid du Colombier sprint(str, "%s+%ld(APC)", a->sym->name, a->offset);
127*ce95e1b3SDavid du Colombier else
128*ce95e1b3SDavid du Colombier sprint(str, "%ld(APC)", a->offset);
129*ce95e1b3SDavid du Colombier break;
130*ce95e1b3SDavid du Colombier
131*ce95e1b3SDavid du Colombier case D_FCONST:
132*ce95e1b3SDavid du Colombier sprint(str, "$%e", ieeedtod(a->ieee));
133*ce95e1b3SDavid du Colombier break;
134*ce95e1b3SDavid du Colombier
135*ce95e1b3SDavid du Colombier case D_SCONST:
136*ce95e1b3SDavid du Colombier sprint(str, "$\"%S\"", a->sval);
137*ce95e1b3SDavid du Colombier break;
138*ce95e1b3SDavid du Colombier }
139*ce95e1b3SDavid du Colombier return fmtstrcpy(fp, str);
140*ce95e1b3SDavid du Colombier }
141*ce95e1b3SDavid du Colombier
142*ce95e1b3SDavid du Colombier int
Nconv(Fmt * fp)143*ce95e1b3SDavid du Colombier Nconv(Fmt *fp)
144*ce95e1b3SDavid du Colombier {
145*ce95e1b3SDavid du Colombier char str[STRINGSZ];
146*ce95e1b3SDavid du Colombier Adr *a;
147*ce95e1b3SDavid du Colombier Sym *s;
148*ce95e1b3SDavid du Colombier
149*ce95e1b3SDavid du Colombier a = va_arg(fp->args, Adr*);
150*ce95e1b3SDavid du Colombier s = a->sym;
151*ce95e1b3SDavid du Colombier switch(a->name) {
152*ce95e1b3SDavid du Colombier default:
153*ce95e1b3SDavid du Colombier sprint(str, "GOK-name(%d)", a->name);
154*ce95e1b3SDavid du Colombier break;
155*ce95e1b3SDavid du Colombier
156*ce95e1b3SDavid du Colombier case D_NONE:
157*ce95e1b3SDavid du Colombier sprint(str, "%ld", a->offset);
158*ce95e1b3SDavid du Colombier break;
159*ce95e1b3SDavid du Colombier
160*ce95e1b3SDavid du Colombier case D_EXTERN:
161*ce95e1b3SDavid du Colombier if(s == S)
162*ce95e1b3SDavid du Colombier sprint(str, "%ld(SB)", a->offset);
163*ce95e1b3SDavid du Colombier else
164*ce95e1b3SDavid du Colombier sprint(str, "%s+%ld(SB)", s->name, a->offset);
165*ce95e1b3SDavid du Colombier break;
166*ce95e1b3SDavid du Colombier
167*ce95e1b3SDavid du Colombier case D_STATIC:
168*ce95e1b3SDavid du Colombier if(s == S)
169*ce95e1b3SDavid du Colombier sprint(str, "<>+%ld(SB)", a->offset);
170*ce95e1b3SDavid du Colombier else
171*ce95e1b3SDavid du Colombier sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
172*ce95e1b3SDavid du Colombier break;
173*ce95e1b3SDavid du Colombier
174*ce95e1b3SDavid du Colombier case D_AUTO:
175*ce95e1b3SDavid du Colombier if(s == S)
176*ce95e1b3SDavid du Colombier sprint(str, "%ld(SP)", a->offset);
177*ce95e1b3SDavid du Colombier else
178*ce95e1b3SDavid du Colombier sprint(str, "%s-%ld(SP)", s->name, -a->offset);
179*ce95e1b3SDavid du Colombier break;
180*ce95e1b3SDavid du Colombier
181*ce95e1b3SDavid du Colombier case D_PARAM:
182*ce95e1b3SDavid du Colombier if(s == S)
183*ce95e1b3SDavid du Colombier sprint(str, "%ld(FP)", a->offset);
184*ce95e1b3SDavid du Colombier else
185*ce95e1b3SDavid du Colombier sprint(str, "%s+%ld(FP)", s->name, a->offset);
186*ce95e1b3SDavid du Colombier break;
187*ce95e1b3SDavid du Colombier }
188*ce95e1b3SDavid du Colombier
189*ce95e1b3SDavid du Colombier return fmtstrcpy(fp, str);
190*ce95e1b3SDavid du Colombier }
191*ce95e1b3SDavid du Colombier
192*ce95e1b3SDavid du Colombier int
Sconv(Fmt * fp)193*ce95e1b3SDavid du Colombier Sconv(Fmt *fp)
194*ce95e1b3SDavid du Colombier {
195*ce95e1b3SDavid du Colombier int i, c;
196*ce95e1b3SDavid du Colombier char str[STRINGSZ], *p, *a;
197*ce95e1b3SDavid du Colombier
198*ce95e1b3SDavid du Colombier a = va_arg(fp->args, char*);
199*ce95e1b3SDavid du Colombier p = str;
200*ce95e1b3SDavid du Colombier for(i=0; i<sizeof(long); i++) {
201*ce95e1b3SDavid du Colombier c = a[i] & 0xff;
202*ce95e1b3SDavid du Colombier if(c >= 'a' && c <= 'z' ||
203*ce95e1b3SDavid du Colombier c >= 'A' && c <= 'Z' ||
204*ce95e1b3SDavid du Colombier c >= '0' && c <= '9' ||
205*ce95e1b3SDavid du Colombier c == ' ' || c == '%') {
206*ce95e1b3SDavid du Colombier *p++ = c;
207*ce95e1b3SDavid du Colombier continue;
208*ce95e1b3SDavid du Colombier }
209*ce95e1b3SDavid du Colombier *p++ = '\\';
210*ce95e1b3SDavid du Colombier switch(c) {
211*ce95e1b3SDavid du Colombier case 0:
212*ce95e1b3SDavid du Colombier *p++ = 'z';
213*ce95e1b3SDavid du Colombier continue;
214*ce95e1b3SDavid du Colombier case '\\':
215*ce95e1b3SDavid du Colombier case '"':
216*ce95e1b3SDavid du Colombier *p++ = c;
217*ce95e1b3SDavid du Colombier continue;
218*ce95e1b3SDavid du Colombier case '\n':
219*ce95e1b3SDavid du Colombier *p++ = 'n';
220*ce95e1b3SDavid du Colombier continue;
221*ce95e1b3SDavid du Colombier case '\t':
222*ce95e1b3SDavid du Colombier *p++ = 't';
223*ce95e1b3SDavid du Colombier continue;
224*ce95e1b3SDavid du Colombier }
225*ce95e1b3SDavid du Colombier *p++ = (c>>6) + '0';
226*ce95e1b3SDavid du Colombier *p++ = ((c>>3) & 7) + '0';
227*ce95e1b3SDavid du Colombier *p++ = (c & 7) + '0';
228*ce95e1b3SDavid du Colombier }
229*ce95e1b3SDavid du Colombier *p = 0;
230*ce95e1b3SDavid du Colombier return fmtstrcpy(fp, str);
231*ce95e1b3SDavid du Colombier }
232*ce95e1b3SDavid du Colombier
233*ce95e1b3SDavid du Colombier void
diag(char * fmt,...)234*ce95e1b3SDavid du Colombier diag(char *fmt, ...)
235*ce95e1b3SDavid du Colombier {
236*ce95e1b3SDavid du Colombier char buf[STRINGSZ], *tn;
237*ce95e1b3SDavid du Colombier va_list arg;
238*ce95e1b3SDavid du Colombier
239*ce95e1b3SDavid du Colombier tn = "??none??";
240*ce95e1b3SDavid du Colombier if(curtext != P && curtext->from.sym != S)
241*ce95e1b3SDavid du Colombier tn = curtext->from.sym->name;
242*ce95e1b3SDavid du Colombier va_start(arg, fmt);
243*ce95e1b3SDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg);
244*ce95e1b3SDavid du Colombier va_end(arg);
245*ce95e1b3SDavid du Colombier print("%s: %s\n", tn, buf);
246*ce95e1b3SDavid du Colombier
247*ce95e1b3SDavid du Colombier nerrors++;
248*ce95e1b3SDavid du Colombier if(nerrors > 10) {
249*ce95e1b3SDavid du Colombier print("too many errors\n");
250*ce95e1b3SDavid du Colombier errorexit();
251*ce95e1b3SDavid du Colombier }
252*ce95e1b3SDavid du Colombier }
253