Blame


1 a84cbb2a 2004-04-19 devnull #include <u.h>
2 a84cbb2a 2004-04-19 devnull #include <libc.h>
3 a84cbb2a 2004-04-19 devnull #include <mach.h>
4 a84cbb2a 2004-04-19 devnull #include "stabs.h"
5 a84cbb2a 2004-04-19 devnull
6 a84cbb2a 2004-04-19 devnull static int
7 a84cbb2a 2004-04-19 devnull strcmpcolon(char *a, char *bcolon)
8 a84cbb2a 2004-04-19 devnull {
9 a84cbb2a 2004-04-19 devnull int i, len;
10 a84cbb2a 2004-04-19 devnull char *p;
11 a84cbb2a 2004-04-19 devnull
12 a84cbb2a 2004-04-19 devnull p = strchr(bcolon, ':');
13 a84cbb2a 2004-04-19 devnull if(p == nil)
14 a84cbb2a 2004-04-19 devnull return strcmp(a, bcolon);
15 a84cbb2a 2004-04-19 devnull len = p-bcolon;
16 a84cbb2a 2004-04-19 devnull i = strncmp(a, bcolon, len);
17 a84cbb2a 2004-04-19 devnull if(i)
18 a84cbb2a 2004-04-19 devnull return i;
19 a84cbb2a 2004-04-19 devnull if(a[len] == 0)
20 a84cbb2a 2004-04-19 devnull return 0;
21 a84cbb2a 2004-04-19 devnull return 1;
22 a84cbb2a 2004-04-19 devnull }
23 a84cbb2a 2004-04-19 devnull
24 a84cbb2a 2004-04-19 devnull static int
25 a84cbb2a 2004-04-19 devnull stabcvtsym(StabSym *stab, Symbol *sym, char *dir, char *file, int i)
26 a84cbb2a 2004-04-19 devnull {
27 a84cbb2a 2004-04-19 devnull char *p;
28 a84cbb2a 2004-04-19 devnull
29 a84cbb2a 2004-04-19 devnull /*
30 a84cbb2a 2004-04-19 devnull * Zero out the : to avoid allocating a new name string.
31 a84cbb2a 2004-04-19 devnull * The type info can be found by looking past the NUL.
32 a84cbb2a 2004-04-19 devnull * This is going to get us in trouble...
33 a84cbb2a 2004-04-19 devnull */
34 a84cbb2a 2004-04-19 devnull if((p = strchr(stab->name, ':')) != nil)
35 a84cbb2a 2004-04-19 devnull *p++ = 0;
36 a84cbb2a 2004-04-19 devnull else
37 a84cbb2a 2004-04-19 devnull p = stab->name+strlen(stab->name)+1;
38 a84cbb2a 2004-04-19 devnull
39 a84cbb2a 2004-04-19 devnull sym->name = stab->name;
40 a84cbb2a 2004-04-19 devnull sym->u.stabs.dir = dir;
41 a84cbb2a 2004-04-19 devnull sym->u.stabs.file = file;
42 a84cbb2a 2004-04-19 devnull sym->u.stabs.i = i;
43 a84cbb2a 2004-04-19 devnull switch(stab->type){
44 a84cbb2a 2004-04-19 devnull default:
45 a84cbb2a 2004-04-19 devnull return -1;
46 a84cbb2a 2004-04-19 devnull case N_FUN:
47 a84cbb2a 2004-04-19 devnull sym->class = CTEXT;
48 a84cbb2a 2004-04-19 devnull switch(*p){
49 a84cbb2a 2004-04-19 devnull default:
50 a84cbb2a 2004-04-19 devnull return -1;
51 a84cbb2a 2004-04-19 devnull case 'F': /* global function */
52 a84cbb2a 2004-04-19 devnull sym->type = 'T';
53 a84cbb2a 2004-04-19 devnull break;
54 a84cbb2a 2004-04-19 devnull case 'Q': /* static procedure */
55 a84cbb2a 2004-04-19 devnull case 'f': /* static function */
56 a84cbb2a 2004-04-19 devnull case 'I': /* nested procedure */
57 a84cbb2a 2004-04-19 devnull case 'J': /* nested function */
58 a84cbb2a 2004-04-19 devnull sym->type = 't';
59 a84cbb2a 2004-04-19 devnull break;
60 a84cbb2a 2004-04-19 devnull }
61 a84cbb2a 2004-04-19 devnull sym->loc.type = LADDR;
62 a84cbb2a 2004-04-19 devnull sym->loc.addr = stab->value;
63 a84cbb2a 2004-04-19 devnull break;
64 a84cbb2a 2004-04-19 devnull case N_GSYM:
65 a84cbb2a 2004-04-19 devnull case N_PSYM:
66 a84cbb2a 2004-04-19 devnull case N_LSYM:
67 a84cbb2a 2004-04-19 devnull case N_LCSYM:
68 a84cbb2a 2004-04-19 devnull sym->class = CDATA;
69 a84cbb2a 2004-04-19 devnull sym->loc.type = LADDR;
70 a84cbb2a 2004-04-19 devnull sym->loc.addr = stab->value;
71 a84cbb2a 2004-04-19 devnull switch(*p){
72 a84cbb2a 2004-04-19 devnull default:
73 a84cbb2a 2004-04-19 devnull return -1;
74 a84cbb2a 2004-04-19 devnull case 'S': /* file-scope static variable */
75 a84cbb2a 2004-04-19 devnull sym->type = 'd';
76 a84cbb2a 2004-04-19 devnull break;
77 a84cbb2a 2004-04-19 devnull case 'G': /* global variable */
78 a84cbb2a 2004-04-19 devnull sym->type = 'D';
79 a84cbb2a 2004-04-19 devnull sym->loc.type = LNONE;
80 a84cbb2a 2004-04-19 devnull break;
81 a84cbb2a 2004-04-19 devnull case 'r': /* register variable */
82 a84cbb2a 2004-04-19 devnull sym->class = CAUTO;
83 a84cbb2a 2004-04-19 devnull sym->type = 'a';
84 a84cbb2a 2004-04-19 devnull sym->loc.type = LREG;
85 a84cbb2a 2004-04-19 devnull sym->loc.reg = "XXX";
86 a84cbb2a 2004-04-19 devnull break;
87 a84cbb2a 2004-04-19 devnull case 's': /* local variable */
88 a84cbb2a 2004-04-19 devnull sym->class = CAUTO;
89 a84cbb2a 2004-04-19 devnull sym->type = 'a';
90 a84cbb2a 2004-04-19 devnull sym->loc.type = LOFFSET;
91 a84cbb2a 2004-04-19 devnull sym->loc.offset = stab->value;
92 a84cbb2a 2004-04-19 devnull sym->loc.reg = "XXX";
93 a84cbb2a 2004-04-19 devnull break;
94 a84cbb2a 2004-04-19 devnull case 'a': /* by reference */
95 a84cbb2a 2004-04-19 devnull case 'D': /* f.p. parameter */
96 a84cbb2a 2004-04-19 devnull case 'i': /* register parameter */
97 a84cbb2a 2004-04-19 devnull case 'p': /* "normal" parameter */
98 a84cbb2a 2004-04-19 devnull case 'P': /* register parameter */
99 a84cbb2a 2004-04-19 devnull case 'v': /* by reference */
100 a84cbb2a 2004-04-19 devnull case 'X': /* function return variable */
101 a84cbb2a 2004-04-19 devnull sym->class = CPARAM;
102 a84cbb2a 2004-04-19 devnull sym->type = 'p';
103 a84cbb2a 2004-04-19 devnull if(*p == 'i'){
104 a84cbb2a 2004-04-19 devnull sym->loc.type = LREG;
105 a84cbb2a 2004-04-19 devnull sym->loc.reg = "XXX";
106 a84cbb2a 2004-04-19 devnull }else{
107 a84cbb2a 2004-04-19 devnull sym->loc.type = LOFFSET;
108 a84cbb2a 2004-04-19 devnull sym->loc.offset = stab->value;
109 a84cbb2a 2004-04-19 devnull sym->loc.reg = "XXX";
110 a84cbb2a 2004-04-19 devnull }
111 a84cbb2a 2004-04-19 devnull break;
112 a84cbb2a 2004-04-19 devnull }
113 a84cbb2a 2004-04-19 devnull break;
114 a84cbb2a 2004-04-19 devnull }
115 fa325e9b 2020-01-10 cross return 0;
116 a84cbb2a 2004-04-19 devnull }
117 a84cbb2a 2004-04-19 devnull
118 a84cbb2a 2004-04-19 devnull static int
119 a84cbb2a 2004-04-19 devnull stabssyminit(Fhdr *fp)
120 a84cbb2a 2004-04-19 devnull {
121 a84cbb2a 2004-04-19 devnull int i;
122 a84cbb2a 2004-04-19 devnull char *dir, *file;
123 a84cbb2a 2004-04-19 devnull Stab *stabs;
124 a84cbb2a 2004-04-19 devnull StabSym sym, lastfun;
125 a84cbb2a 2004-04-19 devnull Symbol s, *fun;
126 a84cbb2a 2004-04-19 devnull char **inc, **xinc;
127 a84cbb2a 2004-04-19 devnull int ninc, minc;
128 a84cbb2a 2004-04-19 devnull int locals, autos, params;
129 a84cbb2a 2004-04-19 devnull
130 a84cbb2a 2004-04-19 devnull stabs = &fp->stabs;
131 a84cbb2a 2004-04-19 devnull if(stabs == nil){
132 a84cbb2a 2004-04-19 devnull werrstr("no stabs info");
133 a84cbb2a 2004-04-19 devnull return -1;
134 a84cbb2a 2004-04-19 devnull }
135 a84cbb2a 2004-04-19 devnull
136 a84cbb2a 2004-04-19 devnull dir = nil;
137 a84cbb2a 2004-04-19 devnull file = nil;
138 a84cbb2a 2004-04-19 devnull inc = nil;
139 a84cbb2a 2004-04-19 devnull fun = nil;
140 a84cbb2a 2004-04-19 devnull ninc = 0;
141 a84cbb2a 2004-04-19 devnull minc = 0;
142 a84cbb2a 2004-04-19 devnull locals = 0;
143 a84cbb2a 2004-04-19 devnull params = 0;
144 a84cbb2a 2004-04-19 devnull autos = 0;
145 a84cbb2a 2004-04-19 devnull memset(&lastfun, 0, sizeof lastfun);
146 a84cbb2a 2004-04-19 devnull for(i=0; stabsym(stabs, i, &sym)>=0; i++){
147 a84cbb2a 2004-04-19 devnull switch(sym.type){
148 a84cbb2a 2004-04-19 devnull case N_SO:
149 a84cbb2a 2004-04-19 devnull if(sym.name == nil || *sym.name == 0){
150 a84cbb2a 2004-04-19 devnull file = nil;
151 a84cbb2a 2004-04-19 devnull break;
152 a84cbb2a 2004-04-19 devnull }
153 a84cbb2a 2004-04-19 devnull if(sym.name[strlen(sym.name)-1] == '/')
154 a84cbb2a 2004-04-19 devnull dir = sym.name;
155 a84cbb2a 2004-04-19 devnull else
156 a84cbb2a 2004-04-19 devnull file = sym.name;
157 a84cbb2a 2004-04-19 devnull break;
158 a84cbb2a 2004-04-19 devnull case N_BINCL:
159 a84cbb2a 2004-04-19 devnull if(ninc >= minc){
160 a84cbb2a 2004-04-19 devnull xinc = realloc(inc, (ninc+32)*sizeof(inc[0]));
161 a84cbb2a 2004-04-19 devnull if(xinc){
162 a84cbb2a 2004-04-19 devnull memset(xinc+ninc, 0, 32*sizeof(inc[0]));
163 a84cbb2a 2004-04-19 devnull inc = xinc;
164 a84cbb2a 2004-04-19 devnull }
165 a84cbb2a 2004-04-19 devnull ninc += 32;
166 a84cbb2a 2004-04-19 devnull }
167 a84cbb2a 2004-04-19 devnull if(ninc < minc)
168 a84cbb2a 2004-04-19 devnull inc[ninc] = sym.name;
169 a84cbb2a 2004-04-19 devnull ninc++;
170 a84cbb2a 2004-04-19 devnull break;
171 a84cbb2a 2004-04-19 devnull case N_EINCL:
172 a84cbb2a 2004-04-19 devnull if(ninc > 0)
173 a84cbb2a 2004-04-19 devnull ninc--;
174 a84cbb2a 2004-04-19 devnull break;
175 a84cbb2a 2004-04-19 devnull case N_EXCL:
176 a84cbb2a 2004-04-19 devnull /* condensed include - same effect as previous BINCL/EINCL pair */
177 a84cbb2a 2004-04-19 devnull break;
178 a84cbb2a 2004-04-19 devnull case N_GSYM: /* global variable */
179 a84cbb2a 2004-04-19 devnull /* only includes type, so useless for now */
180 a84cbb2a 2004-04-19 devnull break;
181 a84cbb2a 2004-04-19 devnull case N_FUN:
182 a84cbb2a 2004-04-19 devnull if(sym.name == nil){
183 a84cbb2a 2004-04-19 devnull /* marks end of function */
184 a84cbb2a 2004-04-19 devnull if(fun){
185 a84cbb2a 2004-04-19 devnull fun->hiloc.type = LADDR;
186 a84cbb2a 2004-04-19 devnull fun->hiloc.addr = fun->loc.addr + sym.value;
187 a84cbb2a 2004-04-19 devnull }
188 a84cbb2a 2004-04-19 devnull break;
189 a84cbb2a 2004-04-19 devnull }
190 a84cbb2a 2004-04-19 devnull if(fun && lastfun.value==sym.value && lastfun.name==sym.name){
191 a84cbb2a 2004-04-19 devnull fun->u.stabs.locals = i;
192 a84cbb2a 2004-04-19 devnull break;
193 a84cbb2a 2004-04-19 devnull }
194 a84cbb2a 2004-04-19 devnull /* create new symbol, add it */
195 a84cbb2a 2004-04-19 devnull lastfun = sym;
196 a84cbb2a 2004-04-19 devnull fun = nil;
197 a84cbb2a 2004-04-19 devnull if(stabcvtsym(&sym, &s, dir, file, i) < 0)
198 a84cbb2a 2004-04-19 devnull continue;
199 39dbe6e7 2005-01-07 devnull if((fun = _addsym(fp, &s)) == nil)
200 a84cbb2a 2004-04-19 devnull goto err;
201 a84cbb2a 2004-04-19 devnull locals = 0;
202 a84cbb2a 2004-04-19 devnull params = 0;
203 a84cbb2a 2004-04-19 devnull autos = 0;
204 a84cbb2a 2004-04-19 devnull break;
205 a84cbb2a 2004-04-19 devnull case N_PSYM:
206 a84cbb2a 2004-04-19 devnull case N_LSYM:
207 a84cbb2a 2004-04-19 devnull case N_LCSYM:
208 a84cbb2a 2004-04-19 devnull if(fun){
209 a84cbb2a 2004-04-19 devnull if(fun->u.stabs.frameptr == -1){
210 a84cbb2a 2004-04-19 devnull /*
211 a84cbb2a 2004-04-19 devnull * Try to distinguish functions with a real frame pointer
212 fa325e9b 2020-01-10 cross * from functions with a virtual frame pointer, based on
213 a84cbb2a 2004-04-19 devnull * whether the first parameter is in the right location and
214 fa325e9b 2020-01-10 cross * whether the autos have negative offsets.
215 fa325e9b 2020-01-10 cross *
216 a84cbb2a 2004-04-19 devnull * This heuristic works most of the time. On the 386, we
217 a84cbb2a 2004-04-19 devnull * cannot distinguish between a v. function with no autos
218 a84cbb2a 2004-04-19 devnull * but a frame of size 4 and a f.p. function with no autos and
219 a84cbb2a 2004-04-19 devnull * no frame. Anything else we'll get right.
220 fa325e9b 2020-01-10 cross *
221 a84cbb2a 2004-04-19 devnull * Another way to go about this would be to have
222 a84cbb2a 2004-04-19 devnull * mach-specific functions to inspect the function
223 a84cbb2a 2004-04-19 devnull * prologues when we're not sure. What we have
224 a84cbb2a 2004-04-19 devnull * already should be enough, though.
225 a84cbb2a 2004-04-19 devnull */
226 a84cbb2a 2004-04-19 devnull if(params==0 && sym.type == N_PSYM){
227 a84cbb2a 2004-04-19 devnull if(sym.value != 8 && sym.value >= 4){
228 a84cbb2a 2004-04-19 devnull /* XXX 386 specific, but let's find another system before generalizing */
229 a84cbb2a 2004-04-19 devnull fun->u.stabs.frameptr = 0;
230 a84cbb2a 2004-04-19 devnull fun->u.stabs.framesize = sym.value - 4;
231 a84cbb2a 2004-04-19 devnull }
232 a84cbb2a 2004-04-19 devnull }else if(sym.type == N_LSYM){
233 0cfb3760 2012-10-21 rsc if((int32)sym.value >= 0){
234 a84cbb2a 2004-04-19 devnull fun->u.stabs.frameptr = 0;
235 a84cbb2a 2004-04-19 devnull if(params)
236 a84cbb2a 2004-04-19 devnull fun->u.stabs.framesize = 8 - 4;
237 a84cbb2a 2004-04-19 devnull }else
238 a84cbb2a 2004-04-19 devnull fun->u.stabs.frameptr = 1;
239 a84cbb2a 2004-04-19 devnull }
240 a84cbb2a 2004-04-19 devnull }
241 a84cbb2a 2004-04-19 devnull if(sym.type == N_PSYM)
242 a84cbb2a 2004-04-19 devnull params++;
243 a84cbb2a 2004-04-19 devnull if(sym.type == N_LSYM)
244 a84cbb2a 2004-04-19 devnull autos++;
245 a84cbb2a 2004-04-19 devnull }
246 a84cbb2a 2004-04-19 devnull break;
247 a84cbb2a 2004-04-19 devnull
248 a84cbb2a 2004-04-19 devnull case N_STSYM: /* static file-scope variable */
249 a84cbb2a 2004-04-19 devnull /* create new symbol, add it */
250 a84cbb2a 2004-04-19 devnull if(stabcvtsym(&sym, &s, dir, file, i) < 0)
251 a84cbb2a 2004-04-19 devnull continue;
252 39dbe6e7 2005-01-07 devnull if(_addsym(fp, &s) == nil)
253 a84cbb2a 2004-04-19 devnull goto err;
254 a84cbb2a 2004-04-19 devnull break;
255 a84cbb2a 2004-04-19 devnull }
256 a84cbb2a 2004-04-19 devnull }
257 443d6288 2012-02-19 rsc USED(locals);
258 a84cbb2a 2004-04-19 devnull free(inc);
259 a84cbb2a 2004-04-19 devnull return 0;
260 a84cbb2a 2004-04-19 devnull
261 a84cbb2a 2004-04-19 devnull err:
262 a84cbb2a 2004-04-19 devnull free(inc);
263 a84cbb2a 2004-04-19 devnull return -1;
264 a84cbb2a 2004-04-19 devnull }
265 a84cbb2a 2004-04-19 devnull
266 a84cbb2a 2004-04-19 devnull static int
267 443d6288 2012-02-19 rsc stabspc2file(Fhdr *fhdr, u64int pc, char *buf, uint nbuf, ulong *pline)
268 a84cbb2a 2004-04-19 devnull {
269 a84cbb2a 2004-04-19 devnull int i;
270 a84cbb2a 2004-04-19 devnull Symbol *s;
271 a84cbb2a 2004-04-19 devnull StabSym ss;
272 a84cbb2a 2004-04-19 devnull ulong line, basepc;
273 a84cbb2a 2004-04-19 devnull Loc l;
274 a84cbb2a 2004-04-19 devnull
275 a84cbb2a 2004-04-19 devnull l.type = LADDR;
276 a84cbb2a 2004-04-19 devnull l.addr = pc;
277 a84cbb2a 2004-04-19 devnull if((s = ffindsym(fhdr, l, CTEXT)) == nil
278 a84cbb2a 2004-04-19 devnull || stabsym(&fhdr->stabs, s->u.stabs.i, &ss) < 0)
279 a84cbb2a 2004-04-19 devnull return -1;
280 a84cbb2a 2004-04-19 devnull
281 a84cbb2a 2004-04-19 devnull line = ss.desc;
282 a84cbb2a 2004-04-19 devnull basepc = ss.value;
283 a84cbb2a 2004-04-19 devnull for(i=s->u.stabs.i+1; stabsym(&fhdr->stabs, i, &ss) >= 0; i++){
284 a84cbb2a 2004-04-19 devnull if(ss.type == N_FUN && ss.name == nil)
285 a84cbb2a 2004-04-19 devnull break;
286 a84cbb2a 2004-04-19 devnull if(ss.type == N_SLINE){
287 a84cbb2a 2004-04-19 devnull if(basepc+ss.value > pc)
288 a84cbb2a 2004-04-19 devnull break;
289 a84cbb2a 2004-04-19 devnull else
290 a84cbb2a 2004-04-19 devnull line = ss.desc;
291 a84cbb2a 2004-04-19 devnull }
292 a84cbb2a 2004-04-19 devnull }
293 a84cbb2a 2004-04-19 devnull *pline = line;
294 a84cbb2a 2004-04-19 devnull if(s->u.stabs.dir)
295 a84cbb2a 2004-04-19 devnull snprint(buf, nbuf, "%s%s", s->u.stabs.dir, s->u.stabs.file);
296 a84cbb2a 2004-04-19 devnull else
297 a84cbb2a 2004-04-19 devnull snprint(buf, nbuf, "%s", s->u.stabs.file);
298 a84cbb2a 2004-04-19 devnull return 0;
299 a84cbb2a 2004-04-19 devnull }
300 a84cbb2a 2004-04-19 devnull
301 a84cbb2a 2004-04-19 devnull static int
302 443d6288 2012-02-19 rsc stabsline2pc(Fhdr *fhdr, u64int startpc, ulong line, u64int *pc)
303 a84cbb2a 2004-04-19 devnull {
304 a84cbb2a 2004-04-19 devnull int i, trigger;
305 a84cbb2a 2004-04-19 devnull Symbol *s;
306 a84cbb2a 2004-04-19 devnull StabSym ss;
307 a84cbb2a 2004-04-19 devnull ulong basepc;
308 a84cbb2a 2004-04-19 devnull Loc l;
309 a84cbb2a 2004-04-19 devnull
310 a84cbb2a 2004-04-19 devnull l.type = LADDR;
311 a84cbb2a 2004-04-19 devnull l.addr = startpc;
312 cf303e5b 2017-09-01 0intro if((s = ffindsym(fhdr, l, CTEXT)) == nil
313 cf303e5b 2017-09-01 0intro || stabsym(&fhdr->stabs, s->u.stabs.i, &ss) < 0)
314 a84cbb2a 2004-04-19 devnull return -1;
315 a84cbb2a 2004-04-19 devnull
316 a84cbb2a 2004-04-19 devnull trigger = 0;
317 a84cbb2a 2004-04-19 devnull line = ss.desc;
318 a84cbb2a 2004-04-19 devnull basepc = ss.value;
319 a84cbb2a 2004-04-19 devnull for(i=s->u.stabs.i+1; stabsym(&fhdr->stabs, i, &ss) >= 0; i++){
320 a84cbb2a 2004-04-19 devnull if(ss.type == N_FUN)
321 a84cbb2a 2004-04-19 devnull basepc = ss.value;
322 a84cbb2a 2004-04-19 devnull if(ss.type == N_SLINE){
323 a84cbb2a 2004-04-19 devnull if(basepc+ss.value >= startpc)
324 a84cbb2a 2004-04-19 devnull trigger = 1;
325 a84cbb2a 2004-04-19 devnull if(trigger && ss.desc >= line){
326 a84cbb2a 2004-04-19 devnull *pc = basepc+ss.value;
327 a84cbb2a 2004-04-19 devnull return 0;
328 a84cbb2a 2004-04-19 devnull }
329 a84cbb2a 2004-04-19 devnull }
330 a84cbb2a 2004-04-19 devnull }
331 a84cbb2a 2004-04-19 devnull return -1;
332 a84cbb2a 2004-04-19 devnull }
333 a84cbb2a 2004-04-19 devnull
334 a84cbb2a 2004-04-19 devnull static int
335 a84cbb2a 2004-04-19 devnull stabslenum(Fhdr *fhdr, Symbol *p, char *name, uint j, Loc l, Symbol *s)
336 a84cbb2a 2004-04-19 devnull {
337 a84cbb2a 2004-04-19 devnull int i;
338 a84cbb2a 2004-04-19 devnull StabSym ss;
339 a84cbb2a 2004-04-19 devnull
340 a84cbb2a 2004-04-19 devnull for(i=p->u.stabs.locals; stabsym(&fhdr->stabs, i, &ss)>=0; i++){
341 a84cbb2a 2004-04-19 devnull if(ss.type == N_FUN && ss.name == nil)
342 a84cbb2a 2004-04-19 devnull break;
343 a84cbb2a 2004-04-19 devnull switch(ss.type){
344 a84cbb2a 2004-04-19 devnull case N_PSYM:
345 a84cbb2a 2004-04-19 devnull case N_LSYM:
346 a84cbb2a 2004-04-19 devnull case N_LCSYM:
347 a84cbb2a 2004-04-19 devnull if(name){
348 a84cbb2a 2004-04-19 devnull if(strcmpcolon(name, ss.name) != 0)
349 a84cbb2a 2004-04-19 devnull break;
350 a84cbb2a 2004-04-19 devnull }else if(l.type){
351 a84cbb2a 2004-04-19 devnull /* wait for now */
352 a84cbb2a 2004-04-19 devnull }else{
353 a84cbb2a 2004-04-19 devnull if(j-- > 0)
354 a84cbb2a 2004-04-19 devnull break;
355 a84cbb2a 2004-04-19 devnull }
356 a84cbb2a 2004-04-19 devnull if(stabcvtsym(&ss, s, p->u.stabs.dir, p->u.stabs.file, i) < 0)
357 a84cbb2a 2004-04-19 devnull return -1;
358 a84cbb2a 2004-04-19 devnull if(s->loc.type == LOFFSET){
359 a84cbb2a 2004-04-19 devnull if(p->u.stabs.frameptr == 0)
360 a84cbb2a 2004-04-19 devnull s->loc.reg = mach->sp;
361 a84cbb2a 2004-04-19 devnull else
362 a84cbb2a 2004-04-19 devnull s->loc.reg = mach->fp;
363 a84cbb2a 2004-04-19 devnull }
364 a84cbb2a 2004-04-19 devnull if(l.type && loccmp(&l, &s->loc) != 0)
365 a84cbb2a 2004-04-19 devnull break;
366 a84cbb2a 2004-04-19 devnull return 0;
367 a84cbb2a 2004-04-19 devnull }
368 a84cbb2a 2004-04-19 devnull }
369 a84cbb2a 2004-04-19 devnull return -1;
370 a84cbb2a 2004-04-19 devnull }
371 a84cbb2a 2004-04-19 devnull
372 a84cbb2a 2004-04-19 devnull static Loc zl;
373 a84cbb2a 2004-04-19 devnull
374 a84cbb2a 2004-04-19 devnull static int
375 a84cbb2a 2004-04-19 devnull stabslookuplsym(Fhdr *fhdr, Symbol *p, char *name, Symbol *s)
376 a84cbb2a 2004-04-19 devnull {
377 a84cbb2a 2004-04-19 devnull return stabslenum(fhdr, p, name, 0, zl, s);
378 a84cbb2a 2004-04-19 devnull }
379 a84cbb2a 2004-04-19 devnull
380 a84cbb2a 2004-04-19 devnull static int
381 a84cbb2a 2004-04-19 devnull stabsindexlsym(Fhdr *fhdr, Symbol *p, uint i, Symbol *s)
382 a84cbb2a 2004-04-19 devnull {
383 a84cbb2a 2004-04-19 devnull return stabslenum(fhdr, p, nil, i, zl, s);
384 a84cbb2a 2004-04-19 devnull }
385 a84cbb2a 2004-04-19 devnull
386 a84cbb2a 2004-04-19 devnull static int
387 a84cbb2a 2004-04-19 devnull stabsfindlsym(Fhdr *fhdr, Symbol *p, Loc l, Symbol *s)
388 a84cbb2a 2004-04-19 devnull {
389 a84cbb2a 2004-04-19 devnull return stabslenum(fhdr, p, nil, 0, l, s);
390 a84cbb2a 2004-04-19 devnull }
391 a84cbb2a 2004-04-19 devnull
392 a84cbb2a 2004-04-19 devnull int
393 a84cbb2a 2004-04-19 devnull symstabs(Fhdr *fp)
394 a84cbb2a 2004-04-19 devnull {
395 a84cbb2a 2004-04-19 devnull if(stabssyminit(fp) < 0)
396 a84cbb2a 2004-04-19 devnull return -1;
397 a84cbb2a 2004-04-19 devnull fp->pc2file = stabspc2file;
398 a84cbb2a 2004-04-19 devnull fp->line2pc = stabsline2pc;
399 a84cbb2a 2004-04-19 devnull fp->lookuplsym = stabslookuplsym;
400 a84cbb2a 2004-04-19 devnull fp->indexlsym = stabsindexlsym;
401 a84cbb2a 2004-04-19 devnull fp->findlsym = stabsfindlsym;
402 a84cbb2a 2004-04-19 devnull return 0;
403 a84cbb2a 2004-04-19 devnull }