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 #include "y.tab.h"
9 564ca709 2004-04-19 devnull
10 564ca709 2004-04-19 devnull static int syren;
11 564ca709 2004-04-19 devnull
12 564ca709 2004-04-19 devnull Lsym*
13 564ca709 2004-04-19 devnull unique(char *buf, Symbol *s)
14 564ca709 2004-04-19 devnull {
15 564ca709 2004-04-19 devnull Lsym *l;
16 564ca709 2004-04-19 devnull int i, renamed;
17 564ca709 2004-04-19 devnull
18 564ca709 2004-04-19 devnull renamed = 0;
19 62faed57 2005-11-29 devnull strcpy(buf, s->xname);
20 564ca709 2004-04-19 devnull for(;;) {
21 564ca709 2004-04-19 devnull l = look(buf);
22 564ca709 2004-04-19 devnull if(l == 0 || (l->lexval == Tid && l->v->set == 0))
23 564ca709 2004-04-19 devnull break;
24 564ca709 2004-04-19 devnull
25 564ca709 2004-04-19 devnull if(syren == 0 && !quiet) {
26 564ca709 2004-04-19 devnull print("Symbol renames:\n");
27 564ca709 2004-04-19 devnull syren = 1;
28 564ca709 2004-04-19 devnull }
29 564ca709 2004-04-19 devnull i = strlen(buf)+1;
30 564ca709 2004-04-19 devnull memmove(buf+1, buf, i);
31 564ca709 2004-04-19 devnull buf[0] = '$';
32 564ca709 2004-04-19 devnull renamed++;
33 564ca709 2004-04-19 devnull if(renamed > 5 && !quiet) {
34 564ca709 2004-04-19 devnull print("Too many renames; must be X source!\n");
35 564ca709 2004-04-19 devnull break;
36 564ca709 2004-04-19 devnull }
37 564ca709 2004-04-19 devnull }
38 564ca709 2004-04-19 devnull if(renamed && !quiet)
39 62faed57 2005-11-29 devnull print("\t%s=%s %c/%L\n", s->xname, buf, s->type, s->loc);
40 564ca709 2004-04-19 devnull if(l == 0)
41 564ca709 2004-04-19 devnull l = enter(buf, Tid);
42 62faed57 2005-11-29 devnull s->aux = l;
43 fa325e9b 2020-01-10 cross return l;
44 564ca709 2004-04-19 devnull }
45 564ca709 2004-04-19 devnull
46 564ca709 2004-04-19 devnull void
47 564ca709 2004-04-19 devnull varsym(void)
48 564ca709 2004-04-19 devnull {
49 564ca709 2004-04-19 devnull Lsym *l;
50 564ca709 2004-04-19 devnull Fhdr *fp;
51 564ca709 2004-04-19 devnull
52 564ca709 2004-04-19 devnull l = mkvar("symbols");
53 564ca709 2004-04-19 devnull if(l->v->set)
54 564ca709 2004-04-19 devnull return;
55 564ca709 2004-04-19 devnull
56 564ca709 2004-04-19 devnull l->v->set = 1;
57 564ca709 2004-04-19 devnull l->v->type = TLIST;
58 564ca709 2004-04-19 devnull l->v->store.u.l = nil;
59 564ca709 2004-04-19 devnull
60 564ca709 2004-04-19 devnull for(fp=fhdrlist; fp; fp=fp->next){
61 564ca709 2004-04-19 devnull if(fp->ftype == FCORE)
62 564ca709 2004-04-19 devnull continue;
63 564ca709 2004-04-19 devnull addvarsym(fp);
64 564ca709 2004-04-19 devnull }
65 564ca709 2004-04-19 devnull if(l->v->store.u.l == nil)
66 564ca709 2004-04-19 devnull print("no debugging symbols\n");
67 564ca709 2004-04-19 devnull }
68 564ca709 2004-04-19 devnull
69 564ca709 2004-04-19 devnull void
70 564ca709 2004-04-19 devnull addvarsym(Fhdr *fp)
71 564ca709 2004-04-19 devnull {
72 564ca709 2004-04-19 devnull int i;
73 564ca709 2004-04-19 devnull Symbol s;
74 564ca709 2004-04-19 devnull Lsym *l;
75 564ca709 2004-04-19 devnull String *file;
76 4a000a28 2012-03-05 rsc u64int v;
77 689be541 2005-11-28 devnull char buf[65536]; /* Some of those C++ names are really big */
78 564ca709 2004-04-19 devnull List *list, **tail, *tl;
79 564ca709 2004-04-19 devnull
80 564ca709 2004-04-19 devnull if(fp == nil)
81 564ca709 2004-04-19 devnull return;
82 564ca709 2004-04-19 devnull
83 564ca709 2004-04-19 devnull l = look("symbols");
84 564ca709 2004-04-19 devnull if(l == nil)
85 564ca709 2004-04-19 devnull return;
86 564ca709 2004-04-19 devnull
87 564ca709 2004-04-19 devnull l->v->set = 1;
88 564ca709 2004-04-19 devnull l->v->type = TLIST;
89 564ca709 2004-04-19 devnull tail = &l->v->store.u.l;
90 564ca709 2004-04-19 devnull while(*tail)
91 564ca709 2004-04-19 devnull tail = &(*tail)->next;
92 564ca709 2004-04-19 devnull
93 564ca709 2004-04-19 devnull file = strnode(fp->filename);
94 564ca709 2004-04-19 devnull for(i=0; findexsym(fp, i, &s)>=0; i++){
95 564ca709 2004-04-19 devnull switch(s.type) {
96 564ca709 2004-04-19 devnull case 'T':
97 564ca709 2004-04-19 devnull case 'L':
98 564ca709 2004-04-19 devnull case 'D':
99 564ca709 2004-04-19 devnull case 'B':
100 564ca709 2004-04-19 devnull case 'b':
101 564ca709 2004-04-19 devnull case 'd':
102 564ca709 2004-04-19 devnull case 'l':
103 564ca709 2004-04-19 devnull case 't':
104 564ca709 2004-04-19 devnull if(s.name[0] == '.')
105 564ca709 2004-04-19 devnull continue;
106 564ca709 2004-04-19 devnull if(s.loc.type != LADDR)
107 564ca709 2004-04-19 devnull continue;
108 564ca709 2004-04-19 devnull v = s.loc.addr;
109 564ca709 2004-04-19 devnull tl = al(TLIST);
110 564ca709 2004-04-19 devnull *tail = tl;
111 564ca709 2004-04-19 devnull tail = &tl->next;
112 564ca709 2004-04-19 devnull
113 564ca709 2004-04-19 devnull l = unique(buf, &s);
114 564ca709 2004-04-19 devnull l->v->set = 1;
115 564ca709 2004-04-19 devnull l->v->type = TINT;
116 564ca709 2004-04-19 devnull l->v->store.u.ival = v;
117 564ca709 2004-04-19 devnull if(l->v->store.comt == 0)
118 564ca709 2004-04-19 devnull l->v->store.fmt = 'X';
119 564ca709 2004-04-19 devnull
120 62faed57 2005-11-29 devnull /* Enter as list of { name, type, value, file, xname } */
121 564ca709 2004-04-19 devnull list = al(TSTRING);
122 564ca709 2004-04-19 devnull tl->store.u.l = list;
123 564ca709 2004-04-19 devnull list->store.u.string = strnode(buf);
124 564ca709 2004-04-19 devnull list->store.fmt = 's';
125 fa325e9b 2020-01-10 cross
126 564ca709 2004-04-19 devnull list->next = al(TINT);
127 564ca709 2004-04-19 devnull list = list->next;
128 564ca709 2004-04-19 devnull list->store.fmt = 'c';
129 564ca709 2004-04-19 devnull list->store.u.ival = s.type;
130 fa325e9b 2020-01-10 cross
131 564ca709 2004-04-19 devnull list->next = al(TINT);
132 564ca709 2004-04-19 devnull list = list->next;
133 564ca709 2004-04-19 devnull list->store.fmt = 'X';
134 564ca709 2004-04-19 devnull list->store.u.ival = v;
135 fa325e9b 2020-01-10 cross
136 564ca709 2004-04-19 devnull list->next = al(TSTRING);
137 564ca709 2004-04-19 devnull list = list->next;
138 564ca709 2004-04-19 devnull list->store.fmt = 's';
139 564ca709 2004-04-19 devnull list->store.u.string = file;
140 fa325e9b 2020-01-10 cross
141 62faed57 2005-11-29 devnull list->next = al(TSTRING);
142 62faed57 2005-11-29 devnull list = list->next;
143 62faed57 2005-11-29 devnull list->store.fmt = 's';
144 0932b484 2006-02-14 devnull list->store.u.string = strnode(s.name);
145 564ca709 2004-04-19 devnull }
146 564ca709 2004-04-19 devnull }
147 564ca709 2004-04-19 devnull *tail = nil;
148 564ca709 2004-04-19 devnull }
149 564ca709 2004-04-19 devnull
150 564ca709 2004-04-19 devnull static int
151 564ca709 2004-04-19 devnull infile(List *list, char *file, char **name)
152 564ca709 2004-04-19 devnull {
153 564ca709 2004-04-19 devnull /* name */
154 564ca709 2004-04-19 devnull if(list->type != TSTRING)
155 564ca709 2004-04-19 devnull return 0;
156 564ca709 2004-04-19 devnull *name = list->store.u.string->string;
157 564ca709 2004-04-19 devnull if(list->next == nil)
158 564ca709 2004-04-19 devnull return 0;
159 564ca709 2004-04-19 devnull list = list->next;
160 564ca709 2004-04-19 devnull
161 564ca709 2004-04-19 devnull /* type character */
162 564ca709 2004-04-19 devnull if(list->next == nil)
163 564ca709 2004-04-19 devnull return 0;
164 564ca709 2004-04-19 devnull list = list->next;
165 564ca709 2004-04-19 devnull
166 564ca709 2004-04-19 devnull /* address */
167 564ca709 2004-04-19 devnull if(list->next == nil)
168 564ca709 2004-04-19 devnull return 0;
169 564ca709 2004-04-19 devnull list = list->next;
170 564ca709 2004-04-19 devnull
171 564ca709 2004-04-19 devnull /* file */
172 564ca709 2004-04-19 devnull if(list->type != TSTRING)
173 564ca709 2004-04-19 devnull return 0;
174 564ca709 2004-04-19 devnull return strcmp(list->store.u.string->string, file) == 0;
175 564ca709 2004-04-19 devnull }
176 564ca709 2004-04-19 devnull
177 564ca709 2004-04-19 devnull void
178 564ca709 2004-04-19 devnull delvarsym(char *file)
179 564ca709 2004-04-19 devnull {
180 564ca709 2004-04-19 devnull char *name;
181 564ca709 2004-04-19 devnull Lsym *l;
182 564ca709 2004-04-19 devnull List **lp, *p;
183 564ca709 2004-04-19 devnull
184 564ca709 2004-04-19 devnull l = look("symbols");
185 564ca709 2004-04-19 devnull if(l == nil)
186 564ca709 2004-04-19 devnull return;
187 564ca709 2004-04-19 devnull
188 564ca709 2004-04-19 devnull if(l->v->type != TLIST)
189 564ca709 2004-04-19 devnull return;
190 564ca709 2004-04-19 devnull
191 564ca709 2004-04-19 devnull for(lp=&l->v->store.u.l; *lp; lp=&(*lp)->next){
192 564ca709 2004-04-19 devnull while(*lp){
193 564ca709 2004-04-19 devnull p = *lp;
194 564ca709 2004-04-19 devnull if(p->type != TLIST)
195 564ca709 2004-04-19 devnull break;
196 564ca709 2004-04-19 devnull if(!infile(p->store.u.l, file, &name))
197 564ca709 2004-04-19 devnull break;
198 564ca709 2004-04-19 devnull *lp = p->next;
199 564ca709 2004-04-19 devnull /* XXX remove from hash tables */
200 564ca709 2004-04-19 devnull }
201 564ca709 2004-04-19 devnull if(*lp == nil)
202 564ca709 2004-04-19 devnull break;
203 564ca709 2004-04-19 devnull }
204 564ca709 2004-04-19 devnull }
205 564ca709 2004-04-19 devnull
206 564ca709 2004-04-19 devnull void
207 564ca709 2004-04-19 devnull varreg(void)
208 564ca709 2004-04-19 devnull {
209 564ca709 2004-04-19 devnull Lsym *l;
210 564ca709 2004-04-19 devnull Value *v;
211 564ca709 2004-04-19 devnull Regdesc *r;
212 564ca709 2004-04-19 devnull List **tail, *li;
213 564ca709 2004-04-19 devnull
214 564ca709 2004-04-19 devnull l = mkvar("registers");
215 564ca709 2004-04-19 devnull v = l->v;
216 564ca709 2004-04-19 devnull v->set = 1;
217 564ca709 2004-04-19 devnull v->type = TLIST;
218 564ca709 2004-04-19 devnull v->store.u.l = 0;
219 564ca709 2004-04-19 devnull tail = &v->store.u.l;
220 564ca709 2004-04-19 devnull
221 564ca709 2004-04-19 devnull if(mach == nil)
222 564ca709 2004-04-19 devnull return;
223 564ca709 2004-04-19 devnull
224 564ca709 2004-04-19 devnull for(r = mach->reglist; r->name; r++) {
225 564ca709 2004-04-19 devnull l = mkvar(r->name);
226 564ca709 2004-04-19 devnull v = l->v;
227 564ca709 2004-04-19 devnull v->set = 1;
228 281c90a5 2005-02-11 devnull v->store.u.reg.name = r->name;
229 281c90a5 2005-02-11 devnull v->store.u.reg.thread = 0;
230 564ca709 2004-04-19 devnull v->store.fmt = r->format;
231 4f2ac1b7 2005-01-23 devnull v->type = TREG;
232 564ca709 2004-04-19 devnull
233 564ca709 2004-04-19 devnull li = al(TSTRING);
234 564ca709 2004-04-19 devnull li->store.u.string = strnode(r->name);
235 564ca709 2004-04-19 devnull li->store.fmt = 's';
236 564ca709 2004-04-19 devnull *tail = li;
237 564ca709 2004-04-19 devnull tail = &li->next;
238 564ca709 2004-04-19 devnull }
239 564ca709 2004-04-19 devnull
240 564ca709 2004-04-19 devnull l = mkvar("bpinst"); /* Breakpoint text */
241 564ca709 2004-04-19 devnull v = l->v;
242 564ca709 2004-04-19 devnull v->type = TSTRING;
243 564ca709 2004-04-19 devnull v->store.fmt = 's';
244 564ca709 2004-04-19 devnull v->set = 1;
245 564ca709 2004-04-19 devnull v->store.u.string = gmalloc(sizeof(String));
246 564ca709 2004-04-19 devnull v->store.u.string->len = mach->bpsize;
247 564ca709 2004-04-19 devnull v->store.u.string->string = gmalloc(mach->bpsize);
248 564ca709 2004-04-19 devnull memmove(v->store.u.string->string, mach->bpinst, mach->bpsize);
249 564ca709 2004-04-19 devnull }
250 564ca709 2004-04-19 devnull
251 564ca709 2004-04-19 devnull void
252 564ca709 2004-04-19 devnull loadvars(void)
253 564ca709 2004-04-19 devnull {
254 564ca709 2004-04-19 devnull Lsym *l;
255 564ca709 2004-04-19 devnull Value *v;
256 564ca709 2004-04-19 devnull
257 564ca709 2004-04-19 devnull l = mkvar("proc");
258 564ca709 2004-04-19 devnull v = l->v;
259 564ca709 2004-04-19 devnull v->type = TINT;
260 564ca709 2004-04-19 devnull v->store.fmt = 'X';
261 564ca709 2004-04-19 devnull v->set = 1;
262 564ca709 2004-04-19 devnull v->store.u.ival = 0;
263 564ca709 2004-04-19 devnull
264 564ca709 2004-04-19 devnull l = mkvar("pid"); /* Current process */
265 564ca709 2004-04-19 devnull v = l->v;
266 564ca709 2004-04-19 devnull v->type = TINT;
267 564ca709 2004-04-19 devnull v->store.fmt = 'D';
268 564ca709 2004-04-19 devnull v->set = 1;
269 564ca709 2004-04-19 devnull v->store.u.ival = 0;
270 564ca709 2004-04-19 devnull
271 564ca709 2004-04-19 devnull mkvar("notes"); /* Pending notes */
272 564ca709 2004-04-19 devnull
273 564ca709 2004-04-19 devnull l = mkvar("proclist"); /* Attached processes */
274 564ca709 2004-04-19 devnull l->v->type = TLIST;
275 564ca709 2004-04-19 devnull }
276 564ca709 2004-04-19 devnull
277 564ca709 2004-04-19 devnull String*
278 564ca709 2004-04-19 devnull strnodlen(char *name, int len)
279 564ca709 2004-04-19 devnull {
280 564ca709 2004-04-19 devnull String *s;
281 564ca709 2004-04-19 devnull
282 564ca709 2004-04-19 devnull s = gmalloc(sizeof(String)+len+1);
283 564ca709 2004-04-19 devnull s->string = (char*)s+sizeof(String);
284 564ca709 2004-04-19 devnull s->len = len;
285 564ca709 2004-04-19 devnull if(name != 0)
286 564ca709 2004-04-19 devnull memmove(s->string, name, len);
287 564ca709 2004-04-19 devnull s->string[len] = '\0';
288 564ca709 2004-04-19 devnull
289 564ca709 2004-04-19 devnull s->gc.gclink = gcl;
290 564ca709 2004-04-19 devnull gcl = (Gc*)s;
291 564ca709 2004-04-19 devnull
292 564ca709 2004-04-19 devnull return s;
293 564ca709 2004-04-19 devnull }
294 564ca709 2004-04-19 devnull
295 564ca709 2004-04-19 devnull String*
296 564ca709 2004-04-19 devnull strnode(char *name)
297 564ca709 2004-04-19 devnull {
298 564ca709 2004-04-19 devnull return strnodlen(name, strlen(name));
299 564ca709 2004-04-19 devnull }
300 564ca709 2004-04-19 devnull
301 564ca709 2004-04-19 devnull String*
302 564ca709 2004-04-19 devnull runenode(Rune *name)
303 564ca709 2004-04-19 devnull {
304 564ca709 2004-04-19 devnull int len;
305 564ca709 2004-04-19 devnull Rune *p;
306 564ca709 2004-04-19 devnull String *s;
307 564ca709 2004-04-19 devnull
308 564ca709 2004-04-19 devnull p = name;
309 564ca709 2004-04-19 devnull for(len = 0; *p; p++)
310 564ca709 2004-04-19 devnull len++;
311 564ca709 2004-04-19 devnull
312 564ca709 2004-04-19 devnull len++;
313 564ca709 2004-04-19 devnull len *= sizeof(Rune);
314 564ca709 2004-04-19 devnull s = gmalloc(sizeof(String)+len);
315 564ca709 2004-04-19 devnull s->string = (char*)s+sizeof(String);
316 564ca709 2004-04-19 devnull s->len = len;
317 564ca709 2004-04-19 devnull memmove(s->string, name, len);
318 564ca709 2004-04-19 devnull
319 564ca709 2004-04-19 devnull s->gc.gclink = gcl;
320 564ca709 2004-04-19 devnull gcl = (Gc*)s;
321 564ca709 2004-04-19 devnull
322 564ca709 2004-04-19 devnull return s;
323 564ca709 2004-04-19 devnull }
324 564ca709 2004-04-19 devnull
325 564ca709 2004-04-19 devnull String*
326 564ca709 2004-04-19 devnull stradd(String *l, String *r)
327 564ca709 2004-04-19 devnull {
328 564ca709 2004-04-19 devnull int len;
329 564ca709 2004-04-19 devnull String *s;
330 564ca709 2004-04-19 devnull
331 564ca709 2004-04-19 devnull len = l->len+r->len;
332 564ca709 2004-04-19 devnull s = gmalloc(sizeof(String)+len+1);
333 564ca709 2004-04-19 devnull s->gc.gclink = gcl;
334 564ca709 2004-04-19 devnull gcl = (Gc*)s;
335 564ca709 2004-04-19 devnull s->len = len;
336 564ca709 2004-04-19 devnull s->string = (char*)s+sizeof(String);
337 564ca709 2004-04-19 devnull memmove(s->string, l->string, l->len);
338 564ca709 2004-04-19 devnull memmove(s->string+l->len, r->string, r->len);
339 564ca709 2004-04-19 devnull s->string[s->len] = 0;
340 564ca709 2004-04-19 devnull return s;
341 564ca709 2004-04-19 devnull }
342 564ca709 2004-04-19 devnull
343 564ca709 2004-04-19 devnull int
344 564ca709 2004-04-19 devnull scmp(String *sr, String *sl)
345 564ca709 2004-04-19 devnull {
346 564ca709 2004-04-19 devnull if(sr->len != sl->len)
347 564ca709 2004-04-19 devnull return 0;
348 564ca709 2004-04-19 devnull
349 564ca709 2004-04-19 devnull if(memcmp(sr->string, sl->string, sl->len))
350 564ca709 2004-04-19 devnull return 0;
351 564ca709 2004-04-19 devnull
352 564ca709 2004-04-19 devnull return 1;
353 564ca709 2004-04-19 devnull }