Blame


1 a84cbb2a 2004-04-19 devnull /*
2 a84cbb2a 2004-04-19 devnull * Dwarf info parse and search.
3 a84cbb2a 2004-04-19 devnull */
4 a84cbb2a 2004-04-19 devnull
5 a84cbb2a 2004-04-19 devnull #include <u.h>
6 a84cbb2a 2004-04-19 devnull #include <libc.h>
7 a84cbb2a 2004-04-19 devnull #include <bio.h>
8 a84cbb2a 2004-04-19 devnull #include "elf.h"
9 a84cbb2a 2004-04-19 devnull #include "dwarf.h"
10 a84cbb2a 2004-04-19 devnull
11 a84cbb2a 2004-04-19 devnull enum
12 a84cbb2a 2004-04-19 devnull {
13 a84cbb2a 2004-04-19 devnull DwarfAttrSibling = 0x01,
14 a84cbb2a 2004-04-19 devnull DwarfAttrLocation = 0x02,
15 a84cbb2a 2004-04-19 devnull DwarfAttrName = 0x03,
16 a84cbb2a 2004-04-19 devnull DwarfAttrOrdering = 0x09,
17 a84cbb2a 2004-04-19 devnull DwarfAttrByteSize = 0x0B,
18 a84cbb2a 2004-04-19 devnull DwarfAttrBitOffset = 0x0C,
19 a84cbb2a 2004-04-19 devnull DwarfAttrBitSize = 0x0D,
20 a84cbb2a 2004-04-19 devnull DwarfAttrStmtList = 0x10,
21 a84cbb2a 2004-04-19 devnull DwarfAttrLowpc = 0x11,
22 a84cbb2a 2004-04-19 devnull DwarfAttrHighpc = 0x12,
23 a84cbb2a 2004-04-19 devnull DwarfAttrLanguage = 0x13,
24 a84cbb2a 2004-04-19 devnull DwarfAttrDiscr = 0x15,
25 a84cbb2a 2004-04-19 devnull DwarfAttrDiscrValue = 0x16,
26 a84cbb2a 2004-04-19 devnull DwarfAttrVisibility = 0x17,
27 a84cbb2a 2004-04-19 devnull DwarfAttrImport = 0x18,
28 a84cbb2a 2004-04-19 devnull DwarfAttrStringLength = 0x19,
29 a84cbb2a 2004-04-19 devnull DwarfAttrCommonRef = 0x1A,
30 a84cbb2a 2004-04-19 devnull DwarfAttrCompDir = 0x1B,
31 a84cbb2a 2004-04-19 devnull DwarfAttrConstValue = 0x1C,
32 a84cbb2a 2004-04-19 devnull DwarfAttrContainingType = 0x1D,
33 a84cbb2a 2004-04-19 devnull DwarfAttrDefaultValue = 0x1E,
34 a84cbb2a 2004-04-19 devnull DwarfAttrInline = 0x20,
35 a84cbb2a 2004-04-19 devnull DwarfAttrIsOptional = 0x21,
36 a84cbb2a 2004-04-19 devnull DwarfAttrLowerBound = 0x22,
37 a84cbb2a 2004-04-19 devnull DwarfAttrProducer = 0x25,
38 a84cbb2a 2004-04-19 devnull DwarfAttrPrototyped = 0x27,
39 a84cbb2a 2004-04-19 devnull DwarfAttrReturnAddr = 0x2A,
40 a84cbb2a 2004-04-19 devnull DwarfAttrStartScope = 0x2C,
41 a84cbb2a 2004-04-19 devnull DwarfAttrStrideSize = 0x2E,
42 a84cbb2a 2004-04-19 devnull DwarfAttrUpperBound = 0x2F,
43 a84cbb2a 2004-04-19 devnull DwarfAttrAbstractOrigin = 0x31,
44 a84cbb2a 2004-04-19 devnull DwarfAttrAccessibility = 0x32,
45 a84cbb2a 2004-04-19 devnull DwarfAttrAddrClass = 0x33,
46 a84cbb2a 2004-04-19 devnull DwarfAttrArtificial = 0x34,
47 a84cbb2a 2004-04-19 devnull DwarfAttrBaseTypes = 0x35,
48 a84cbb2a 2004-04-19 devnull DwarfAttrCalling = 0x36,
49 a84cbb2a 2004-04-19 devnull DwarfAttrCount = 0x37,
50 a84cbb2a 2004-04-19 devnull DwarfAttrDataMemberLoc = 0x38,
51 a84cbb2a 2004-04-19 devnull DwarfAttrDeclColumn = 0x39,
52 a84cbb2a 2004-04-19 devnull DwarfAttrDeclFile = 0x3A,
53 a84cbb2a 2004-04-19 devnull DwarfAttrDeclLine = 0x3B,
54 a84cbb2a 2004-04-19 devnull DwarfAttrDeclaration = 0x3C,
55 a84cbb2a 2004-04-19 devnull DwarfAttrDiscrList = 0x3D,
56 a84cbb2a 2004-04-19 devnull DwarfAttrEncoding = 0x3E,
57 a84cbb2a 2004-04-19 devnull DwarfAttrExternal = 0x3F,
58 a84cbb2a 2004-04-19 devnull DwarfAttrFrameBase = 0x40,
59 a84cbb2a 2004-04-19 devnull DwarfAttrFriend = 0x41,
60 a84cbb2a 2004-04-19 devnull DwarfAttrIdentifierCase = 0x42,
61 a84cbb2a 2004-04-19 devnull DwarfAttrMacroInfo = 0x43,
62 a84cbb2a 2004-04-19 devnull DwarfAttrNamelistItem = 0x44,
63 a84cbb2a 2004-04-19 devnull DwarfAttrPriority = 0x45,
64 a84cbb2a 2004-04-19 devnull DwarfAttrSegment = 0x46,
65 a84cbb2a 2004-04-19 devnull DwarfAttrSpecification = 0x47,
66 a84cbb2a 2004-04-19 devnull DwarfAttrStaticLink = 0x48,
67 a84cbb2a 2004-04-19 devnull DwarfAttrType = 0x49,
68 a84cbb2a 2004-04-19 devnull DwarfAttrUseLocation = 0x4A,
69 a84cbb2a 2004-04-19 devnull DwarfAttrVarParam = 0x4B,
70 a84cbb2a 2004-04-19 devnull DwarfAttrVirtuality = 0x4C,
71 a84cbb2a 2004-04-19 devnull DwarfAttrVtableElemLoc = 0x4D,
72 a84cbb2a 2004-04-19 devnull DwarfAttrAllocated = 0x4E,
73 a84cbb2a 2004-04-19 devnull DwarfAttrAssociated = 0x4F,
74 a84cbb2a 2004-04-19 devnull DwarfAttrDataLocation = 0x50,
75 a84cbb2a 2004-04-19 devnull DwarfAttrStride = 0x51,
76 a84cbb2a 2004-04-19 devnull DwarfAttrEntrypc = 0x52,
77 a84cbb2a 2004-04-19 devnull DwarfAttrUseUTF8 = 0x53,
78 a84cbb2a 2004-04-19 devnull DwarfAttrExtension = 0x54,
79 a84cbb2a 2004-04-19 devnull DwarfAttrRanges = 0x55,
80 a84cbb2a 2004-04-19 devnull DwarfAttrTrampoline = 0x56,
81 a84cbb2a 2004-04-19 devnull DwarfAttrCallColumn = 0x57,
82 a84cbb2a 2004-04-19 devnull DwarfAttrCallFile = 0x58,
83 a84cbb2a 2004-04-19 devnull DwarfAttrCallLine = 0x59,
84 a84cbb2a 2004-04-19 devnull DwarfAttrDescription = 0x5A,
85 a84cbb2a 2004-04-19 devnull DwarfAttrMax,
86 a84cbb2a 2004-04-19 devnull
87 a84cbb2a 2004-04-19 devnull FormAddr = 0x01,
88 a84cbb2a 2004-04-19 devnull FormDwarfBlock2 = 0x03,
89 a84cbb2a 2004-04-19 devnull FormDwarfBlock4 = 0x04,
90 a84cbb2a 2004-04-19 devnull FormData2 = 0x05,
91 a84cbb2a 2004-04-19 devnull FormData4 = 0x06,
92 a84cbb2a 2004-04-19 devnull FormData8 = 0x07,
93 a84cbb2a 2004-04-19 devnull FormString = 0x08,
94 a84cbb2a 2004-04-19 devnull FormDwarfBlock = 0x09,
95 a84cbb2a 2004-04-19 devnull FormDwarfBlock1 = 0x0A,
96 a84cbb2a 2004-04-19 devnull FormData1 = 0x0B,
97 a84cbb2a 2004-04-19 devnull FormFlag = 0x0C,
98 a84cbb2a 2004-04-19 devnull FormSdata = 0x0D,
99 a84cbb2a 2004-04-19 devnull FormStrp = 0x0E,
100 a84cbb2a 2004-04-19 devnull FormUdata = 0x0F,
101 a84cbb2a 2004-04-19 devnull FormRefAddr = 0x10,
102 a84cbb2a 2004-04-19 devnull FormRef1 = 0x11,
103 a84cbb2a 2004-04-19 devnull FormRef2 = 0x12,
104 a84cbb2a 2004-04-19 devnull FormRef4 = 0x13,
105 a84cbb2a 2004-04-19 devnull FormRef8 = 0x14,
106 a84cbb2a 2004-04-19 devnull FormRefUdata = 0x15,
107 a84cbb2a 2004-04-19 devnull FormIndirect = 0x16,
108 a84cbb2a 2004-04-19 devnull };
109 a84cbb2a 2004-04-19 devnull
110 a84cbb2a 2004-04-19 devnull static int parseattrs(DwarfBuf*, ulong, DwarfAbbrev*, DwarfAttrs*);
111 a84cbb2a 2004-04-19 devnull static int getulong(DwarfBuf*, int, ulong, ulong*, int*);
112 a84cbb2a 2004-04-19 devnull static int getuchar(DwarfBuf*, int, uchar*);
113 a84cbb2a 2004-04-19 devnull static int getstring(DwarfBuf*, int, char**);
114 a84cbb2a 2004-04-19 devnull static int getblock(DwarfBuf*, int, DwarfBlock*);
115 a84cbb2a 2004-04-19 devnull static int skipform(DwarfBuf*, int);
116 a84cbb2a 2004-04-19 devnull static int constblock(Dwarf*, DwarfBlock*, ulong*);
117 a84cbb2a 2004-04-19 devnull
118 a84cbb2a 2004-04-19 devnull int
119 a84cbb2a 2004-04-19 devnull dwarflookupnameinunit(Dwarf *d, ulong unit, char *name, DwarfSym *s)
120 a84cbb2a 2004-04-19 devnull {
121 a84cbb2a 2004-04-19 devnull if(dwarfenumunit(d, unit, s) < 0)
122 a84cbb2a 2004-04-19 devnull return -1;
123 a84cbb2a 2004-04-19 devnull
124 a84cbb2a 2004-04-19 devnull dwarfnextsym(d, s, 1); /* s is now the CompileUnit */
125 a84cbb2a 2004-04-19 devnull if(dwarfnextsym(d, s, 1) == 1){ /* s is now the first child of the compile unit */
126 a84cbb2a 2004-04-19 devnull do{
127 a84cbb2a 2004-04-19 devnull if(s->attrs.name && strcmp(s->attrs.name, name) == 0)
128 a84cbb2a 2004-04-19 devnull return 0;
129 a84cbb2a 2004-04-19 devnull }while(dwarfnextsym(d, s, 0) == 1);
130 a84cbb2a 2004-04-19 devnull }
131 a84cbb2a 2004-04-19 devnull werrstr("symbol '%s' not found", name);
132 a84cbb2a 2004-04-19 devnull return -1;
133 a84cbb2a 2004-04-19 devnull }
134 a84cbb2a 2004-04-19 devnull
135 a84cbb2a 2004-04-19 devnull
136 a84cbb2a 2004-04-19 devnull int
137 a84cbb2a 2004-04-19 devnull dwarflookupsubname(Dwarf *d, DwarfSym *parent, char *name, DwarfSym *s)
138 a84cbb2a 2004-04-19 devnull {
139 a84cbb2a 2004-04-19 devnull *s = *parent;
140 a84cbb2a 2004-04-19 devnull dwarfnextsym(d, s, 1);
141 a84cbb2a 2004-04-19 devnull if(s->depth == parent->depth+1)
142 a84cbb2a 2004-04-19 devnull do{
143 a84cbb2a 2004-04-19 devnull if(s->attrs.name && strcmp(s->attrs.name, name) == 0)
144 a84cbb2a 2004-04-19 devnull return 0;
145 a84cbb2a 2004-04-19 devnull }while(dwarfnextsym(d, s, 0) == 1);
146 a84cbb2a 2004-04-19 devnull werrstr("symbol '%s' not found", name);
147 a84cbb2a 2004-04-19 devnull return -1;
148 a84cbb2a 2004-04-19 devnull }
149 a84cbb2a 2004-04-19 devnull
150 a84cbb2a 2004-04-19 devnull int
151 a84cbb2a 2004-04-19 devnull dwarflookuptag(Dwarf *d, ulong unit, ulong tag, DwarfSym *s)
152 a84cbb2a 2004-04-19 devnull {
153 a84cbb2a 2004-04-19 devnull if(dwarfenumunit(d, unit, s) < 0)
154 a84cbb2a 2004-04-19 devnull return -1;
155 a84cbb2a 2004-04-19 devnull
156 a84cbb2a 2004-04-19 devnull dwarfnextsym(d, s, 1); /* s is now the CompileUnit */
157 a84cbb2a 2004-04-19 devnull if(s->attrs.tag == tag)
158 a84cbb2a 2004-04-19 devnull return 0;
159 a84cbb2a 2004-04-19 devnull
160 a84cbb2a 2004-04-19 devnull if(dwarfnextsym(d, s, 1) == 1){ /* s is now the first child of the compile unit */
161 a84cbb2a 2004-04-19 devnull do{
162 a84cbb2a 2004-04-19 devnull if(s->attrs.tag == tag)
163 a84cbb2a 2004-04-19 devnull return 0;
164 a84cbb2a 2004-04-19 devnull }while(dwarfnextsym(d, s, 0) == 1);
165 a84cbb2a 2004-04-19 devnull }
166 a84cbb2a 2004-04-19 devnull werrstr("symbol with tag 0x%lux not found", tag);
167 a84cbb2a 2004-04-19 devnull return -1;
168 a84cbb2a 2004-04-19 devnull }
169 a84cbb2a 2004-04-19 devnull
170 a84cbb2a 2004-04-19 devnull int
171 a84cbb2a 2004-04-19 devnull dwarfseeksym(Dwarf *d, ulong unit, ulong off, DwarfSym *s)
172 a84cbb2a 2004-04-19 devnull {
173 a84cbb2a 2004-04-19 devnull if(dwarfenumunit(d, unit, s) < 0)
174 a84cbb2a 2004-04-19 devnull return -1;
175 a84cbb2a 2004-04-19 devnull s->b.p = d->info.data + unit + off;
176 a84cbb2a 2004-04-19 devnull if(dwarfnextsym(d, s, 1) != 1)
177 a84cbb2a 2004-04-19 devnull return -1;
178 a84cbb2a 2004-04-19 devnull return 0;
179 a84cbb2a 2004-04-19 devnull }
180 a84cbb2a 2004-04-19 devnull
181 a84cbb2a 2004-04-19 devnull int
182 a84cbb2a 2004-04-19 devnull dwarflookupfn(Dwarf *d, ulong unit, ulong pc, DwarfSym *s)
183 a84cbb2a 2004-04-19 devnull {
184 a84cbb2a 2004-04-19 devnull if(dwarfenumunit(d, unit, s) < 0)
185 a84cbb2a 2004-04-19 devnull return -1;
186 a84cbb2a 2004-04-19 devnull
187 a84cbb2a 2004-04-19 devnull if(dwarfnextsym(d, s, 1) != 1)
188 a84cbb2a 2004-04-19 devnull return -1;
189 a84cbb2a 2004-04-19 devnull /* s is now the CompileUnit */
190 a84cbb2a 2004-04-19 devnull
191 a84cbb2a 2004-04-19 devnull if(dwarfnextsym(d, s, 1) == 1){ /* s is now the first child of the compile unit */
192 a84cbb2a 2004-04-19 devnull do{
193 a84cbb2a 2004-04-19 devnull if(s->attrs.tag != TagSubprogram)
194 a84cbb2a 2004-04-19 devnull continue;
195 a84cbb2a 2004-04-19 devnull if(s->attrs.lowpc <= pc && pc < s->attrs.highpc)
196 a84cbb2a 2004-04-19 devnull return 0;
197 a84cbb2a 2004-04-19 devnull }while(dwarfnextsym(d, s, 0) == 1);
198 a84cbb2a 2004-04-19 devnull }
199 a84cbb2a 2004-04-19 devnull werrstr("fn containing pc 0x%lux not found", pc);
200 a84cbb2a 2004-04-19 devnull return -1;
201 a84cbb2a 2004-04-19 devnull }
202 a84cbb2a 2004-04-19 devnull
203 a84cbb2a 2004-04-19 devnull int
204 a84cbb2a 2004-04-19 devnull dwarfenumunit(Dwarf *d, ulong unit, DwarfSym *s)
205 a84cbb2a 2004-04-19 devnull {
206 a84cbb2a 2004-04-19 devnull int i;
207 a84cbb2a 2004-04-19 devnull ulong aoff, len;
208 a84cbb2a 2004-04-19 devnull
209 a84cbb2a 2004-04-19 devnull if(unit >= d->info.len){
210 a84cbb2a 2004-04-19 devnull werrstr("dwarf unit address 0x%lux >= 0x%lux out of range", unit, d->info.len);
211 a84cbb2a 2004-04-19 devnull return -1;
212 a84cbb2a 2004-04-19 devnull }
213 a84cbb2a 2004-04-19 devnull memset(s, 0, sizeof *s);
214 a84cbb2a 2004-04-19 devnull memset(&s->b, 0, sizeof s->b);
215 a84cbb2a 2004-04-19 devnull s->b.d = d;
216 a84cbb2a 2004-04-19 devnull s->b.p = d->info.data + unit;
217 a84cbb2a 2004-04-19 devnull s->b.ep = d->info.data + d->info.len;
218 a84cbb2a 2004-04-19 devnull len = dwarfget4(&s->b);
219 a84cbb2a 2004-04-19 devnull s->nextunit = unit + 4 + len;
220 a84cbb2a 2004-04-19 devnull
221 a84cbb2a 2004-04-19 devnull if(s->b.ep - s->b.p < len){
222 a84cbb2a 2004-04-19 devnull badheader:
223 a84cbb2a 2004-04-19 devnull werrstr("bad dwarf unit header at unit 0x%lux", unit);
224 a84cbb2a 2004-04-19 devnull return -1;
225 a84cbb2a 2004-04-19 devnull }
226 a84cbb2a 2004-04-19 devnull s->b.ep = s->b.p+len;
227 a84cbb2a 2004-04-19 devnull if((i=dwarfget2(&s->b)) != 2)
228 a84cbb2a 2004-04-19 devnull goto badheader;
229 a84cbb2a 2004-04-19 devnull aoff = dwarfget4(&s->b);
230 a84cbb2a 2004-04-19 devnull s->b.addrsize = dwarfget1(&s->b);
231 a84cbb2a 2004-04-19 devnull if(d->addrsize == 0)
232 a84cbb2a 2004-04-19 devnull d->addrsize = s->b.addrsize;
233 a84cbb2a 2004-04-19 devnull if(s->b.p == nil)
234 a84cbb2a 2004-04-19 devnull goto badheader;
235 a84cbb2a 2004-04-19 devnull
236 a84cbb2a 2004-04-19 devnull s->aoff = aoff;
237 a84cbb2a 2004-04-19 devnull s->unit = unit;
238 a84cbb2a 2004-04-19 devnull s->depth = 0;
239 a84cbb2a 2004-04-19 devnull return 0;
240 a84cbb2a 2004-04-19 devnull }
241 a84cbb2a 2004-04-19 devnull
242 a84cbb2a 2004-04-19 devnull int
243 a84cbb2a 2004-04-19 devnull dwarfenum(Dwarf *d, DwarfSym *s)
244 a84cbb2a 2004-04-19 devnull {
245 a84cbb2a 2004-04-19 devnull if(dwarfenumunit(d, 0, s) < 0)
246 a84cbb2a 2004-04-19 devnull return -1;
247 a84cbb2a 2004-04-19 devnull s->allunits = 1;
248 a84cbb2a 2004-04-19 devnull return 0;
249 a84cbb2a 2004-04-19 devnull }
250 a84cbb2a 2004-04-19 devnull
251 a84cbb2a 2004-04-19 devnull static int
252 a84cbb2a 2004-04-19 devnull _dwarfnextsym(Dwarf *d, DwarfSym *s)
253 a84cbb2a 2004-04-19 devnull {
254 a84cbb2a 2004-04-19 devnull ulong num;
255 a84cbb2a 2004-04-19 devnull DwarfAbbrev *a;
256 a84cbb2a 2004-04-19 devnull
257 a84cbb2a 2004-04-19 devnull if(s->attrs.haskids)
258 a84cbb2a 2004-04-19 devnull s->depth++;
259 a84cbb2a 2004-04-19 devnull top:
260 a84cbb2a 2004-04-19 devnull if(s->b.p >= s->b.ep){
261 a84cbb2a 2004-04-19 devnull if(s->allunits && s->nextunit < d->info.len){
262 a84cbb2a 2004-04-19 devnull if(dwarfenumunit(d, s->nextunit, s) < 0)
263 a84cbb2a 2004-04-19 devnull return -1;
264 a84cbb2a 2004-04-19 devnull s->allunits = 1;
265 a84cbb2a 2004-04-19 devnull goto top;
266 a84cbb2a 2004-04-19 devnull }
267 a84cbb2a 2004-04-19 devnull return 0;
268 a84cbb2a 2004-04-19 devnull }
269 a84cbb2a 2004-04-19 devnull
270 a84cbb2a 2004-04-19 devnull s->uoff = s->b.p - (d->info.data+s->unit);
271 a84cbb2a 2004-04-19 devnull num = dwarfget128(&s->b);
272 a84cbb2a 2004-04-19 devnull if(num == 0){
273 a84cbb2a 2004-04-19 devnull if(s->depth == 0)
274 a84cbb2a 2004-04-19 devnull return 0;
275 a84cbb2a 2004-04-19 devnull if(s->depth > 0)
276 a84cbb2a 2004-04-19 devnull s->depth--;
277 a84cbb2a 2004-04-19 devnull goto top;
278 a84cbb2a 2004-04-19 devnull }
279 a84cbb2a 2004-04-19 devnull
280 a84cbb2a 2004-04-19 devnull a = dwarfgetabbrev(d, s->aoff, num);
281 a84cbb2a 2004-04-19 devnull if(a == nil){
282 a84cbb2a 2004-04-19 devnull fprint(2, "getabbrev %ud: %r\n", num);
283 a84cbb2a 2004-04-19 devnull return -1;
284 a84cbb2a 2004-04-19 devnull }
285 a84cbb2a 2004-04-19 devnull if(parseattrs(&s->b, s->unit, a, &s->attrs) < 0)
286 a84cbb2a 2004-04-19 devnull return -1;
287 a84cbb2a 2004-04-19 devnull return 1;
288 a84cbb2a 2004-04-19 devnull }
289 a84cbb2a 2004-04-19 devnull
290 a84cbb2a 2004-04-19 devnull int
291 a84cbb2a 2004-04-19 devnull dwarfnextsym(Dwarf *d, DwarfSym *s, int recurse)
292 a84cbb2a 2004-04-19 devnull {
293 a84cbb2a 2004-04-19 devnull int r;
294 a84cbb2a 2004-04-19 devnull int depth;
295 a84cbb2a 2004-04-19 devnull ulong sib;
296 a84cbb2a 2004-04-19 devnull
297 a84cbb2a 2004-04-19 devnull if(recurse)
298 a84cbb2a 2004-04-19 devnull return _dwarfnextsym(d, s);
299 a84cbb2a 2004-04-19 devnull
300 a84cbb2a 2004-04-19 devnull depth = s->depth;
301 a84cbb2a 2004-04-19 devnull if(s->attrs.have.sibling){
302 a84cbb2a 2004-04-19 devnull sib = s->attrs.sibling;
303 a84cbb2a 2004-04-19 devnull if(sib < d->info.len && d->info.data+sib >= s->b.p)
304 a84cbb2a 2004-04-19 devnull s->b.p = d->info.data+sib;
305 a84cbb2a 2004-04-19 devnull s->attrs.haskids = 0;
306 a84cbb2a 2004-04-19 devnull }
307 a84cbb2a 2004-04-19 devnull
308 a84cbb2a 2004-04-19 devnull do{
309 a84cbb2a 2004-04-19 devnull r = _dwarfnextsym(d, s);
310 a84cbb2a 2004-04-19 devnull if(r <= 0)
311 a84cbb2a 2004-04-19 devnull return r;
312 a84cbb2a 2004-04-19 devnull }while(s->depth != depth);
313 a84cbb2a 2004-04-19 devnull if(s->depth < depth)
314 a84cbb2a 2004-04-19 devnull return 0;
315 a84cbb2a 2004-04-19 devnull return 1;
316 a84cbb2a 2004-04-19 devnull }
317 a84cbb2a 2004-04-19 devnull
318 a84cbb2a 2004-04-19 devnull typedef struct Parse Parse;
319 a84cbb2a 2004-04-19 devnull struct Parse {
320 a84cbb2a 2004-04-19 devnull int name;
321 a84cbb2a 2004-04-19 devnull int off;
322 a84cbb2a 2004-04-19 devnull int haveoff;
323 a84cbb2a 2004-04-19 devnull int type;
324 a84cbb2a 2004-04-19 devnull };
325 a84cbb2a 2004-04-19 devnull
326 a84cbb2a 2004-04-19 devnull #define OFFSET(x) offsetof(DwarfAttrs, x), offsetof(DwarfAttrs, have.x)
327 a84cbb2a 2004-04-19 devnull
328 a84cbb2a 2004-04-19 devnull static Parse plist[] = { /* Font Tab 4 */
329 a84cbb2a 2004-04-19 devnull DwarfAttrAbstractOrigin, OFFSET(abstractorigin), TReference,
330 a84cbb2a 2004-04-19 devnull DwarfAttrAccessibility, OFFSET(accessibility), TConstant,
331 a84cbb2a 2004-04-19 devnull DwarfAttrAddrClass, OFFSET(addrclass), TConstant,
332 a84cbb2a 2004-04-19 devnull DwarfAttrArtificial, OFFSET(isartificial), TFlag,
333 a84cbb2a 2004-04-19 devnull DwarfAttrBaseTypes, OFFSET(basetypes), TReference,
334 a84cbb2a 2004-04-19 devnull DwarfAttrBitOffset, OFFSET(bitoffset), TConstant,
335 a84cbb2a 2004-04-19 devnull DwarfAttrBitSize, OFFSET(bitsize), TConstant,
336 a84cbb2a 2004-04-19 devnull DwarfAttrByteSize, OFFSET(bytesize), TConstant,
337 a84cbb2a 2004-04-19 devnull DwarfAttrCalling, OFFSET(calling), TConstant,
338 a84cbb2a 2004-04-19 devnull DwarfAttrCommonRef, OFFSET(commonref), TReference,
339 a84cbb2a 2004-04-19 devnull DwarfAttrCompDir, OFFSET(compdir), TString,
340 a84cbb2a 2004-04-19 devnull DwarfAttrConstValue, OFFSET(constvalue), TString|TConstant|TBlock,
341 a84cbb2a 2004-04-19 devnull DwarfAttrContainingType, OFFSET(containingtype), TReference,
342 a84cbb2a 2004-04-19 devnull DwarfAttrCount, OFFSET(count), TConstant|TReference,
343 a84cbb2a 2004-04-19 devnull DwarfAttrDataMemberLoc, OFFSET(datamemberloc), TBlock|TConstant|TReference,
344 a84cbb2a 2004-04-19 devnull DwarfAttrDeclColumn, OFFSET(declcolumn), TConstant,
345 a84cbb2a 2004-04-19 devnull DwarfAttrDeclFile, OFFSET(declfile), TConstant,
346 a84cbb2a 2004-04-19 devnull DwarfAttrDeclLine, OFFSET(declline), TConstant,
347 a84cbb2a 2004-04-19 devnull DwarfAttrDeclaration, OFFSET(isdeclaration), TFlag,
348 a84cbb2a 2004-04-19 devnull DwarfAttrDefaultValue, OFFSET(defaultvalue), TReference,
349 a84cbb2a 2004-04-19 devnull DwarfAttrDiscr, OFFSET(discr), TReference,
350 a84cbb2a 2004-04-19 devnull DwarfAttrDiscrList, OFFSET(discrlist), TBlock,
351 a84cbb2a 2004-04-19 devnull DwarfAttrDiscrValue, OFFSET(discrvalue), TConstant,
352 a84cbb2a 2004-04-19 devnull DwarfAttrEncoding, OFFSET(encoding), TConstant,
353 a84cbb2a 2004-04-19 devnull DwarfAttrExternal, OFFSET(isexternal), TFlag,
354 a84cbb2a 2004-04-19 devnull DwarfAttrFrameBase, OFFSET(framebase), TBlock|TConstant,
355 a84cbb2a 2004-04-19 devnull DwarfAttrFriend, OFFSET(friend), TReference,
356 a84cbb2a 2004-04-19 devnull DwarfAttrHighpc, OFFSET(highpc), TAddress,
357 a84cbb2a 2004-04-19 devnull DwarfAttrIdentifierCase, OFFSET(identifiercase), TConstant,
358 a84cbb2a 2004-04-19 devnull DwarfAttrImport, OFFSET(import), TReference,
359 a84cbb2a 2004-04-19 devnull DwarfAttrInline, OFFSET(inlined), TConstant,
360 a84cbb2a 2004-04-19 devnull DwarfAttrIsOptional, OFFSET(isoptional), TFlag,
361 a84cbb2a 2004-04-19 devnull DwarfAttrLanguage, OFFSET(language), TConstant,
362 a84cbb2a 2004-04-19 devnull DwarfAttrLocation, OFFSET(location), TBlock|TConstant,
363 a84cbb2a 2004-04-19 devnull DwarfAttrLowerBound, OFFSET(lowerbound), TConstant|TReference,
364 a84cbb2a 2004-04-19 devnull DwarfAttrLowpc, OFFSET(lowpc), TAddress,
365 a84cbb2a 2004-04-19 devnull DwarfAttrMacroInfo, OFFSET(macroinfo), TConstant,
366 a84cbb2a 2004-04-19 devnull DwarfAttrName, OFFSET(name), TString,
367 a84cbb2a 2004-04-19 devnull DwarfAttrNamelistItem, OFFSET(namelistitem), TBlock,
368 a84cbb2a 2004-04-19 devnull DwarfAttrOrdering, OFFSET(ordering), TConstant,
369 a84cbb2a 2004-04-19 devnull DwarfAttrPriority, OFFSET(priority), TReference,
370 a84cbb2a 2004-04-19 devnull DwarfAttrProducer, OFFSET(producer), TString,
371 a84cbb2a 2004-04-19 devnull DwarfAttrPrototyped, OFFSET(isprototyped), TFlag,
372 a84cbb2a 2004-04-19 devnull DwarfAttrRanges, OFFSET(ranges), TReference,
373 a84cbb2a 2004-04-19 devnull DwarfAttrReturnAddr, OFFSET(returnaddr), TBlock|TConstant,
374 a84cbb2a 2004-04-19 devnull DwarfAttrSegment, OFFSET(segment), TBlock|TConstant,
375 a84cbb2a 2004-04-19 devnull DwarfAttrSibling, OFFSET(sibling), TReference,
376 a84cbb2a 2004-04-19 devnull DwarfAttrSpecification, OFFSET(specification), TReference,
377 a84cbb2a 2004-04-19 devnull DwarfAttrStartScope, OFFSET(startscope), TConstant,
378 a84cbb2a 2004-04-19 devnull DwarfAttrStaticLink, OFFSET(staticlink), TBlock|TConstant,
379 a84cbb2a 2004-04-19 devnull DwarfAttrStmtList, OFFSET(stmtlist), TConstant,
380 a84cbb2a 2004-04-19 devnull DwarfAttrStrideSize, OFFSET(stridesize), TConstant,
381 a84cbb2a 2004-04-19 devnull DwarfAttrStringLength, OFFSET(stringlength), TBlock|TConstant,
382 a84cbb2a 2004-04-19 devnull DwarfAttrType, OFFSET(type), TReference,
383 a84cbb2a 2004-04-19 devnull DwarfAttrUpperBound, OFFSET(upperbound), TConstant|TReference,
384 a84cbb2a 2004-04-19 devnull DwarfAttrUseLocation, OFFSET(uselocation), TBlock|TConstant,
385 a84cbb2a 2004-04-19 devnull DwarfAttrVarParam, OFFSET(isvarparam), TFlag,
386 a84cbb2a 2004-04-19 devnull DwarfAttrVirtuality, OFFSET(virtuality), TConstant,
387 a84cbb2a 2004-04-19 devnull DwarfAttrVisibility, OFFSET(visibility), TConstant,
388 a84cbb2a 2004-04-19 devnull DwarfAttrVtableElemLoc, OFFSET(vtableelemloc), TBlock|TReference,
389 a84cbb2a 2004-04-19 devnull };
390 a84cbb2a 2004-04-19 devnull
391 a84cbb2a 2004-04-19 devnull static Parse ptab[DwarfAttrMax];
392 a84cbb2a 2004-04-19 devnull
393 a84cbb2a 2004-04-19 devnull static int
394 a84cbb2a 2004-04-19 devnull parseattrs(DwarfBuf *b, ulong unit, DwarfAbbrev *a, DwarfAttrs *attrs)
395 a84cbb2a 2004-04-19 devnull {
396 a84cbb2a 2004-04-19 devnull int i, f, n, got;
397 a84cbb2a 2004-04-19 devnull static int nbad;
398 a84cbb2a 2004-04-19 devnull void *v;
399 a84cbb2a 2004-04-19 devnull
400 a84cbb2a 2004-04-19 devnull /* initialize ptab first time through for quick access */
401 a84cbb2a 2004-04-19 devnull if(ptab[DwarfAttrName].name != DwarfAttrName)
402 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(plist); i++)
403 a84cbb2a 2004-04-19 devnull ptab[plist[i].name] = plist[i];
404 a84cbb2a 2004-04-19 devnull
405 a84cbb2a 2004-04-19 devnull memset(attrs, 0, sizeof *attrs);
406 a84cbb2a 2004-04-19 devnull attrs->tag = a->tag;
407 a84cbb2a 2004-04-19 devnull attrs->haskids = a->haskids;
408 a84cbb2a 2004-04-19 devnull
409 a84cbb2a 2004-04-19 devnull for(i=0; i<a->nattr; i++){
410 a84cbb2a 2004-04-19 devnull n = a->attr[i].name;
411 a84cbb2a 2004-04-19 devnull f = a->attr[i].form;
412 a84cbb2a 2004-04-19 devnull if(n < 0 || n >= nelem(ptab) || ptab[n].name==0){
413 a84cbb2a 2004-04-19 devnull if(++nbad == 1)
414 a84cbb2a 2004-04-19 devnull fprint(2, "dwarf parse attrs: unexpected attribute name 0x%ux\n", n);
415 a84cbb2a 2004-04-19 devnull return -1;
416 a84cbb2a 2004-04-19 devnull }
417 a84cbb2a 2004-04-19 devnull v = (char*)attrs + ptab[n].off;
418 a84cbb2a 2004-04-19 devnull got = 0;
419 a84cbb2a 2004-04-19 devnull if(f == FormIndirect)
420 a84cbb2a 2004-04-19 devnull f = dwarfget128(b);
421 a84cbb2a 2004-04-19 devnull if((ptab[n].type&(TConstant|TReference|TAddress))
422 a84cbb2a 2004-04-19 devnull && getulong(b, f, unit, v, &got) >= 0)
423 a84cbb2a 2004-04-19 devnull ;
424 a84cbb2a 2004-04-19 devnull else if((ptab[n].type&TFlag) && getuchar(b, f, v) >= 0)
425 a84cbb2a 2004-04-19 devnull got = TFlag;
426 a84cbb2a 2004-04-19 devnull else if((ptab[n].type&TString) && getstring(b, f, v) >= 0)
427 a84cbb2a 2004-04-19 devnull got = TString;
428 a84cbb2a 2004-04-19 devnull else if((ptab[n].type&TBlock) && getblock(b, f, v) >= 0)
429 a84cbb2a 2004-04-19 devnull got = TBlock;
430 a84cbb2a 2004-04-19 devnull else{
431 a84cbb2a 2004-04-19 devnull if(skipform(b, f) < 0){
432 a84cbb2a 2004-04-19 devnull if(++nbad == 1)
433 a84cbb2a 2004-04-19 devnull fprint(2, "dwarf parse attrs: cannot skip form %d\n", f);
434 a84cbb2a 2004-04-19 devnull return -1;
435 a84cbb2a 2004-04-19 devnull }
436 a84cbb2a 2004-04-19 devnull }
437 a84cbb2a 2004-04-19 devnull if(got == TBlock && (ptab[n].type&TConstant))
438 a84cbb2a 2004-04-19 devnull got = constblock(b->d, v, v);
439 a84cbb2a 2004-04-19 devnull *((uchar*)attrs+ptab[n].haveoff) = got;
440 a84cbb2a 2004-04-19 devnull }
441 a84cbb2a 2004-04-19 devnull return 0;
442 a84cbb2a 2004-04-19 devnull }
443 a84cbb2a 2004-04-19 devnull
444 a84cbb2a 2004-04-19 devnull static int
445 a84cbb2a 2004-04-19 devnull getulong(DwarfBuf *b, int form, ulong unit, ulong *u, int *type)
446 a84cbb2a 2004-04-19 devnull {
447 a84cbb2a 2004-04-19 devnull static int nbad;
448 a84cbb2a 2004-04-19 devnull uvlong uv;
449 a84cbb2a 2004-04-19 devnull
450 a84cbb2a 2004-04-19 devnull switch(form){
451 a84cbb2a 2004-04-19 devnull default:
452 a84cbb2a 2004-04-19 devnull return -1;
453 a84cbb2a 2004-04-19 devnull
454 a84cbb2a 2004-04-19 devnull /* addresses */
455 a84cbb2a 2004-04-19 devnull case FormAddr:
456 a84cbb2a 2004-04-19 devnull *type = TAddress;
457 a84cbb2a 2004-04-19 devnull *u = dwarfgetaddr(b);
458 a84cbb2a 2004-04-19 devnull return 0;
459 a84cbb2a 2004-04-19 devnull
460 a84cbb2a 2004-04-19 devnull /* references */
461 a84cbb2a 2004-04-19 devnull case FormRefAddr:
462 a84cbb2a 2004-04-19 devnull /* absolute ref in .debug_info */
463 a84cbb2a 2004-04-19 devnull *type = TReference;
464 a84cbb2a 2004-04-19 devnull *u = dwarfgetaddr(b);
465 a84cbb2a 2004-04-19 devnull return 0;
466 a84cbb2a 2004-04-19 devnull case FormRef1:
467 a84cbb2a 2004-04-19 devnull *u = dwarfget1(b);
468 a84cbb2a 2004-04-19 devnull goto relativeref;
469 a84cbb2a 2004-04-19 devnull case FormRef2:
470 a84cbb2a 2004-04-19 devnull *u = dwarfget2(b);
471 a84cbb2a 2004-04-19 devnull goto relativeref;
472 a84cbb2a 2004-04-19 devnull case FormRef4:
473 a84cbb2a 2004-04-19 devnull *u = dwarfget4(b);
474 a84cbb2a 2004-04-19 devnull goto relativeref;
475 a84cbb2a 2004-04-19 devnull case FormRef8:
476 a84cbb2a 2004-04-19 devnull *u = dwarfget8(b);
477 a84cbb2a 2004-04-19 devnull goto relativeref;
478 a84cbb2a 2004-04-19 devnull case FormRefUdata:
479 a84cbb2a 2004-04-19 devnull *u = dwarfget128(b);
480 a84cbb2a 2004-04-19 devnull relativeref:
481 a84cbb2a 2004-04-19 devnull *u += unit;
482 a84cbb2a 2004-04-19 devnull *type = TReference;
483 a84cbb2a 2004-04-19 devnull return 0;
484 a84cbb2a 2004-04-19 devnull
485 a84cbb2a 2004-04-19 devnull /* constants */
486 a84cbb2a 2004-04-19 devnull case FormData1:
487 a84cbb2a 2004-04-19 devnull *u = dwarfget1(b);
488 a84cbb2a 2004-04-19 devnull goto constant;
489 a84cbb2a 2004-04-19 devnull case FormData2:
490 a84cbb2a 2004-04-19 devnull *u = dwarfget2(b);
491 a84cbb2a 2004-04-19 devnull goto constant;
492 a84cbb2a 2004-04-19 devnull case FormData4:
493 a84cbb2a 2004-04-19 devnull *u = dwarfget4(b);
494 a84cbb2a 2004-04-19 devnull goto constant;
495 a84cbb2a 2004-04-19 devnull case FormData8:
496 a84cbb2a 2004-04-19 devnull uv = dwarfget8(b);
497 a84cbb2a 2004-04-19 devnull *u = uv;
498 a84cbb2a 2004-04-19 devnull if(uv != *u && ++nbad == 1)
499 a84cbb2a 2004-04-19 devnull fprint(2, "dwarf: truncating 64-bit attribute constants\n");
500 a84cbb2a 2004-04-19 devnull goto constant;
501 a84cbb2a 2004-04-19 devnull case FormSdata:
502 a84cbb2a 2004-04-19 devnull *u = dwarfget128s(b);
503 a84cbb2a 2004-04-19 devnull goto constant;
504 a84cbb2a 2004-04-19 devnull case FormUdata:
505 a84cbb2a 2004-04-19 devnull *u = dwarfget128(b);
506 a84cbb2a 2004-04-19 devnull constant:
507 a84cbb2a 2004-04-19 devnull *type = TConstant;
508 a84cbb2a 2004-04-19 devnull return 0;
509 a84cbb2a 2004-04-19 devnull }
510 a84cbb2a 2004-04-19 devnull }
511 a84cbb2a 2004-04-19 devnull
512 a84cbb2a 2004-04-19 devnull static int
513 a84cbb2a 2004-04-19 devnull getuchar(DwarfBuf *b, int form, uchar *u)
514 a84cbb2a 2004-04-19 devnull {
515 a84cbb2a 2004-04-19 devnull switch(form){
516 a84cbb2a 2004-04-19 devnull default:
517 a84cbb2a 2004-04-19 devnull return -1;
518 a84cbb2a 2004-04-19 devnull
519 a84cbb2a 2004-04-19 devnull case FormFlag:
520 a84cbb2a 2004-04-19 devnull *u = dwarfget1(b);
521 a84cbb2a 2004-04-19 devnull return 0;
522 a84cbb2a 2004-04-19 devnull }
523 a84cbb2a 2004-04-19 devnull }
524 a84cbb2a 2004-04-19 devnull
525 a84cbb2a 2004-04-19 devnull static int
526 a84cbb2a 2004-04-19 devnull getstring(DwarfBuf *b, int form, char **s)
527 a84cbb2a 2004-04-19 devnull {
528 a84cbb2a 2004-04-19 devnull static int nbad;
529 a84cbb2a 2004-04-19 devnull ulong u;
530 a84cbb2a 2004-04-19 devnull
531 a84cbb2a 2004-04-19 devnull switch(form){
532 a84cbb2a 2004-04-19 devnull default:
533 a84cbb2a 2004-04-19 devnull return -1;
534 a84cbb2a 2004-04-19 devnull
535 a84cbb2a 2004-04-19 devnull case FormString:
536 a84cbb2a 2004-04-19 devnull *s = dwarfgetstring(b);
537 a84cbb2a 2004-04-19 devnull return 0;
538 a84cbb2a 2004-04-19 devnull
539 a84cbb2a 2004-04-19 devnull case FormStrp:
540 a84cbb2a 2004-04-19 devnull u = dwarfget4(b);
541 a84cbb2a 2004-04-19 devnull if(u >= b->d->str.len){
542 a84cbb2a 2004-04-19 devnull if(++nbad == 1)
543 a84cbb2a 2004-04-19 devnull fprint(2, "dwarf: bad string pointer 0x%lux in attribute\n", u);
544 a84cbb2a 2004-04-19 devnull /* don't return error - maybe can proceed */
545 a84cbb2a 2004-04-19 devnull *s = nil;
546 a84cbb2a 2004-04-19 devnull }else
547 929ba9b9 2004-04-20 devnull *s = (char*)b->d->str.data + u;
548 a84cbb2a 2004-04-19 devnull return 0;
549 a84cbb2a 2004-04-19 devnull
550 a84cbb2a 2004-04-19 devnull }
551 a84cbb2a 2004-04-19 devnull }
552 a84cbb2a 2004-04-19 devnull
553 a84cbb2a 2004-04-19 devnull static int
554 a84cbb2a 2004-04-19 devnull getblock(DwarfBuf *b, int form, DwarfBlock *bl)
555 a84cbb2a 2004-04-19 devnull {
556 a84cbb2a 2004-04-19 devnull ulong n;
557 a84cbb2a 2004-04-19 devnull
558 a84cbb2a 2004-04-19 devnull switch(form){
559 a84cbb2a 2004-04-19 devnull default:
560 a84cbb2a 2004-04-19 devnull return -1;
561 a84cbb2a 2004-04-19 devnull case FormDwarfBlock:
562 a84cbb2a 2004-04-19 devnull n = dwarfget128(b);
563 a84cbb2a 2004-04-19 devnull goto copyn;
564 a84cbb2a 2004-04-19 devnull case FormDwarfBlock1:
565 a84cbb2a 2004-04-19 devnull n = dwarfget1(b);
566 a84cbb2a 2004-04-19 devnull goto copyn;
567 a84cbb2a 2004-04-19 devnull case FormDwarfBlock2:
568 a84cbb2a 2004-04-19 devnull n = dwarfget2(b);
569 a84cbb2a 2004-04-19 devnull goto copyn;
570 a84cbb2a 2004-04-19 devnull case FormDwarfBlock4:
571 a84cbb2a 2004-04-19 devnull n = dwarfget4(b);
572 a84cbb2a 2004-04-19 devnull copyn:
573 a84cbb2a 2004-04-19 devnull bl->data = dwarfgetnref(b, n);
574 a84cbb2a 2004-04-19 devnull bl->len = n;
575 a84cbb2a 2004-04-19 devnull if(bl->data == nil)
576 a84cbb2a 2004-04-19 devnull return -1;
577 a84cbb2a 2004-04-19 devnull return 0;
578 a84cbb2a 2004-04-19 devnull }
579 a84cbb2a 2004-04-19 devnull }
580 a84cbb2a 2004-04-19 devnull
581 a84cbb2a 2004-04-19 devnull static int
582 a84cbb2a 2004-04-19 devnull constblock(Dwarf *d, DwarfBlock *bl, ulong *pval)
583 a84cbb2a 2004-04-19 devnull {
584 a84cbb2a 2004-04-19 devnull DwarfBuf b;
585 a84cbb2a 2004-04-19 devnull
586 a84cbb2a 2004-04-19 devnull memset(&b, 0, sizeof b);
587 a84cbb2a 2004-04-19 devnull b.p = bl->data;
588 a84cbb2a 2004-04-19 devnull b.ep = bl->data+bl->len;
589 a84cbb2a 2004-04-19 devnull b.d = d;
590 a84cbb2a 2004-04-19 devnull
591 a84cbb2a 2004-04-19 devnull switch(dwarfget1(&b)){
592 a84cbb2a 2004-04-19 devnull case OpAddr:
593 a84cbb2a 2004-04-19 devnull *pval = dwarfgetaddr(&b);
594 a84cbb2a 2004-04-19 devnull return TConstant;
595 a84cbb2a 2004-04-19 devnull case OpConst1u:
596 a84cbb2a 2004-04-19 devnull *pval = dwarfget1(&b);
597 a84cbb2a 2004-04-19 devnull return TConstant;
598 a84cbb2a 2004-04-19 devnull case OpConst1s:
599 a84cbb2a 2004-04-19 devnull *pval = (schar)dwarfget1(&b);
600 a84cbb2a 2004-04-19 devnull return TConstant;
601 a84cbb2a 2004-04-19 devnull case OpConst2u:
602 a84cbb2a 2004-04-19 devnull *pval = dwarfget2(&b);
603 a84cbb2a 2004-04-19 devnull return TConstant;
604 a84cbb2a 2004-04-19 devnull case OpConst2s:
605 a84cbb2a 2004-04-19 devnull *pval = (s16int)dwarfget2(&b);
606 a84cbb2a 2004-04-19 devnull return TConstant;
607 a84cbb2a 2004-04-19 devnull case OpConst4u:
608 a84cbb2a 2004-04-19 devnull *pval = dwarfget4(&b);
609 a84cbb2a 2004-04-19 devnull return TConstant;
610 a84cbb2a 2004-04-19 devnull case OpConst4s:
611 a84cbb2a 2004-04-19 devnull *pval = (s32int)dwarfget4(&b);
612 a84cbb2a 2004-04-19 devnull return TConstant;
613 a84cbb2a 2004-04-19 devnull case OpConst8u:
614 a84cbb2a 2004-04-19 devnull *pval = (u64int)dwarfget8(&b);
615 a84cbb2a 2004-04-19 devnull return TConstant;
616 a84cbb2a 2004-04-19 devnull case OpConst8s:
617 a84cbb2a 2004-04-19 devnull *pval = (s64int)dwarfget8(&b);
618 a84cbb2a 2004-04-19 devnull return TConstant;
619 a84cbb2a 2004-04-19 devnull case OpConstu:
620 a84cbb2a 2004-04-19 devnull *pval = dwarfget128(&b);
621 a84cbb2a 2004-04-19 devnull return TConstant;
622 a84cbb2a 2004-04-19 devnull case OpConsts:
623 a84cbb2a 2004-04-19 devnull *pval = dwarfget128s(&b);
624 a84cbb2a 2004-04-19 devnull return TConstant;
625 a84cbb2a 2004-04-19 devnull case OpPlusUconst:
626 a84cbb2a 2004-04-19 devnull *pval = dwarfget128(&b);
627 a84cbb2a 2004-04-19 devnull return TConstant;
628 a84cbb2a 2004-04-19 devnull default:
629 a84cbb2a 2004-04-19 devnull return TBlock;
630 a84cbb2a 2004-04-19 devnull }
631 a84cbb2a 2004-04-19 devnull }
632 a84cbb2a 2004-04-19 devnull
633 a84cbb2a 2004-04-19 devnull /* last resort */
634 a84cbb2a 2004-04-19 devnull static int
635 a84cbb2a 2004-04-19 devnull skipform(DwarfBuf *b, int form)
636 a84cbb2a 2004-04-19 devnull {
637 a84cbb2a 2004-04-19 devnull int type;
638 a84cbb2a 2004-04-19 devnull DwarfVal val;
639 a84cbb2a 2004-04-19 devnull
640 a84cbb2a 2004-04-19 devnull if(getulong(b, form, 0, &val.c, &type) < 0
641 a84cbb2a 2004-04-19 devnull && getuchar(b, form, (uchar*)&val) < 0
642 a84cbb2a 2004-04-19 devnull && getstring(b, form, &val.s) < 0
643 a84cbb2a 2004-04-19 devnull && getblock(b, form, &val.b) < 0)
644 a84cbb2a 2004-04-19 devnull return -1;
645 a84cbb2a 2004-04-19 devnull return 0;
646 a84cbb2a 2004-04-19 devnull }