1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Constants
6
7package dwarf
8
9//go:generate stringer -type Attr -trimprefix=Attr
10
11// An Attr identifies the attribute type in a DWARF Entry's Field.
12type Attr uint32
13
14const (
15	AttrSibling        Attr = 0x01
16	AttrLocation       Attr = 0x02
17	AttrName           Attr = 0x03
18	AttrOrdering       Attr = 0x09
19	AttrByteSize       Attr = 0x0B
20	AttrBitOffset      Attr = 0x0C
21	AttrBitSize        Attr = 0x0D
22	AttrStmtList       Attr = 0x10
23	AttrLowpc          Attr = 0x11
24	AttrHighpc         Attr = 0x12
25	AttrLanguage       Attr = 0x13
26	AttrDiscr          Attr = 0x15
27	AttrDiscrValue     Attr = 0x16
28	AttrVisibility     Attr = 0x17
29	AttrImport         Attr = 0x18
30	AttrStringLength   Attr = 0x19
31	AttrCommonRef      Attr = 0x1A
32	AttrCompDir        Attr = 0x1B
33	AttrConstValue     Attr = 0x1C
34	AttrContainingType Attr = 0x1D
35	AttrDefaultValue   Attr = 0x1E
36	AttrInline         Attr = 0x20
37	AttrIsOptional     Attr = 0x21
38	AttrLowerBound     Attr = 0x22
39	AttrProducer       Attr = 0x25
40	AttrPrototyped     Attr = 0x27
41	AttrReturnAddr     Attr = 0x2A
42	AttrStartScope     Attr = 0x2C
43	AttrStrideSize     Attr = 0x2E
44	AttrUpperBound     Attr = 0x2F
45	AttrAbstractOrigin Attr = 0x31
46	AttrAccessibility  Attr = 0x32
47	AttrAddrClass      Attr = 0x33
48	AttrArtificial     Attr = 0x34
49	AttrBaseTypes      Attr = 0x35
50	AttrCalling        Attr = 0x36
51	AttrCount          Attr = 0x37
52	AttrDataMemberLoc  Attr = 0x38
53	AttrDeclColumn     Attr = 0x39
54	AttrDeclFile       Attr = 0x3A
55	AttrDeclLine       Attr = 0x3B
56	AttrDeclaration    Attr = 0x3C
57	AttrDiscrList      Attr = 0x3D
58	AttrEncoding       Attr = 0x3E
59	AttrExternal       Attr = 0x3F
60	AttrFrameBase      Attr = 0x40
61	AttrFriend         Attr = 0x41
62	AttrIdentifierCase Attr = 0x42
63	AttrMacroInfo      Attr = 0x43
64	AttrNamelistItem   Attr = 0x44
65	AttrPriority       Attr = 0x45
66	AttrSegment        Attr = 0x46
67	AttrSpecification  Attr = 0x47
68	AttrStaticLink     Attr = 0x48
69	AttrType           Attr = 0x49
70	AttrUseLocation    Attr = 0x4A
71	AttrVarParam       Attr = 0x4B
72	AttrVirtuality     Attr = 0x4C
73	AttrVtableElemLoc  Attr = 0x4D
74	// The following are new in DWARF 3.
75	AttrAllocated     Attr = 0x4E
76	AttrAssociated    Attr = 0x4F
77	AttrDataLocation  Attr = 0x50
78	AttrStride        Attr = 0x51
79	AttrEntrypc       Attr = 0x52
80	AttrUseUTF8       Attr = 0x53
81	AttrExtension     Attr = 0x54
82	AttrRanges        Attr = 0x55
83	AttrTrampoline    Attr = 0x56
84	AttrCallColumn    Attr = 0x57
85	AttrCallFile      Attr = 0x58
86	AttrCallLine      Attr = 0x59
87	AttrDescription   Attr = 0x5A
88	AttrBinaryScale   Attr = 0x5B
89	AttrDecimalScale  Attr = 0x5C
90	AttrSmall         Attr = 0x5D
91	AttrDecimalSign   Attr = 0x5E
92	AttrDigitCount    Attr = 0x5F
93	AttrPictureString Attr = 0x60
94	AttrMutable       Attr = 0x61
95	AttrThreadsScaled Attr = 0x62
96	AttrExplicit      Attr = 0x63
97	AttrObjectPointer Attr = 0x64
98	AttrEndianity     Attr = 0x65
99	AttrElemental     Attr = 0x66
100	AttrPure          Attr = 0x67
101	AttrRecursive     Attr = 0x68
102	// The following are new in DWARF 4.
103	AttrSignature      Attr = 0x69
104	AttrMainSubprogram Attr = 0x6A
105	AttrDataBitOffset  Attr = 0x6B
106	AttrConstExpr      Attr = 0x6C
107	AttrEnumClass      Attr = 0x6D
108	AttrLinkageName    Attr = 0x6E
109	// The following are new in DWARF 5.
110	AttrStringLengthBitSize  Attr = 0x6F
111	AttrStringLengthByteSize Attr = 0x70
112	AttrRank                 Attr = 0x71
113	AttrStrOffsetsBase       Attr = 0x72
114	AttrAddrBase             Attr = 0x73
115	AttrRnglistsBase         Attr = 0x74
116	AttrDwoName              Attr = 0x76
117	AttrReference            Attr = 0x77
118	AttrRvalueReference      Attr = 0x78
119	AttrMacros               Attr = 0x79
120	AttrCallAllCalls         Attr = 0x7A
121	AttrCallAllSourceCalls   Attr = 0x7B
122	AttrCallAllTailCalls     Attr = 0x7C
123	AttrCallReturnPC         Attr = 0x7D
124	AttrCallValue            Attr = 0x7E
125	AttrCallOrigin           Attr = 0x7F
126	AttrCallParameter        Attr = 0x80
127	AttrCallPC               Attr = 0x81
128	AttrCallTailCall         Attr = 0x82
129	AttrCallTarget           Attr = 0x83
130	AttrCallTargetClobbered  Attr = 0x84
131	AttrCallDataLocation     Attr = 0x85
132	AttrCallDataValue        Attr = 0x86
133	AttrNoreturn             Attr = 0x87
134	AttrAlignment            Attr = 0x88
135	AttrExportSymbols        Attr = 0x89
136	AttrDeleted              Attr = 0x8A
137	AttrDefaulted            Attr = 0x8B
138	AttrLoclistsBase         Attr = 0x8C
139)
140
141func (a Attr) GoString() string {
142	if str, ok := _Attr_map[a]; ok {
143		return "dwarf.Attr" + str
144	}
145	return "dwarf." + a.String()
146}
147
148// A format is a DWARF data encoding format.
149type format uint32
150
151const (
152	// value formats
153	formAddr        format = 0x01
154	formDwarfBlock2 format = 0x03
155	formDwarfBlock4 format = 0x04
156	formData2       format = 0x05
157	formData4       format = 0x06
158	formData8       format = 0x07
159	formString      format = 0x08
160	formDwarfBlock  format = 0x09
161	formDwarfBlock1 format = 0x0A
162	formData1       format = 0x0B
163	formFlag        format = 0x0C
164	formSdata       format = 0x0D
165	formStrp        format = 0x0E
166	formUdata       format = 0x0F
167	formRefAddr     format = 0x10
168	formRef1        format = 0x11
169	formRef2        format = 0x12
170	formRef4        format = 0x13
171	formRef8        format = 0x14
172	formRefUdata    format = 0x15
173	formIndirect    format = 0x16
174	// The following are new in DWARF 4.
175	formSecOffset   format = 0x17
176	formExprloc     format = 0x18
177	formFlagPresent format = 0x19
178	formRefSig8     format = 0x20
179	// The following are new in DWARF 5.
180	formStrx          format = 0x1A
181	formAddrx         format = 0x1B
182	formRefSup4       format = 0x1C
183	formStrpSup       format = 0x1D
184	formData16        format = 0x1E
185	formLineStrp      format = 0x1F
186	formImplicitConst format = 0x21
187	formLoclistx      format = 0x22
188	formRnglistx      format = 0x23
189	formRefSup8       format = 0x24
190	formStrx1         format = 0x25
191	formStrx2         format = 0x26
192	formStrx3         format = 0x27
193	formStrx4         format = 0x28
194	formAddrx1        format = 0x29
195	formAddrx2        format = 0x2A
196	formAddrx3        format = 0x2B
197	formAddrx4        format = 0x2C
198	// Extensions for multi-file compression (.dwz)
199	// http://www.dwarfstd.org/ShowIssue.php?issue=120604.1
200	formGnuRefAlt  format = 0x1f20
201	formGnuStrpAlt format = 0x1f21
202)
203
204//go:generate stringer -type Tag -trimprefix=Tag
205
206// A Tag is the classification (the type) of an Entry.
207type Tag uint32
208
209const (
210	TagArrayType              Tag = 0x01
211	TagClassType              Tag = 0x02
212	TagEntryPoint             Tag = 0x03
213	TagEnumerationType        Tag = 0x04
214	TagFormalParameter        Tag = 0x05
215	TagImportedDeclaration    Tag = 0x08
216	TagLabel                  Tag = 0x0A
217	TagLexDwarfBlock          Tag = 0x0B
218	TagMember                 Tag = 0x0D
219	TagPointerType            Tag = 0x0F
220	TagReferenceType          Tag = 0x10
221	TagCompileUnit            Tag = 0x11
222	TagStringType             Tag = 0x12
223	TagStructType             Tag = 0x13
224	TagSubroutineType         Tag = 0x15
225	TagTypedef                Tag = 0x16
226	TagUnionType              Tag = 0x17
227	TagUnspecifiedParameters  Tag = 0x18
228	TagVariant                Tag = 0x19
229	TagCommonDwarfBlock       Tag = 0x1A
230	TagCommonInclusion        Tag = 0x1B
231	TagInheritance            Tag = 0x1C
232	TagInlinedSubroutine      Tag = 0x1D
233	TagModule                 Tag = 0x1E
234	TagPtrToMemberType        Tag = 0x1F
235	TagSetType                Tag = 0x20
236	TagSubrangeType           Tag = 0x21
237	TagWithStmt               Tag = 0x22
238	TagAccessDeclaration      Tag = 0x23
239	TagBaseType               Tag = 0x24
240	TagCatchDwarfBlock        Tag = 0x25
241	TagConstType              Tag = 0x26
242	TagConstant               Tag = 0x27
243	TagEnumerator             Tag = 0x28
244	TagFileType               Tag = 0x29
245	TagFriend                 Tag = 0x2A
246	TagNamelist               Tag = 0x2B
247	TagNamelistItem           Tag = 0x2C
248	TagPackedType             Tag = 0x2D
249	TagSubprogram             Tag = 0x2E
250	TagTemplateTypeParameter  Tag = 0x2F
251	TagTemplateValueParameter Tag = 0x30
252	TagThrownType             Tag = 0x31
253	TagTryDwarfBlock          Tag = 0x32
254	TagVariantPart            Tag = 0x33
255	TagVariable               Tag = 0x34
256	TagVolatileType           Tag = 0x35
257	// The following are new in DWARF 3.
258	TagDwarfProcedure  Tag = 0x36
259	TagRestrictType    Tag = 0x37
260	TagInterfaceType   Tag = 0x38
261	TagNamespace       Tag = 0x39
262	TagImportedModule  Tag = 0x3A
263	TagUnspecifiedType Tag = 0x3B
264	TagPartialUnit     Tag = 0x3C
265	TagImportedUnit    Tag = 0x3D
266	TagMutableType     Tag = 0x3E // Later removed from DWARF.
267	TagCondition       Tag = 0x3F
268	TagSharedType      Tag = 0x40
269	// The following are new in DWARF 4.
270	TagTypeUnit            Tag = 0x41
271	TagRvalueReferenceType Tag = 0x42
272	TagTemplateAlias       Tag = 0x43
273	// The following are new in DWARF 5.
274	TagCoarrayType       Tag = 0x44
275	TagGenericSubrange   Tag = 0x45
276	TagDynamicType       Tag = 0x46
277	TagAtomicType        Tag = 0x47
278	TagCallSite          Tag = 0x48
279	TagCallSiteParameter Tag = 0x49
280	TagSkeletonUnit      Tag = 0x4A
281	TagImmutableType     Tag = 0x4B
282)
283
284func (t Tag) GoString() string {
285	if t <= TagTemplateAlias {
286		return "dwarf.Tag" + t.String()
287	}
288	return "dwarf." + t.String()
289}
290
291// Location expression operators.
292// The debug info encodes value locations like 8(R3)
293// as a sequence of these op codes.
294// This package does not implement full expressions;
295// the opPlusUconst operator is expected by the type parser.
296const (
297	opAddr       = 0x03 /* 1 op, const addr */
298	opDeref      = 0x06
299	opConst1u    = 0x08 /* 1 op, 1 byte const */
300	opConst1s    = 0x09 /*	" signed */
301	opConst2u    = 0x0A /* 1 op, 2 byte const  */
302	opConst2s    = 0x0B /*	" signed */
303	opConst4u    = 0x0C /* 1 op, 4 byte const */
304	opConst4s    = 0x0D /*	" signed */
305	opConst8u    = 0x0E /* 1 op, 8 byte const */
306	opConst8s    = 0x0F /*	" signed */
307	opConstu     = 0x10 /* 1 op, LEB128 const */
308	opConsts     = 0x11 /*	" signed */
309	opDup        = 0x12
310	opDrop       = 0x13
311	opOver       = 0x14
312	opPick       = 0x15 /* 1 op, 1 byte stack index */
313	opSwap       = 0x16
314	opRot        = 0x17
315	opXderef     = 0x18
316	opAbs        = 0x19
317	opAnd        = 0x1A
318	opDiv        = 0x1B
319	opMinus      = 0x1C
320	opMod        = 0x1D
321	opMul        = 0x1E
322	opNeg        = 0x1F
323	opNot        = 0x20
324	opOr         = 0x21
325	opPlus       = 0x22
326	opPlusUconst = 0x23 /* 1 op, ULEB128 addend */
327	opShl        = 0x24
328	opShr        = 0x25
329	opShra       = 0x26
330	opXor        = 0x27
331	opSkip       = 0x2F /* 1 op, signed 2-byte constant */
332	opBra        = 0x28 /* 1 op, signed 2-byte constant */
333	opEq         = 0x29
334	opGe         = 0x2A
335	opGt         = 0x2B
336	opLe         = 0x2C
337	opLt         = 0x2D
338	opNe         = 0x2E
339	opLit0       = 0x30
340	/* OpLitN = OpLit0 + N for N = 0..31 */
341	opReg0 = 0x50
342	/* OpRegN = OpReg0 + N for N = 0..31 */
343	opBreg0 = 0x70 /* 1 op, signed LEB128 constant */
344	/* OpBregN = OpBreg0 + N for N = 0..31 */
345	opRegx       = 0x90 /* 1 op, ULEB128 register */
346	opFbreg      = 0x91 /* 1 op, SLEB128 offset */
347	opBregx      = 0x92 /* 2 op, ULEB128 reg; SLEB128 off */
348	opPiece      = 0x93 /* 1 op, ULEB128 size of piece */
349	opDerefSize  = 0x94 /* 1-byte size of data retrieved */
350	opXderefSize = 0x95 /* 1-byte size of data retrieved */
351	opNop        = 0x96
352	// The following are new in DWARF 3.
353	opPushObjAddr    = 0x97
354	opCall2          = 0x98 /* 2-byte offset of DIE */
355	opCall4          = 0x99 /* 4-byte offset of DIE */
356	opCallRef        = 0x9A /* 4- or 8- byte offset of DIE */
357	opFormTLSAddress = 0x9B
358	opCallFrameCFA   = 0x9C
359	opBitPiece       = 0x9D
360	// The following are new in DWARF 4.
361	opImplicitValue = 0x9E
362	opStackValue    = 0x9F
363	// The following a new in DWARF 5.
364	opImplicitPointer = 0xA0
365	opAddrx           = 0xA1
366	opConstx          = 0xA2
367	opEntryValue      = 0xA3
368	opConstType       = 0xA4
369	opRegvalType      = 0xA5
370	opDerefType       = 0xA6
371	opXderefType      = 0xA7
372	opConvert         = 0xA8
373	opReinterpret     = 0xA9
374	/* 0xE0-0xFF reserved for user-specific */
375)
376
377// Basic type encodings -- the value for AttrEncoding in a TagBaseType Entry.
378const (
379	encAddress      = 0x01
380	encBoolean      = 0x02
381	encComplexFloat = 0x03
382	encFloat        = 0x04
383	encSigned       = 0x05
384	encSignedChar   = 0x06
385	encUnsigned     = 0x07
386	encUnsignedChar = 0x08
387	// The following are new in DWARF 3.
388	encImaginaryFloat = 0x09
389	encPackedDecimal  = 0x0A
390	encNumericString  = 0x0B
391	encEdited         = 0x0C
392	encSignedFixed    = 0x0D
393	encUnsignedFixed  = 0x0E
394	encDecimalFloat   = 0x0F
395	// The following are new in DWARF 4.
396	encUTF = 0x10
397	// The following are new in DWARF 5.
398	encUCS   = 0x11
399	encASCII = 0x12
400)
401
402// Statement program standard opcode encodings.
403const (
404	lnsCopy           = 1
405	lnsAdvancePC      = 2
406	lnsAdvanceLine    = 3
407	lnsSetFile        = 4
408	lnsSetColumn      = 5
409	lnsNegateStmt     = 6
410	lnsSetBasicBlock  = 7
411	lnsConstAddPC     = 8
412	lnsFixedAdvancePC = 9
413
414	// DWARF 3
415	lnsSetPrologueEnd   = 10
416	lnsSetEpilogueBegin = 11
417	lnsSetISA           = 12
418)
419
420// Statement program extended opcode encodings.
421const (
422	lneEndSequence = 1
423	lneSetAddress  = 2
424	lneDefineFile  = 3
425
426	// DWARF 4
427	lneSetDiscriminator = 4
428)
429
430// Line table directory directory and file name entry formats.
431// These are new in DWARF 5.
432const (
433	lnctPath           = 0x01
434	lnctDirectoryIndex = 0x02
435	lnctTimestamp      = 0x03
436	lnctSize           = 0x04
437	lnctMD5            = 0x05
438)
439
440// Location list entry codes.
441// These are new in DWARF 5.
442const (
443	lleEndOfList       = 0x00
444	lleBaseAddressx    = 0x01
445	lleStartxEndx      = 0x02
446	lleStartxLength    = 0x03
447	lleOffsetPair      = 0x04
448	lleDefaultLocation = 0x05
449	lleBaseAddress     = 0x06
450	lleStartEnd        = 0x07
451	lleStartLength     = 0x08
452)
453
454// Unit header unit type encodings.
455// These are new in DWARF 5.
456const (
457	utCompile      = 0x01
458	utType         = 0x02
459	utPartial      = 0x03
460	utSkeleton     = 0x04
461	utSplitCompile = 0x05
462	utSplitType    = 0x06
463)
464