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 /*
7 a84cbb2a 2004-04-19 devnull http://sources.redhat.com/gdb/onlinedocs/stabs.html
8 a84cbb2a 2004-04-19 devnull */
9 a84cbb2a 2004-04-19 devnull
10 a84cbb2a 2004-04-19 devnull int
11 a84cbb2a 2004-04-19 devnull stabsym(Stab *stabs, int i, StabSym *sym)
12 a84cbb2a 2004-04-19 devnull {
13 a84cbb2a 2004-04-19 devnull uchar *p;
14 a84cbb2a 2004-04-19 devnull ulong x;
15 a84cbb2a 2004-04-19 devnull
16 a84cbb2a 2004-04-19 devnull if(stabs == nil){
17 a84cbb2a 2004-04-19 devnull werrstr("no stabs");
18 a84cbb2a 2004-04-19 devnull return -1;
19 a84cbb2a 2004-04-19 devnull }
20 a8763864 2004-07-09 devnull if(stabs->e2==0 || stabs->e4==0){
21 a84cbb2a 2004-04-19 devnull werrstr("no data extractors");
22 a84cbb2a 2004-04-19 devnull return -1;
23 a84cbb2a 2004-04-19 devnull }
24 a84cbb2a 2004-04-19 devnull
25 a84cbb2a 2004-04-19 devnull if(i >= stabs->stabsize/12){
26 a84cbb2a 2004-04-19 devnull werrstr("stabs index out of range");
27 a84cbb2a 2004-04-19 devnull return -1;
28 a84cbb2a 2004-04-19 devnull }
29 a84cbb2a 2004-04-19 devnull
30 a84cbb2a 2004-04-19 devnull p = stabs->stabbase+i*12;
31 a84cbb2a 2004-04-19 devnull x = stabs->e4(p);
32 a84cbb2a 2004-04-19 devnull if(x == 0)
33 a84cbb2a 2004-04-19 devnull sym->name = nil;
34 a84cbb2a 2004-04-19 devnull else if(x < stabs->strsize)
35 a84cbb2a 2004-04-19 devnull sym->name = stabs->strbase+x;
36 a84cbb2a 2004-04-19 devnull else{
37 a84cbb2a 2004-04-19 devnull werrstr("bad stabs string index");
38 a84cbb2a 2004-04-19 devnull return -1;
39 a84cbb2a 2004-04-19 devnull }
40 a84cbb2a 2004-04-19 devnull
41 a84cbb2a 2004-04-19 devnull /*
42 a84cbb2a 2004-04-19 devnull * In theory, if name ends with a backslash,
43 a84cbb2a 2004-04-19 devnull * it continues into the next entry. We could
44 a84cbb2a 2004-04-19 devnull * rewrite these in place and then zero the next
45 a84cbb2a 2004-04-19 devnull * few entries, but let's wait until we run across
46 a84cbb2a 2004-04-19 devnull * some system that generates these.
47 a84cbb2a 2004-04-19 devnull */
48 a84cbb2a 2004-04-19 devnull sym->type = p[4];
49 a84cbb2a 2004-04-19 devnull sym->other = p[5];
50 a84cbb2a 2004-04-19 devnull sym->desc = stabs->e2(p+6);
51 a84cbb2a 2004-04-19 devnull sym->value = stabs->e4(p+8);
52 a84cbb2a 2004-04-19 devnull return 0;
53 a84cbb2a 2004-04-19 devnull }