tstabs.c - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
tstabs.c (982B)
---
1 #include <u.h>
2 #include <libc.h>
3 #include <mach.h>
4 #include "stabs.h"
5
6 /*
7 http://sources.redhat.com/gdb/onlinedocs/stabs.html
8 */
9
10 int
11 stabsym(Stab *stabs, int i, StabSym *sym)
12 {
13 uchar *p;
14 ulong x;
15
16 if(stabs == nil){
17 werrstr("no stabs");
18 return -1;
19 }
20 if(stabs->e2==0 || stabs->e4==0){
21 werrstr("no data extractors");
22 return -1;
23 }
24
25 if(i >= stabs->stabsize/12){
26 werrstr("stabs index out of range");
27 return -1;
28 }
29
30 p = stabs->stabbase+i*12;
31 x = stabs->e4(p);
32 if(x == 0)
33 sym->name = nil;
34 else if(x < stabs->strsize)
35 sym->name = stabs->strbase+x;
36 else{
37 werrstr("bad stabs string index");
38 return -1;
39 }
40
41 /*
42 * In theory, if name ends with a backslash,
43 * it continues into the next entry. We could
44 * rewrite these in place and then zero the next
45 * few entries, but let's wait until we run across
46 * some system that generates these.
47 */
48 sym->type = p[4];
49 sym->other = p[5];
50 sym->desc = stabs->e2(p+6);
51 sym->value = stabs->e4(p+8);
52 return 0;
53 }