Blame


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"
8 564ca709 2004-04-19 devnull
9 564ca709 2004-04-19 devnull static List **tail;
10 564ca709 2004-04-19 devnull
11 564ca709 2004-04-19 devnull List*
12 564ca709 2004-04-19 devnull construct(Node *l)
13 564ca709 2004-04-19 devnull {
14 564ca709 2004-04-19 devnull List *lh, **save;
15 564ca709 2004-04-19 devnull
16 564ca709 2004-04-19 devnull save = tail;
17 564ca709 2004-04-19 devnull lh = 0;
18 564ca709 2004-04-19 devnull tail = &lh;
19 564ca709 2004-04-19 devnull build(l);
20 564ca709 2004-04-19 devnull tail = save;
21 564ca709 2004-04-19 devnull
22 564ca709 2004-04-19 devnull return lh;
23 564ca709 2004-04-19 devnull }
24 564ca709 2004-04-19 devnull
25 564ca709 2004-04-19 devnull int
26 564ca709 2004-04-19 devnull listlen(List *l)
27 564ca709 2004-04-19 devnull {
28 564ca709 2004-04-19 devnull int len;
29 564ca709 2004-04-19 devnull
30 564ca709 2004-04-19 devnull len = 0;
31 564ca709 2004-04-19 devnull while(l) {
32 564ca709 2004-04-19 devnull len++;
33 564ca709 2004-04-19 devnull l = l->next;
34 564ca709 2004-04-19 devnull }
35 564ca709 2004-04-19 devnull return len;
36 564ca709 2004-04-19 devnull }
37 564ca709 2004-04-19 devnull
38 564ca709 2004-04-19 devnull void
39 564ca709 2004-04-19 devnull build(Node *n)
40 564ca709 2004-04-19 devnull {
41 564ca709 2004-04-19 devnull List *l;
42 564ca709 2004-04-19 devnull Node res;
43 564ca709 2004-04-19 devnull
44 564ca709 2004-04-19 devnull if(n == 0)
45 564ca709 2004-04-19 devnull return;
46 564ca709 2004-04-19 devnull
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);
51 564ca709 2004-04-19 devnull return;
52 564ca709 2004-04-19 devnull default:
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 fa325e9b 2020-01-10 cross tail = &l->next;
58 564ca709 2004-04-19 devnull }
59 564ca709 2004-04-19 devnull }
60 564ca709 2004-04-19 devnull
61 564ca709 2004-04-19 devnull List*
62 564ca709 2004-04-19 devnull addlist(List *l, List *r)
63 564ca709 2004-04-19 devnull {
64 564ca709 2004-04-19 devnull List *f;
65 564ca709 2004-04-19 devnull
66 564ca709 2004-04-19 devnull if(l == 0)
67 564ca709 2004-04-19 devnull return r;
68 564ca709 2004-04-19 devnull
69 564ca709 2004-04-19 devnull for(f = l; f->next; f = f->next)
70 564ca709 2004-04-19 devnull ;
71 564ca709 2004-04-19 devnull f->next = r;
72 564ca709 2004-04-19 devnull
73 564ca709 2004-04-19 devnull return l;
74 564ca709 2004-04-19 devnull }
75 564ca709 2004-04-19 devnull
76 564ca709 2004-04-19 devnull void
77 564ca709 2004-04-19 devnull append(Node *r, Node *list, Node *val)
78 564ca709 2004-04-19 devnull {
79 564ca709 2004-04-19 devnull List *l, *f;
80 564ca709 2004-04-19 devnull
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;
84 564ca709 2004-04-19 devnull
85 564ca709 2004-04-19 devnull r->op = OCONST;
86 564ca709 2004-04-19 devnull r->type = TLIST;
87 564ca709 2004-04-19 devnull
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;
91 564ca709 2004-04-19 devnull return;
92 564ca709 2004-04-19 devnull }
93 564ca709 2004-04-19 devnull for(f = list->store.u.l; f->next; f = f->next)
94 564ca709 2004-04-19 devnull ;
95 564ca709 2004-04-19 devnull f->next = l;
96 564ca709 2004-04-19 devnull r->store.u.l = list->store.u.l;
97 564ca709 2004-04-19 devnull }
98 564ca709 2004-04-19 devnull
99 564ca709 2004-04-19 devnull int
100 564ca709 2004-04-19 devnull listcmp(List *l, List *r)
101 564ca709 2004-04-19 devnull {
102 564ca709 2004-04-19 devnull if(l == r)
103 564ca709 2004-04-19 devnull return 1;
104 564ca709 2004-04-19 devnull
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;
114 564ca709 2004-04-19 devnull break;
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;
118 564ca709 2004-04-19 devnull break;
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;
122 564ca709 2004-04-19 devnull break;
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;
126 564ca709 2004-04-19 devnull break;
127 564ca709 2004-04-19 devnull }
128 564ca709 2004-04-19 devnull l = l->next;
129 564ca709 2004-04-19 devnull r = r->next;
130 564ca709 2004-04-19 devnull }
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;
134 564ca709 2004-04-19 devnull }
135 564ca709 2004-04-19 devnull
136 564ca709 2004-04-19 devnull void
137 564ca709 2004-04-19 devnull nthelem(List *l, int n, Node *res)
138 564ca709 2004-04-19 devnull {
139 564ca709 2004-04-19 devnull if(n < 0)
140 564ca709 2004-04-19 devnull error("negative index in []");
141 564ca709 2004-04-19 devnull
142 564ca709 2004-04-19 devnull while(l && n--)
143 564ca709 2004-04-19 devnull l = l->next;
144 564ca709 2004-04-19 devnull
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;
149 564ca709 2004-04-19 devnull return;
150 564ca709 2004-04-19 devnull }
151 564ca709 2004-04-19 devnull res->type = l->type;
152 564ca709 2004-04-19 devnull res->store = l->store;
153 564ca709 2004-04-19 devnull }
154 564ca709 2004-04-19 devnull
155 564ca709 2004-04-19 devnull void
156 564ca709 2004-04-19 devnull delete(List *l, int n, Node *res)
157 564ca709 2004-04-19 devnull {
158 564ca709 2004-04-19 devnull List **tl;
159 564ca709 2004-04-19 devnull
160 564ca709 2004-04-19 devnull if(n < 0)
161 564ca709 2004-04-19 devnull error("negative index in delete");
162 564ca709 2004-04-19 devnull
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;
166 564ca709 2004-04-19 devnull
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;
169 564ca709 2004-04-19 devnull
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;
173 564ca709 2004-04-19 devnull }
174 564ca709 2004-04-19 devnull
175 564ca709 2004-04-19 devnull List*
176 564ca709 2004-04-19 devnull listvar(char *s, long v)
177 564ca709 2004-04-19 devnull {
178 564ca709 2004-04-19 devnull List *l, *tl;
179 564ca709 2004-04-19 devnull
180 564ca709 2004-04-19 devnull tl = al(TLIST);
181 564ca709 2004-04-19 devnull
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;
190 564ca709 2004-04-19 devnull
191 564ca709 2004-04-19 devnull return tl;
192 4a64a77b 2004-04-21 devnull }
193 4a64a77b 2004-04-21 devnull
194 4a64a77b 2004-04-21 devnull static List*
195 4a64a77b 2004-04-21 devnull listregisters(Map *map, Regs *regs)
196 4a64a77b 2004-04-21 devnull {
197 4a64a77b 2004-04-21 devnull List **tail, *l2, *l;
198 4a64a77b 2004-04-21 devnull Regdesc *rp;
199 443d6288 2012-02-19 rsc u64int v;
200 4a64a77b 2004-04-21 devnull
201 4a64a77b 2004-04-21 devnull l2 = 0;
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;
216 4a64a77b 2004-04-21 devnull }
217 4a64a77b 2004-04-21 devnull return l2;
218 564ca709 2004-04-19 devnull }
219 564ca709 2004-04-19 devnull
220 564ca709 2004-04-19 devnull static List*
221 564ca709 2004-04-19 devnull listlocals(Map *map, Regs *regs, Symbol *fn, int class)
222 564ca709 2004-04-19 devnull {
223 564ca709 2004-04-19 devnull int i;
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;
227 564ca709 2004-04-19 devnull
228 564ca709 2004-04-19 devnull l2 = 0;
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;
241 564ca709 2004-04-19 devnull }
242 564ca709 2004-04-19 devnull return l2;
243 564ca709 2004-04-19 devnull }
244 564ca709 2004-04-19 devnull
245 564ca709 2004-04-19 devnull static List*
246 564ca709 2004-04-19 devnull listparams(Map *map, Regs *regs, Symbol *fn)
247 564ca709 2004-04-19 devnull {
248 564ca709 2004-04-19 devnull return listlocals(map, regs, fn, CPARAM);
249 564ca709 2004-04-19 devnull }
250 564ca709 2004-04-19 devnull
251 564ca709 2004-04-19 devnull static List*
252 564ca709 2004-04-19 devnull listautos(Map *map, Regs *regs, Symbol *fn)
253 564ca709 2004-04-19 devnull {
254 564ca709 2004-04-19 devnull return listlocals(map, regs, fn, CAUTO);
255 564ca709 2004-04-19 devnull }
256 564ca709 2004-04-19 devnull
257 564ca709 2004-04-19 devnull int
258 443d6288 2012-02-19 rsc trlist(Map *map, Regs *regs, u64int pc, u64int callerpc, Symbol *sym, int depth)
259 564ca709 2004-04-19 devnull {
260 564ca709 2004-04-19 devnull List *q, *l;
261 564ca709 2004-04-19 devnull static List **tail;
262 564ca709 2004-04-19 devnull
263 564ca709 2004-04-19 devnull if (tracelist == 0) /* first time */
264 564ca709 2004-04-19 devnull tail = &tracelist;
265 564ca709 2004-04-19 devnull
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;
269 564ca709 2004-04-19 devnull
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';
274 564ca709 2004-04-19 devnull
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';
279 564ca709 2004-04-19 devnull
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';
284 564ca709 2004-04-19 devnull
285 564ca709 2004-04-19 devnull l->next = al(TLIST); /* make list of params */
286 564ca709 2004-04-19 devnull l = l->next;
287 564ca709 2004-04-19 devnull if(sym)
288 564ca709 2004-04-19 devnull l->store.u.l = listparams(map, regs, sym);
289 564ca709 2004-04-19 devnull
290 564ca709 2004-04-19 devnull l->next = al(TLIST); /* make list of locals */
291 564ca709 2004-04-19 devnull l = l->next;
292 564ca709 2004-04-19 devnull if(sym)
293 564ca709 2004-04-19 devnull l->store.u.l = listautos(map, regs, sym);
294 564ca709 2004-04-19 devnull
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);
298 4a64a77b 2004-04-21 devnull
299 564ca709 2004-04-19 devnull return depth<40;
300 564ca709 2004-04-19 devnull }