Home | History | Annotate | Download | only in dwarf
      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