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 7 package dwarf 8 9 import "strconv" 10 11 // An Attr identifies the attribute type in a DWARF Entry's Field. 12 type Attr uint32 13 14 const ( 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 AttrAllocated Attr = 0x4E 75 AttrAssociated Attr = 0x4F 76 AttrDataLocation Attr = 0x50 77 AttrStride Attr = 0x51 78 AttrEntrypc Attr = 0x52 79 AttrUseUTF8 Attr = 0x53 80 AttrExtension Attr = 0x54 81 AttrRanges Attr = 0x55 82 AttrTrampoline Attr = 0x56 83 AttrCallColumn Attr = 0x57 84 AttrCallFile Attr = 0x58 85 AttrCallLine Attr = 0x59 86 AttrDescription Attr = 0x5A 87 ) 88 89 var attrNames = [...]string{ 90 AttrSibling: "Sibling", 91 AttrLocation: "Location", 92 AttrName: "Name", 93 AttrOrdering: "Ordering", 94 AttrByteSize: "ByteSize", 95 AttrBitOffset: "BitOffset", 96 AttrBitSize: "BitSize", 97 AttrStmtList: "StmtList", 98 AttrLowpc: "Lowpc", 99 AttrHighpc: "Highpc", 100 AttrLanguage: "Language", 101 AttrDiscr: "Discr", 102 AttrDiscrValue: "DiscrValue", 103 AttrVisibility: "Visibility", 104 AttrImport: "Import", 105 AttrStringLength: "StringLength", 106 AttrCommonRef: "CommonRef", 107 AttrCompDir: "CompDir", 108 AttrConstValue: "ConstValue", 109 AttrContainingType: "ContainingType", 110 AttrDefaultValue: "DefaultValue", 111 AttrInline: "Inline", 112 AttrIsOptional: "IsOptional", 113 AttrLowerBound: "LowerBound", 114 AttrProducer: "Producer", 115 AttrPrototyped: "Prototyped", 116 AttrReturnAddr: "ReturnAddr", 117 AttrStartScope: "StartScope", 118 AttrStrideSize: "StrideSize", 119 AttrUpperBound: "UpperBound", 120 AttrAbstractOrigin: "AbstractOrigin", 121 AttrAccessibility: "Accessibility", 122 AttrAddrClass: "AddrClass", 123 AttrArtificial: "Artificial", 124 AttrBaseTypes: "BaseTypes", 125 AttrCalling: "Calling", 126 AttrCount: "Count", 127 AttrDataMemberLoc: "DataMemberLoc", 128 AttrDeclColumn: "DeclColumn", 129 AttrDeclFile: "DeclFile", 130 AttrDeclLine: "DeclLine", 131 AttrDeclaration: "Declaration", 132 AttrDiscrList: "DiscrList", 133 AttrEncoding: "Encoding", 134 AttrExternal: "External", 135 AttrFrameBase: "FrameBase", 136 AttrFriend: "Friend", 137 AttrIdentifierCase: "IdentifierCase", 138 AttrMacroInfo: "MacroInfo", 139 AttrNamelistItem: "NamelistItem", 140 AttrPriority: "Priority", 141 AttrSegment: "Segment", 142 AttrSpecification: "Specification", 143 AttrStaticLink: "StaticLink", 144 AttrType: "Type", 145 AttrUseLocation: "UseLocation", 146 AttrVarParam: "VarParam", 147 AttrVirtuality: "Virtuality", 148 AttrVtableElemLoc: "VtableElemLoc", 149 AttrAllocated: "Allocated", 150 AttrAssociated: "Associated", 151 AttrDataLocation: "DataLocation", 152 AttrStride: "Stride", 153 AttrEntrypc: "Entrypc", 154 AttrUseUTF8: "UseUTF8", 155 AttrExtension: "Extension", 156 AttrRanges: "Ranges", 157 AttrTrampoline: "Trampoline", 158 AttrCallColumn: "CallColumn", 159 AttrCallFile: "CallFile", 160 AttrCallLine: "CallLine", 161 AttrDescription: "Description", 162 } 163 164 func (a Attr) String() string { 165 if int(a) < len(attrNames) { 166 s := attrNames[a] 167 if s != "" { 168 return s 169 } 170 } 171 return strconv.Itoa(int(a)) 172 } 173 174 func (a Attr) GoString() string { 175 if int(a) < len(attrNames) { 176 s := attrNames[a] 177 if s != "" { 178 return "dwarf.Attr" + s 179 } 180 } 181 return "dwarf.Attr(" + strconv.FormatInt(int64(a), 10) + ")" 182 } 183 184 // A format is a DWARF data encoding format. 185 type format uint32 186 187 const ( 188 // value formats 189 formAddr format = 0x01 190 formDwarfBlock2 format = 0x03 191 formDwarfBlock4 format = 0x04 192 formData2 format = 0x05 193 formData4 format = 0x06 194 formData8 format = 0x07 195 formString format = 0x08 196 formDwarfBlock format = 0x09 197 formDwarfBlock1 format = 0x0A 198 formData1 format = 0x0B 199 formFlag format = 0x0C 200 formSdata format = 0x0D 201 formStrp format = 0x0E 202 formUdata format = 0x0F 203 formRefAddr format = 0x10 204 formRef1 format = 0x11 205 formRef2 format = 0x12 206 formRef4 format = 0x13 207 formRef8 format = 0x14 208 formRefUdata format = 0x15 209 formIndirect format = 0x16 210 // The following are new in DWARF 4. 211 formSecOffset format = 0x17 212 formExprloc format = 0x18 213 formFlagPresent format = 0x19 214 formRefSig8 format = 0x20 215 // Extensions for multi-file compression (.dwz) 216 // http://www.dwarfstd.org/ShowIssue.php?issue=120604.1 217 formGnuRefAlt format = 0x1f20 218 formGnuStrpAlt format = 0x1f21 219 ) 220 221 // A Tag is the classification (the type) of an Entry. 222 type Tag uint32 223 224 const ( 225 TagArrayType Tag = 0x01 226 TagClassType Tag = 0x02 227 TagEntryPoint Tag = 0x03 228 TagEnumerationType Tag = 0x04 229 TagFormalParameter Tag = 0x05 230 TagImportedDeclaration Tag = 0x08 231 TagLabel Tag = 0x0A 232 TagLexDwarfBlock Tag = 0x0B 233 TagMember Tag = 0x0D 234 TagPointerType Tag = 0x0F 235 TagReferenceType Tag = 0x10 236 TagCompileUnit Tag = 0x11 237 TagStringType Tag = 0x12 238 TagStructType Tag = 0x13 239 TagSubroutineType Tag = 0x15 240 TagTypedef Tag = 0x16 241 TagUnionType Tag = 0x17 242 TagUnspecifiedParameters Tag = 0x18 243 TagVariant Tag = 0x19 244 TagCommonDwarfBlock Tag = 0x1A 245 TagCommonInclusion Tag = 0x1B 246 TagInheritance Tag = 0x1C 247 TagInlinedSubroutine Tag = 0x1D 248 TagModule Tag = 0x1E 249 TagPtrToMemberType Tag = 0x1F 250 TagSetType Tag = 0x20 251 TagSubrangeType Tag = 0x21 252 TagWithStmt Tag = 0x22 253 TagAccessDeclaration Tag = 0x23 254 TagBaseType Tag = 0x24 255 TagCatchDwarfBlock Tag = 0x25 256 TagConstType Tag = 0x26 257 TagConstant Tag = 0x27 258 TagEnumerator Tag = 0x28 259 TagFileType Tag = 0x29 260 TagFriend Tag = 0x2A 261 TagNamelist Tag = 0x2B 262 TagNamelistItem Tag = 0x2C 263 TagPackedType Tag = 0x2D 264 TagSubprogram Tag = 0x2E 265 TagTemplateTypeParameter Tag = 0x2F 266 TagTemplateValueParameter Tag = 0x30 267 TagThrownType Tag = 0x31 268 TagTryDwarfBlock Tag = 0x32 269 TagVariantPart Tag = 0x33 270 TagVariable Tag = 0x34 271 TagVolatileType Tag = 0x35 272 // The following are new in DWARF 3. 273 TagDwarfProcedure Tag = 0x36 274 TagRestrictType Tag = 0x37 275 TagInterfaceType Tag = 0x38 276 TagNamespace Tag = 0x39 277 TagImportedModule Tag = 0x3A 278 TagUnspecifiedType Tag = 0x3B 279 TagPartialUnit Tag = 0x3C 280 TagImportedUnit Tag = 0x3D 281 TagMutableType Tag = 0x3E // Later removed from DWARF. 282 TagCondition Tag = 0x3F 283 TagSharedType Tag = 0x40 284 // The following are new in DWARF 4. 285 TagTypeUnit Tag = 0x41 286 TagRvalueReferenceType Tag = 0x42 287 TagTemplateAlias Tag = 0x43 288 ) 289 290 var tagNames = [...]string{ 291 TagArrayType: "ArrayType", 292 TagClassType: "ClassType", 293 TagEntryPoint: "EntryPoint", 294 TagEnumerationType: "EnumerationType", 295 TagFormalParameter: "FormalParameter", 296 TagImportedDeclaration: "ImportedDeclaration", 297 TagLabel: "Label", 298 TagLexDwarfBlock: "LexDwarfBlock", 299 TagMember: "Member", 300 TagPointerType: "PointerType", 301 TagReferenceType: "ReferenceType", 302 TagCompileUnit: "CompileUnit", 303 TagStringType: "StringType", 304 TagStructType: "StructType", 305 TagSubroutineType: "SubroutineType", 306 TagTypedef: "Typedef", 307 TagUnionType: "UnionType", 308 TagUnspecifiedParameters: "UnspecifiedParameters", 309 TagVariant: "Variant", 310 TagCommonDwarfBlock: "CommonDwarfBlock", 311 TagCommonInclusion: "CommonInclusion", 312 TagInheritance: "Inheritance", 313 TagInlinedSubroutine: "InlinedSubroutine", 314 TagModule: "Module", 315 TagPtrToMemberType: "PtrToMemberType", 316 TagSetType: "SetType", 317 TagSubrangeType: "SubrangeType", 318 TagWithStmt: "WithStmt", 319 TagAccessDeclaration: "AccessDeclaration", 320 TagBaseType: "BaseType", 321 TagCatchDwarfBlock: "CatchDwarfBlock", 322 TagConstType: "ConstType", 323 TagConstant: "Constant", 324 TagEnumerator: "Enumerator", 325 TagFileType: "FileType", 326 TagFriend: "Friend", 327 TagNamelist: "Namelist", 328 TagNamelistItem: "NamelistItem", 329 TagPackedType: "PackedType", 330 TagSubprogram: "Subprogram", 331 TagTemplateTypeParameter: "TemplateTypeParameter", 332 TagTemplateValueParameter: "TemplateValueParameter", 333 TagThrownType: "ThrownType", 334 TagTryDwarfBlock: "TryDwarfBlock", 335 TagVariantPart: "VariantPart", 336 TagVariable: "Variable", 337 TagVolatileType: "VolatileType", 338 TagDwarfProcedure: "DwarfProcedure", 339 TagRestrictType: "RestrictType", 340 TagInterfaceType: "InterfaceType", 341 TagNamespace: "Namespace", 342 TagImportedModule: "ImportedModule", 343 TagUnspecifiedType: "UnspecifiedType", 344 TagPartialUnit: "PartialUnit", 345 TagImportedUnit: "ImportedUnit", 346 TagMutableType: "MutableType", 347 TagCondition: "Condition", 348 TagSharedType: "SharedType", 349 TagTypeUnit: "TypeUnit", 350 TagRvalueReferenceType: "RvalueReferenceType", 351 TagTemplateAlias: "TemplateAlias", 352 } 353 354 func (t Tag) String() string { 355 if int(t) < len(tagNames) { 356 s := tagNames[t] 357 if s != "" { 358 return s 359 } 360 } 361 return strconv.Itoa(int(t)) 362 } 363 364 func (t Tag) GoString() string { 365 if int(t) < len(tagNames) { 366 s := tagNames[t] 367 if s != "" { 368 return "dwarf.Tag" + s 369 } 370 } 371 return "dwarf.Tag(" + strconv.FormatInt(int64(t), 10) + ")" 372 } 373 374 // Location expression operators. 375 // The debug info encodes value locations like 8(R3) 376 // as a sequence of these op codes. 377 // This package does not implement full expressions; 378 // the opPlusUconst operator is expected by the type parser. 379 const ( 380 opAddr = 0x03 /* 1 op, const addr */ 381 opDeref = 0x06 382 opConst1u = 0x08 /* 1 op, 1 byte const */ 383 opConst1s = 0x09 /* " signed */ 384 opConst2u = 0x0A /* 1 op, 2 byte const */ 385 opConst2s = 0x0B /* " signed */ 386 opConst4u = 0x0C /* 1 op, 4 byte const */ 387 opConst4s = 0x0D /* " signed */ 388 opConst8u = 0x0E /* 1 op, 8 byte const */ 389 opConst8s = 0x0F /* " signed */ 390 opConstu = 0x10 /* 1 op, LEB128 const */ 391 opConsts = 0x11 /* " signed */ 392 opDup = 0x12 393 opDrop = 0x13 394 opOver = 0x14 395 opPick = 0x15 /* 1 op, 1 byte stack index */ 396 opSwap = 0x16 397 opRot = 0x17 398 opXderef = 0x18 399 opAbs = 0x19 400 opAnd = 0x1A 401 opDiv = 0x1B 402 opMinus = 0x1C 403 opMod = 0x1D 404 opMul = 0x1E 405 opNeg = 0x1F 406 opNot = 0x20 407 opOr = 0x21 408 opPlus = 0x22 409 opPlusUconst = 0x23 /* 1 op, ULEB128 addend */ 410 opShl = 0x24 411 opShr = 0x25 412 opShra = 0x26 413 opXor = 0x27 414 opSkip = 0x2F /* 1 op, signed 2-byte constant */ 415 opBra = 0x28 /* 1 op, signed 2-byte constant */ 416 opEq = 0x29 417 opGe = 0x2A 418 opGt = 0x2B 419 opLe = 0x2C 420 opLt = 0x2D 421 opNe = 0x2E 422 opLit0 = 0x30 423 /* OpLitN = OpLit0 + N for N = 0..31 */ 424 opReg0 = 0x50 425 /* OpRegN = OpReg0 + N for N = 0..31 */ 426 opBreg0 = 0x70 /* 1 op, signed LEB128 constant */ 427 /* OpBregN = OpBreg0 + N for N = 0..31 */ 428 opRegx = 0x90 /* 1 op, ULEB128 register */ 429 opFbreg = 0x91 /* 1 op, SLEB128 offset */ 430 opBregx = 0x92 /* 2 op, ULEB128 reg; SLEB128 off */ 431 opPiece = 0x93 /* 1 op, ULEB128 size of piece */ 432 opDerefSize = 0x94 /* 1-byte size of data retrieved */ 433 opXderefSize = 0x95 /* 1-byte size of data retrieved */ 434 opNop = 0x96 435 /* next four new in Dwarf v3 */ 436 opPushObjAddr = 0x97 437 opCall2 = 0x98 /* 2-byte offset of DIE */ 438 opCall4 = 0x99 /* 4-byte offset of DIE */ 439 opCallRef = 0x9A /* 4- or 8- byte offset of DIE */ 440 /* 0xE0-0xFF reserved for user-specific */ 441 ) 442 443 // Basic type encodings -- the value for AttrEncoding in a TagBaseType Entry. 444 const ( 445 encAddress = 0x01 446 encBoolean = 0x02 447 encComplexFloat = 0x03 448 encFloat = 0x04 449 encSigned = 0x05 450 encSignedChar = 0x06 451 encUnsigned = 0x07 452 encUnsignedChar = 0x08 453 encImaginaryFloat = 0x09 454 ) 455 456 // Statement program standard opcode encodings. 457 const ( 458 lnsCopy = 1 459 lnsAdvancePC = 2 460 lnsAdvanceLine = 3 461 lnsSetFile = 4 462 lnsSetColumn = 5 463 lnsNegateStmt = 6 464 lnsSetBasicBlock = 7 465 lnsConstAddPC = 8 466 lnsFixedAdvancePC = 9 467 468 // DWARF 3 469 lnsSetPrologueEnd = 10 470 lnsSetEpilogueBegin = 11 471 lnsSetISA = 12 472 ) 473 474 // Statement program extended opcode encodings. 475 const ( 476 lneEndSequence = 1 477 lneSetAddress = 2 478 lneDefineFile = 3 479 480 // DWARF 4 481 lneSetDiscriminator = 4 482 ) 483