1 564ca709 2004-04-19 devnull #include <u.h>
2 564ca709 2004-04-19 devnull #include <libc.h>
3 564ca709 2004-04-19 devnull #include <bio.h>
4 564ca709 2004-04-19 devnull #include <ctype.h>
5 564ca709 2004-04-19 devnull #include <mach.h>
6 564ca709 2004-04-19 devnull #define Extern extern
7 564ca709 2004-04-19 devnull #include "acid.h"
9 564ca709 2004-04-19 devnull static List **tail;
12 564ca709 2004-04-19 devnull construct(Node *l)
14 564ca709 2004-04-19 devnull List *lh, **save;
16 564ca709 2004-04-19 devnull save = tail;
18 564ca709 2004-04-19 devnull tail = &lh;
19 564ca709 2004-04-19 devnull build(l);
20 564ca709 2004-04-19 devnull tail = save;
22 564ca709 2004-04-19 devnull return lh;
26 564ca709 2004-04-19 devnull listlen(List *l)
31 564ca709 2004-04-19 devnull while(l) {
33 564ca709 2004-04-19 devnull l = l->next;
35 564ca709 2004-04-19 devnull return len;
39 564ca709 2004-04-19 devnull build(Node *n)
42 564ca709 2004-04-19 devnull Node res;
44 564ca709 2004-04-19 devnull if(n == 0)
47 564ca709 2004-04-19 devnull switch(n->op) {
48 564ca709 2004-04-19 devnull case OLIST:
49 564ca709 2004-04-19 devnull build(n->left);
50 564ca709 2004-04-19 devnull build(n->right);
53 564ca709 2004-04-19 devnull expr(n, &res);
54 564ca709 2004-04-19 devnull l = al(res.type);
55 564ca709 2004-04-19 devnull l->store = res.store;
56 564ca709 2004-04-19 devnull *tail = l;
57 564ca709 2004-04-19 devnull tail = &l->next;
62 564ca709 2004-04-19 devnull addlist(List *l, List *r)
66 564ca709 2004-04-19 devnull if(l == 0)
67 564ca709 2004-04-19 devnull return r;
69 564ca709 2004-04-19 devnull for(f = l; f->next; f = f->next)
71 564ca709 2004-04-19 devnull f->next = r;
73 564ca709 2004-04-19 devnull return l;
77 564ca709 2004-04-19 devnull append(Node *r, Node *list, Node *val)
79 564ca709 2004-04-19 devnull List *l, *f;
81 564ca709 2004-04-19 devnull l = al(val->type);
82 564ca709 2004-04-19 devnull l->store = val->store;
83 564ca709 2004-04-19 devnull l->next = 0;
85 564ca709 2004-04-19 devnull r->op = OCONST;
86 564ca709 2004-04-19 devnull r->type = TLIST;
88 564ca709 2004-04-19 devnull if(list->store.u.l == 0) {
89 564ca709 2004-04-19 devnull list->store.u.l = l;
90 564ca709 2004-04-19 devnull r->store.u.l = l;
93 564ca709 2004-04-19 devnull for(f = list->store.u.l; f->next; f = f->next)
95 564ca709 2004-04-19 devnull f->next = l;
96 564ca709 2004-04-19 devnull r->store.u.l = list->store.u.l;
100 564ca709 2004-04-19 devnull listcmp(List *l, List *r)
102 564ca709 2004-04-19 devnull if(l == r)
103 564ca709 2004-04-19 devnull return 1;
105 564ca709 2004-04-19 devnull while(l) {
106 564ca709 2004-04-19 devnull if(r == 0)
107 564ca709 2004-04-19 devnull return 0;
108 564ca709 2004-04-19 devnull if(l->type != r->type)
109 564ca709 2004-04-19 devnull return 0;
110 564ca709 2004-04-19 devnull switch(l->type) {
111 564ca709 2004-04-19 devnull case TINT:
112 564ca709 2004-04-19 devnull if(l->store.u.ival != r->store.u.ival)
113 564ca709 2004-04-19 devnull return 0;
115 564ca709 2004-04-19 devnull case TFLOAT:
116 564ca709 2004-04-19 devnull if(l->store.u.fval != r->store.u.fval)
117 564ca709 2004-04-19 devnull return 0;
119 564ca709 2004-04-19 devnull case TSTRING:
120 564ca709 2004-04-19 devnull if(scmp(l->store.u.string, r->store.u.string) == 0)
121 564ca709 2004-04-19 devnull return 0;
123 564ca709 2004-04-19 devnull case TLIST:
124 564ca709 2004-04-19 devnull if(listcmp(l->store.u.l, r->store.u.l) == 0)
125 564ca709 2004-04-19 devnull return 0;
128 564ca709 2004-04-19 devnull l = l->next;
129 564ca709 2004-04-19 devnull r = r->next;
131 564ca709 2004-04-19 devnull if(l != r)
132 564ca709 2004-04-19 devnull return 0;
133 564ca709 2004-04-19 devnull return 1;
137 564ca709 2004-04-19 devnull nthelem(List *l, int n, Node *res)
139 564ca709 2004-04-19 devnull if(n < 0)
140 564ca709 2004-04-19 devnull error("negative index in []");
142 564ca709 2004-04-19 devnull while(l && n--)
143 564ca709 2004-04-19 devnull l = l->next;
145 564ca709 2004-04-19 devnull res->op = OCONST;
146 564ca709 2004-04-19 devnull if(l == 0) {
147 564ca709 2004-04-19 devnull res->type = TLIST;
148 564ca709 2004-04-19 devnull res->store.u.l = 0;
151 564ca709 2004-04-19 devnull res->type = l->type;
152 564ca709 2004-04-19 devnull res->store = l->store;
156 564ca709 2004-04-19 devnull delete(List *l, int n, Node *res)
158 564ca709 2004-04-19 devnull List **tl;
160 564ca709 2004-04-19 devnull if(n < 0)
161 564ca709 2004-04-19 devnull error("negative index in delete");
163 564ca709 2004-04-19 devnull res->op = OCONST;
164 564ca709 2004-04-19 devnull res->type = TLIST;
165 564ca709 2004-04-19 devnull res->store.u.l = l;
167 564ca709 2004-04-19 devnull for(tl = &res->store.u.l; l && n--; l = l->next)
168 564ca709 2004-04-19 devnull tl = &l->next;
170 564ca709 2004-04-19 devnull if(l == 0)
171 564ca709 2004-04-19 devnull error("element beyond end of list");
172 564ca709 2004-04-19 devnull *tl = l->next;
176 564ca709 2004-04-19 devnull listvar(char *s, long v)
178 564ca709 2004-04-19 devnull List *l, *tl;
180 564ca709 2004-04-19 devnull tl = al(TLIST);
182 564ca709 2004-04-19 devnull l = al(TSTRING);
183 564ca709 2004-04-19 devnull tl->store.u.l = l;
184 564ca709 2004-04-19 devnull l->store.fmt = 's';
185 564ca709 2004-04-19 devnull l->store.u.string = strnode(s);
186 564ca709 2004-04-19 devnull l->next = al(TINT);
187 564ca709 2004-04-19 devnull l = l->next;
188 564ca709 2004-04-19 devnull l->store.fmt = 'X';
189 564ca709 2004-04-19 devnull l->store.u.ival = v;
191 564ca709 2004-04-19 devnull return tl;
194 4a64a77b 2004-04-21 devnull static List*
195 4a64a77b 2004-04-21 devnull listregisters(Map *map, Regs *regs)
197 4a64a77b 2004-04-21 devnull List **tail, *l2, *l;
198 4a64a77b 2004-04-21 devnull Regdesc *rp;
199 4a64a77b 2004-04-21 devnull ulong v;
202 4a64a77b 2004-04-21 devnull tail = &l2;
203 4a64a77b 2004-04-21 devnull for(rp=mach->reglist; rp->name; rp++){
204 4a64a77b 2004-04-21 devnull if(rget(regs, rp->name, &v) < 0)
205 4a64a77b 2004-04-21 devnull continue;
206 4a64a77b 2004-04-21 devnull l = al(TSTRING);
207 4a64a77b 2004-04-21 devnull l->store.fmt = 's';
208 4a64a77b 2004-04-21 devnull l->store.u.string = strnode(rp->name);
209 4a64a77b 2004-04-21 devnull *tail = l;
210 4a64a77b 2004-04-21 devnull tail = &l->next;
211 4a64a77b 2004-04-21 devnull l = al(TINT);
212 4a64a77b 2004-04-21 devnull l->store.fmt = 'X';
213 4a64a77b 2004-04-21 devnull l->store.u.ival = v;
214 4a64a77b 2004-04-21 devnull *tail = l;
215 4a64a77b 2004-04-21 devnull tail = &l->next;
217 4a64a77b 2004-04-21 devnull return l2;
220 564ca709 2004-04-19 devnull static List*
221 564ca709 2004-04-19 devnull listlocals(Map *map, Regs *regs, Symbol *fn, int class)
224 564ca709 2004-04-19 devnull u32int val;
225 564ca709 2004-04-19 devnull Symbol s;
226 564ca709 2004-04-19 devnull List **tail, *l2;
229 564ca709 2004-04-19 devnull tail = &l2;
230 564ca709 2004-04-19 devnull if(fn == nil)
231 564ca709 2004-04-19 devnull return l2;
232 564ca709 2004-04-19 devnull for(i = 0; indexlsym(fn, i, &s)>=0; i++) {
233 564ca709 2004-04-19 devnull if(s.class != class)
234 564ca709 2004-04-19 devnull continue;
235 87ccb5f9 2005-01-17 devnull if(class == CAUTO && (s.name==0 || s.name[0] == '.'))
236 564ca709 2004-04-19 devnull continue;
237 564ca709 2004-04-19 devnull if(lget4(map, regs, s.loc, &val) < 0)
238 564ca709 2004-04-19 devnull continue;
239 564ca709 2004-04-19 devnull *tail = listvar(s.name, val);
240 564ca709 2004-04-19 devnull tail = &(*tail)->next;
242 564ca709 2004-04-19 devnull return l2;
245 564ca709 2004-04-19 devnull static List*
246 564ca709 2004-04-19 devnull listparams(Map *map, Regs *regs, Symbol *fn)
248 564ca709 2004-04-19 devnull return listlocals(map, regs, fn, CPARAM);
251 564ca709 2004-04-19 devnull static List*
252 564ca709 2004-04-19 devnull listautos(Map *map, Regs *regs, Symbol *fn)
254 564ca709 2004-04-19 devnull return listlocals(map, regs, fn, CAUTO);
258 564ca709 2004-04-19 devnull trlist(Map *map, Regs *regs, ulong pc, ulong callerpc, Symbol *sym, int depth)
260 564ca709 2004-04-19 devnull List *q, *l;
261 564ca709 2004-04-19 devnull static List **tail;
263 564ca709 2004-04-19 devnull if (tracelist == 0) /* first time */
264 564ca709 2004-04-19 devnull tail = &tracelist;
266 564ca709 2004-04-19 devnull q = al(TLIST);
267 564ca709 2004-04-19 devnull *tail = q;
268 564ca709 2004-04-19 devnull tail = &q->next;
270 564ca709 2004-04-19 devnull l = al(TINT); /* Function address */
271 564ca709 2004-04-19 devnull q->store.u.l = l;
272 564ca709 2004-04-19 devnull l->store.u.ival = sym ? sym->loc.addr : pc;
273 564ca709 2004-04-19 devnull l->store.fmt = 'X';
275 564ca709 2004-04-19 devnull l->next = al(TINT); /* actual pc address */
276 564ca709 2004-04-19 devnull l = l->next;
277 564ca709 2004-04-19 devnull l->store.u.ival = pc;
278 564ca709 2004-04-19 devnull l->store.fmt = 'X';
280 564ca709 2004-04-19 devnull l->next = al(TINT); /* called from address */
281 564ca709 2004-04-19 devnull l = l->next;
282 564ca709 2004-04-19 devnull l->store.u.ival = callerpc;
283 564ca709 2004-04-19 devnull l->store.fmt = 'X';
285 564ca709 2004-04-19 devnull l->next = al(TLIST); /* make list of params */
286 564ca709 2004-04-19 devnull l = l->next;
288 564ca709 2004-04-19 devnull l->store.u.l = listparams(map, regs, sym);
290 564ca709 2004-04-19 devnull l->next = al(TLIST); /* make list of locals */
291 564ca709 2004-04-19 devnull l = l->next;
293 564ca709 2004-04-19 devnull l->store.u.l = listautos(map, regs, sym);
295 4a64a77b 2004-04-21 devnull l->next = al(TLIST); /* make list of registers */
296 4a64a77b 2004-04-21 devnull l = l->next;
297 4a64a77b 2004-04-21 devnull l->store.u.l = listregisters(map, regs);
299 564ca709 2004-04-19 devnull return depth<40;