Blame


1 98cd2746 2004-04-19 devnull #include <u.h>
2 98cd2746 2004-04-19 devnull #include <libc.h>
3 98cd2746 2004-04-19 devnull #include <bio.h>
4 98cd2746 2004-04-19 devnull #include <mach.h>
5 98cd2746 2004-04-19 devnull #include <elf.h>
6 98cd2746 2004-04-19 devnull #include <dwarf.h>
7 98cd2746 2004-04-19 devnull #include "dat.h"
8 98cd2746 2004-04-19 devnull
9 87a478a3 2004-04-21 devnull static void ds2acid(Dwarf*, DwarfSym*, Biobuf*, char*);
10 87a478a3 2004-04-21 devnull
11 98cd2746 2004-04-19 devnull static ulong
12 98cd2746 2004-04-19 devnull valof(uint ty, DwarfVal *v)
13 98cd2746 2004-04-19 devnull {
14 98cd2746 2004-04-19 devnull switch(ty){
15 98cd2746 2004-04-19 devnull default:
16 98cd2746 2004-04-19 devnull fmtinstall('H', encodefmt);
17 98cd2746 2004-04-19 devnull fprint(2, "valof %d %.*H\n", ty, v->b.len, v->b.data);
18 98cd2746 2004-04-19 devnull return 0;
19 98cd2746 2004-04-19 devnull case TConstant:
20 98cd2746 2004-04-19 devnull return v->c;
21 98cd2746 2004-04-19 devnull }
22 98cd2746 2004-04-19 devnull }
23 98cd2746 2004-04-19 devnull
24 98cd2746 2004-04-19 devnull static Type*
25 98cd2746 2004-04-19 devnull xnewtype(uint ty, DwarfSym *s)
26 98cd2746 2004-04-19 devnull {
27 98cd2746 2004-04-19 devnull Type *t;
28 98cd2746 2004-04-19 devnull
29 98cd2746 2004-04-19 devnull t = typebynum(s->unit+s->uoff, 0);
30 98cd2746 2004-04-19 devnull t->ty = ty;
31 98cd2746 2004-04-19 devnull return t;
32 98cd2746 2004-04-19 devnull }
33 98cd2746 2004-04-19 devnull
34 98cd2746 2004-04-19 devnull int
35 98cd2746 2004-04-19 devnull dwarf2acid(Dwarf *d, Biobuf *b)
36 98cd2746 2004-04-19 devnull {
37 98cd2746 2004-04-19 devnull DwarfSym s;
38 98cd2746 2004-04-19 devnull
39 98cd2746 2004-04-19 devnull /* pass over dwarf section pulling out type info */
40 98cd2746 2004-04-19 devnull
41 98cd2746 2004-04-19 devnull if(dwarfenum(d, &s) < 0)
42 98cd2746 2004-04-19 devnull return -1;
43 98cd2746 2004-04-19 devnull
44 87a478a3 2004-04-21 devnull while(dwarfnextsymat(d, &s, 0) == 1)
45 87a478a3 2004-04-21 devnull ds2acid(d, &s, b, nil);
46 98cd2746 2004-04-19 devnull
47 87a478a3 2004-04-21 devnull printtypes(b);
48 87a478a3 2004-04-21 devnull dumpsyms(b);
49 87a478a3 2004-04-21 devnull freetypes();
50 87a478a3 2004-04-21 devnull return 0;
51 87a478a3 2004-04-21 devnull }
52 87a478a3 2004-04-21 devnull
53 87a478a3 2004-04-21 devnull static void
54 87a478a3 2004-04-21 devnull ds2acid(Dwarf *d, DwarfSym *s, Biobuf *b, char *fn)
55 87a478a3 2004-04-21 devnull {
56 87a478a3 2004-04-21 devnull int depth;
57 87a478a3 2004-04-21 devnull Type *t;
58 87a478a3 2004-04-21 devnull
59 87a478a3 2004-04-21 devnull depth = s->depth;
60 87a478a3 2004-04-21 devnull
61 87a478a3 2004-04-21 devnull switch(s->attrs.tag){
62 87a478a3 2004-04-21 devnull case TagSubroutineType:
63 87a478a3 2004-04-21 devnull t = xnewtype(Function, s);
64 87a478a3 2004-04-21 devnull goto Recurse;
65 87a478a3 2004-04-21 devnull
66 87a478a3 2004-04-21 devnull case TagSubprogram:
67 87a478a3 2004-04-21 devnull fn = s->attrs.name;
68 87a478a3 2004-04-21 devnull goto Recurse;
69 87a478a3 2004-04-21 devnull
70 87a478a3 2004-04-21 devnull case TagCompileUnit:
71 87a478a3 2004-04-21 devnull case TagLexDwarfBlock:
72 87a478a3 2004-04-21 devnull Recurse:
73 87a478a3 2004-04-21 devnull /* recurse into substructure */
74 87a478a3 2004-04-21 devnull while(dwarfnextsymat(d, s, depth+1) == 1)
75 87a478a3 2004-04-21 devnull ds2acid(d, s, b, fn);
76 87a478a3 2004-04-21 devnull break;
77 87a478a3 2004-04-21 devnull
78 87a478a3 2004-04-21 devnull case TagTypedef:
79 87a478a3 2004-04-21 devnull t = xnewtype(Typedef, s);
80 87a478a3 2004-04-21 devnull t->name = s->attrs.name;
81 87a478a3 2004-04-21 devnull t->sub = typebynum(s->attrs.type, 0);
82 87a478a3 2004-04-21 devnull break;
83 87a478a3 2004-04-21 devnull
84 87a478a3 2004-04-21 devnull case TagBaseType:
85 87a478a3 2004-04-21 devnull t = xnewtype(Base, s);
86 87a478a3 2004-04-21 devnull t->xsizeof = s->attrs.bytesize;
87 87a478a3 2004-04-21 devnull switch(s->attrs.encoding){
88 87a478a3 2004-04-21 devnull default:
89 87a478a3 2004-04-21 devnull case TypeAddress:
90 87a478a3 2004-04-21 devnull t->printfmt = 'x';
91 98cd2746 2004-04-19 devnull break;
92 87a478a3 2004-04-21 devnull case TypeBoolean:
93 87a478a3 2004-04-21 devnull case TypeUnsigned:
94 87a478a3 2004-04-21 devnull case TypeSigned:
95 87a478a3 2004-04-21 devnull case TypeSignedChar:
96 87a478a3 2004-04-21 devnull case TypeUnsignedChar:
97 87a478a3 2004-04-21 devnull t->printfmt = 'd';
98 98cd2746 2004-04-19 devnull break;
99 87a478a3 2004-04-21 devnull case TypeFloat:
100 87a478a3 2004-04-21 devnull t->printfmt = 'f';
101 98cd2746 2004-04-19 devnull break;
102 87a478a3 2004-04-21 devnull case TypeComplexFloat:
103 87a478a3 2004-04-21 devnull t->printfmt = 'F';
104 98cd2746 2004-04-19 devnull break;
105 87a478a3 2004-04-21 devnull case TypeImaginaryFloat:
106 87a478a3 2004-04-21 devnull t->printfmt = 'i';
107 98cd2746 2004-04-19 devnull break;
108 98cd2746 2004-04-19 devnull }
109 87a478a3 2004-04-21 devnull break;
110 98cd2746 2004-04-19 devnull
111 87a478a3 2004-04-21 devnull case TagPointerType:
112 87a478a3 2004-04-21 devnull t = xnewtype(Pointer, s);
113 87a478a3 2004-04-21 devnull t->sub = typebynum(s->attrs.type, 0);
114 87a478a3 2004-04-21 devnull break;
115 98cd2746 2004-04-19 devnull
116 87a478a3 2004-04-21 devnull case TagConstType:
117 87a478a3 2004-04-21 devnull case TagVolatileType:
118 87a478a3 2004-04-21 devnull t = xnewtype(Defer, s);
119 87a478a3 2004-04-21 devnull t->sub = typebynum(s->attrs.type, 0);
120 87a478a3 2004-04-21 devnull break;
121 98cd2746 2004-04-19 devnull
122 87a478a3 2004-04-21 devnull case TagArrayType:
123 87a478a3 2004-04-21 devnull t = xnewtype(Array, s);
124 87a478a3 2004-04-21 devnull t->sub = typebynum(s->attrs.type, 0);
125 87a478a3 2004-04-21 devnull break;
126 87a478a3 2004-04-21 devnull
127 87a478a3 2004-04-21 devnull case TagStructType:
128 87a478a3 2004-04-21 devnull case TagUnionType:
129 87a478a3 2004-04-21 devnull t = xnewtype(Aggr, s);
130 87a478a3 2004-04-21 devnull t->sue = s->attrs.tag==TagStructType ? 's' : 'u';
131 87a478a3 2004-04-21 devnull t->xsizeof = s->attrs.bytesize;
132 87a478a3 2004-04-21 devnull t->suename = s->attrs.name;
133 87a478a3 2004-04-21 devnull t->isunion = s->attrs.tag==TagUnionType;
134 87a478a3 2004-04-21 devnull while(dwarfnextsymat(d, s, depth+1) == 1){
135 87a478a3 2004-04-21 devnull if(s->attrs.tag != TagMember){
136 87a478a3 2004-04-21 devnull ds2acid(d, s, b, fn);
137 98cd2746 2004-04-19 devnull continue;
138 98cd2746 2004-04-19 devnull }
139 87a478a3 2004-04-21 devnull if(!s->attrs.have.name || !s->attrs.have.type)
140 87a478a3 2004-04-21 devnull continue;
141 87a478a3 2004-04-21 devnull if(t->n%32 == 0){
142 87a478a3 2004-04-21 devnull t->tname = erealloc(t->tname, (t->n+32)*sizeof(t->tname[0]));
143 87a478a3 2004-04-21 devnull t->val = erealloc(t->val, (t->n+32)*sizeof(t->val[0]));
144 87a478a3 2004-04-21 devnull t->t = erealloc(t->t, (t->n+32)*sizeof(t->t[0]));
145 87a478a3 2004-04-21 devnull }
146 87a478a3 2004-04-21 devnull t->tname[t->n] = s->attrs.name;
147 87a478a3 2004-04-21 devnull if(t->isunion)
148 87a478a3 2004-04-21 devnull t->val[t->n] = 0;
149 87a478a3 2004-04-21 devnull else
150 87a478a3 2004-04-21 devnull t->val[t->n] = valof(s->attrs.have.datamemberloc, &s->attrs.datamemberloc);
151 87a478a3 2004-04-21 devnull t->t[t->n] = typebynum(s->attrs.type, 0);
152 87a478a3 2004-04-21 devnull t->n++;
153 98cd2746 2004-04-19 devnull }
154 87a478a3 2004-04-21 devnull break;
155 98cd2746 2004-04-19 devnull
156 87a478a3 2004-04-21 devnull case TagEnumerationType:
157 87a478a3 2004-04-21 devnull t = xnewtype(Enum, s);
158 87a478a3 2004-04-21 devnull t->sue = 'e';
159 87a478a3 2004-04-21 devnull t->suename = s->attrs.name;
160 87a478a3 2004-04-21 devnull t->xsizeof = s->attrs.bytesize;
161 87a478a3 2004-04-21 devnull while(dwarfnextsymat(d, s, depth+1) == 1){
162 87a478a3 2004-04-21 devnull if(s->attrs.tag != TagEnumerator){
163 87a478a3 2004-04-21 devnull ds2acid(d, s, b, fn);
164 87a478a3 2004-04-21 devnull continue;
165 87a478a3 2004-04-21 devnull }
166 87a478a3 2004-04-21 devnull if(!s->attrs.have.name || !s->attrs.have.constvalue)
167 87a478a3 2004-04-21 devnull continue;
168 87a478a3 2004-04-21 devnull if(t->n%32 == 0){
169 87a478a3 2004-04-21 devnull t->tname = erealloc(t->tname, (t->n+32)*sizeof(t->tname[0]));
170 87a478a3 2004-04-21 devnull t->val = erealloc(t->val, (t->n+32)*sizeof(t->val[0]));
171 87a478a3 2004-04-21 devnull }
172 87a478a3 2004-04-21 devnull t->tname[t->n] = s->attrs.name;
173 87a478a3 2004-04-21 devnull t->val[t->n] = valof(s->attrs.have.constvalue, &s->attrs.constvalue);
174 87a478a3 2004-04-21 devnull t->n++;
175 87a478a3 2004-04-21 devnull }
176 87a478a3 2004-04-21 devnull break;
177 733e9d39 2004-04-21 devnull
178 733e9d39 2004-04-21 devnull case TagFormalParameter:
179 733e9d39 2004-04-21 devnull case TagVariable:
180 733e9d39 2004-04-21 devnull if(s->attrs.name==nil || s->attrs.type==0)
181 733e9d39 2004-04-21 devnull break;
182 733e9d39 2004-04-21 devnull addsymx(fn, s->attrs.name, typebynum(s->attrs.type, 0));
183 733e9d39 2004-04-21 devnull break;
184 87a478a3 2004-04-21 devnull }
185 98cd2746 2004-04-19 devnull }