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