xref: /plan9/sys/src/cmd/acid/util.c (revision 1bd2810994d48c5034925d24ca0b90739454b582)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ctype.h>
5 #include <mach.h>
6 #define Extern extern
7 #include "acid.h"
8 #include "y.tab.h"
9 
10 static int syren;
11 
12 Lsym*
unique(char * buf,Sym * s)13 unique(char *buf, Sym *s)
14 {
15 	Lsym *l;
16 	int i, renamed;
17 
18 	renamed = 0;
19 	strcpy(buf, s->name);
20 	for(;;) {
21 		l = look(buf);
22 		if(l == 0 || (l->lexval == Tid && l->v->set == 0))
23 			break;
24 
25 		if(syren == 0 && !quiet) {
26 			print("Symbol renames:\n");
27 			syren = 1;
28 		}
29 		i = strlen(buf)+1;
30 		memmove(buf+1, buf, i);
31 		buf[0] = '$';
32 		renamed++;
33 		if(renamed > 5 && !quiet) {
34 			print("Too many renames; must be X source!\n");
35 			break;
36 		}
37 	}
38 	if(renamed && !quiet)
39 		print("\t%s=%s %c/%llux\n", s->name, buf, s->type, s->value);
40 	if(l == 0)
41 		l = enter(buf, Tid);
42 	return l;
43 }
44 
45 void
varsym(void)46 varsym(void)
47 {
48 	int i;
49 	Sym *s;
50 	long n;
51 	Lsym *l;
52 	uvlong v;
53 	char buf[1024];
54 	List *list, **tail, *l2, *tl;
55 
56 	tail = &l2;
57 	l2 = 0;
58 
59 	symbase(&n);
60 	for(i = 0; i < n; i++) {
61 		s = getsym(i);
62 		switch(s->type) {
63 		case 'T':
64 		case 'L':
65 		case 'D':
66 		case 'B':
67 		case 'b':
68 		case 'd':
69 		case 'l':
70 		case 't':
71 			if(s->name[0] == '.')
72 				continue;
73 
74 			v = s->value;
75 			tl = al(TLIST);
76 			*tail = tl;
77 			tail = &tl->next;
78 
79 			l = unique(buf, s);
80 
81 			l->v->set = 1;
82 			l->v->type = TINT;
83 			l->v->ival = v;
84 			if(l->v->comt == 0)
85 				l->v->fmt = 'X';
86 
87 			/* Enter as list of { name, type, value } */
88 			list = al(TSTRING);
89 			tl->l = list;
90 			list->string = strnode(buf);
91 			list->fmt = 's';
92 			list->next = al(TINT);
93 			list = list->next;
94 			list->fmt = 'c';
95 			list->ival = s->type;
96 			list->next = al(TINT);
97 			list = list->next;
98 			list->fmt = 'X';
99 			list->ival = v;
100 
101 		}
102 	}
103 	l = mkvar("symbols");
104 	l->v->set = 1;
105 	l->v->type = TLIST;
106 	l->v->l = l2;
107 	if(l2 == 0)
108 		print("no symbol information\n");
109 }
110 
111 void
varreg(void)112 varreg(void)
113 {
114 	Lsym *l;
115 	Value *v;
116 	Reglist *r;
117 	List **tail, *li;
118 
119 	l = mkvar("registers");
120 	v = l->v;
121 	v->set = 1;
122 	v->type = TLIST;
123 	v->l = 0;
124 	tail = &v->l;
125 
126 	for(r = mach->reglist; r->rname; r++) {
127 		l = mkvar(r->rname);
128 		v = l->v;
129 		v->set = 1;
130 		v->ival = r->roffs;
131 		v->fmt = r->rformat;
132 		v->type = TINT;
133 
134 		li = al(TSTRING);
135 		li->string = strnode(r->rname);
136 		li->fmt = 's';
137 		*tail = li;
138 		tail = &li->next;
139 	}
140 
141 	if(machdata == 0)
142 		return;
143 
144 	l = mkvar("bpinst");	/* Breakpoint text */
145 	v = l->v;
146 	v->type = TSTRING;
147 	v->fmt = 's';
148 	v->set = 1;
149 	v->string = gmalloc(sizeof(String));
150 	v->string->len = machdata->bpsize;
151 	v->string->string = gmalloc(machdata->bpsize);
152 	memmove(v->string->string, machdata->bpinst, machdata->bpsize);
153 }
154 
155 void
loadvars(void)156 loadvars(void)
157 {
158 	Lsym *l;
159 	Value *v;
160 
161 	l =  mkvar("proc");
162 	v = l->v;
163 	v->type = TINT;
164 	v->fmt = 'X';
165 	v->set = 1;
166 	v->ival = 0;
167 
168 	l = mkvar("pid");		/* Current process */
169 	v = l->v;
170 	v->type = TINT;
171 	v->fmt = 'D';
172 	v->set = 1;
173 	v->ival = 0;
174 
175 	mkvar("notes");			/* Pending notes */
176 
177 	l = mkvar("proclist");		/* Attached processes */
178 	l->v->type = TLIST;
179 }
180 
181 uvlong
rget(Map * map,char * reg)182 rget(Map *map, char *reg)
183 {
184 	Lsym *s;
185 	ulong x;
186 	uvlong v;
187 	int ret;
188 
189 	s = look(reg);
190 	if(s == 0)
191 		fatal("rget: %s\n", reg);
192 
193 	switch(s->v->fmt){
194 	default:
195 		ret = get4(map, s->v->ival, &x);
196 		v = x;
197 		break;
198 	case 'V':
199 	case 'W':
200 	case 'Y':
201 	case 'Z':
202 		ret = get8(map, s->v->ival, &v);
203 		break;
204 	}
205 	if(ret < 0)
206 		error("can't get register %s: %r\n", reg);
207 	return v;
208 }
209 
210 String*
strnodlen(char * name,int len)211 strnodlen(char *name, int len)
212 {
213 	String *s;
214 
215 	s = gmalloc(sizeof(String)+len+1);
216 	s->string = (char*)s+sizeof(String);
217 	s->len = len;
218 	if(name != 0)
219 		memmove(s->string, name, len);
220 	s->string[len] = '\0';
221 
222 	s->gclink = gcl;
223 	gcl = s;
224 
225 	return s;
226 }
227 
228 String*
strnode(char * name)229 strnode(char *name)
230 {
231 	return strnodlen(name, strlen(name));
232 }
233 
234 String*
runenode(Rune * name)235 runenode(Rune *name)
236 {
237 	int len;
238 	Rune *p;
239 	String *s;
240 
241 	p = name;
242 	for(len = 0; *p; p++)
243 		len++;
244 
245 	len++;
246 	len *= sizeof(Rune);
247 	s = gmalloc(sizeof(String)+len);
248 	s->string = (char*)s+sizeof(String);
249 	s->len = len;
250 	memmove(s->string, name, len);
251 
252 	s->gclink = gcl;
253 	gcl = s;
254 
255 	return s;
256 }
257 
258 String*
stradd(String * l,String * r)259 stradd(String *l, String *r)
260 {
261 	int len;
262 	String *s;
263 
264 	len = l->len+r->len;
265 	s = gmalloc(sizeof(String)+len+1);
266 	s->gclink = gcl;
267 	gcl = s;
268 	s->len = len;
269 	s->string = (char*)s+sizeof(String);
270 	memmove(s->string, l->string, l->len);
271 	memmove(s->string+l->len, r->string, r->len);
272 	s->string[s->len] = 0;
273 	return s;
274 }
275 
276 String*
straddrune(String * l,Rune r)277 straddrune(String *l, Rune r)
278 {
279 	int len;
280 	String *s;
281 
282 	len = l->len+runelen(r);
283 	s = gmalloc(sizeof(String)+len+1);
284 	s->gclink = gcl;
285 	gcl = s;
286 	s->len = len;
287 	s->string = (char*)s+sizeof(String);
288 	memmove(s->string, l->string, l->len);
289 	runetochar(s->string+l->len, &r);
290 	s->string[s->len] = 0;
291 	return s;
292 }
293 
294 int
scmp(String * sr,String * sl)295 scmp(String *sr, String *sl)
296 {
297 	if(sr->len != sl->len)
298 		return 0;
299 
300 	if(memcmp(sr->string, sl->string, sl->len))
301 		return 0;
302 
303 	return 1;
304 }
305