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"
9 87a478a3 2004-04-21 devnull static void ds2acid(Dwarf*, DwarfSym*, Biobuf*, char*);
11 98cd2746 2004-04-19 devnull static ulong
12 98cd2746 2004-04-19 devnull valof(uint ty, DwarfVal *v)
14 98cd2746 2004-04-19 devnull switch(ty){
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;
24 98cd2746 2004-04-19 devnull static Type*
25 98cd2746 2004-04-19 devnull xnewtype(uint ty, DwarfSym *s)
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;
35 98cd2746 2004-04-19 devnull dwarf2acid(Dwarf *d, Biobuf *b)
37 98cd2746 2004-04-19 devnull DwarfSym s;
39 98cd2746 2004-04-19 devnull /* pass over dwarf section pulling out type info */
41 98cd2746 2004-04-19 devnull if(dwarfenum(d, &s) < 0)
42 98cd2746 2004-04-19 devnull return -1;
44 87a478a3 2004-04-21 devnull while(dwarfnextsymat(d, &s, 0) == 1)
45 87a478a3 2004-04-21 devnull ds2acid(d, &s, b, nil);
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;
53 87a478a3 2004-04-21 devnull static void
54 87a478a3 2004-04-21 devnull ds2acid(Dwarf *d, DwarfSym *s, Biobuf *b, char *fn)
56 87a478a3 2004-04-21 devnull int depth;
59 87a478a3 2004-04-21 devnull depth = s->depth;
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;
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;
70 87a478a3 2004-04-21 devnull case TagCompileUnit:
71 87a478a3 2004-04-21 devnull case TagLexDwarfBlock:
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);
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);
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){
89 87a478a3 2004-04-21 devnull case TypeAddress:
90 87a478a3 2004-04-21 devnull t->printfmt = 'x';
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';
99 87a478a3 2004-04-21 devnull case TypeFloat:
100 87a478a3 2004-04-21 devnull t->printfmt = 'f';
102 87a478a3 2004-04-21 devnull case TypeComplexFloat:
103 87a478a3 2004-04-21 devnull t->printfmt = 'F';
105 87a478a3 2004-04-21 devnull case TypeImaginaryFloat:
106 87a478a3 2004-04-21 devnull t->printfmt = 'i';
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);
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);
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);
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;
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]));
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;
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);
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;
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]));
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);
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)
182 733e9d39 2004-04-21 devnull addsymx(fn, s->attrs.name, typebynum(s->attrs.type, 0));