// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Constants package dwarf import "strconv" // An Attr identifies the attribute type in a DWARF Entry's Field. type Attr uint32 const ( AttrSibling Attr = 0x01 AttrLocation Attr = 0x02 AttrName Attr = 0x03 AttrOrdering Attr = 0x09 AttrByteSize Attr = 0x0B AttrBitOffset Attr = 0x0C AttrBitSize Attr = 0x0D AttrStmtList Attr = 0x10 AttrLowpc Attr = 0x11 AttrHighpc Attr = 0x12 AttrLanguage Attr = 0x13 AttrDiscr Attr = 0x15 AttrDiscrValue Attr = 0x16 AttrVisibility Attr = 0x17 AttrImport Attr = 0x18 AttrStringLength Attr = 0x19 AttrCommonRef Attr = 0x1A AttrCompDir Attr = 0x1B AttrConstValue Attr = 0x1C AttrContainingType Attr = 0x1D AttrDefaultValue Attr = 0x1E AttrInline Attr = 0x20 AttrIsOptional Attr = 0x21 AttrLowerBound Attr = 0x22 AttrProducer Attr = 0x25 AttrPrototyped Attr = 0x27 AttrReturnAddr Attr = 0x2A AttrStartScope Attr = 0x2C AttrStrideSize Attr = 0x2E AttrUpperBound Attr = 0x2F AttrAbstractOrigin Attr = 0x31 AttrAccessibility Attr = 0x32 AttrAddrClass Attr = 0x33 AttrArtificial Attr = 0x34 AttrBaseTypes Attr = 0x35 AttrCalling Attr = 0x36 AttrCount Attr = 0x37 AttrDataMemberLoc Attr = 0x38 AttrDeclColumn Attr = 0x39 AttrDeclFile Attr = 0x3A AttrDeclLine Attr = 0x3B AttrDeclaration Attr = 0x3C AttrDiscrList Attr = 0x3D AttrEncoding Attr = 0x3E AttrExternal Attr = 0x3F AttrFrameBase Attr = 0x40 AttrFriend Attr = 0x41 AttrIdentifierCase Attr = 0x42 AttrMacroInfo Attr = 0x43 AttrNamelistItem Attr = 0x44 AttrPriority Attr = 0x45 AttrSegment Attr = 0x46 AttrSpecification Attr = 0x47 AttrStaticLink Attr = 0x48 AttrType Attr = 0x49 AttrUseLocation Attr = 0x4A AttrVarParam Attr = 0x4B AttrVirtuality Attr = 0x4C AttrVtableElemLoc Attr = 0x4D AttrAllocated Attr = 0x4E AttrAssociated Attr = 0x4F AttrDataLocation Attr = 0x50 AttrStride Attr = 0x51 AttrEntrypc Attr = 0x52 AttrUseUTF8 Attr = 0x53 AttrExtension Attr = 0x54 AttrRanges Attr = 0x55 AttrTrampoline Attr = 0x56 AttrCallColumn Attr = 0x57 AttrCallFile Attr = 0x58 AttrCallLine Attr = 0x59 AttrDescription Attr = 0x5A ) var attrNames = [...]string{ AttrSibling: "Sibling", AttrLocation: "Location", AttrName: "Name", AttrOrdering: "Ordering", AttrByteSize: "ByteSize", AttrBitOffset: "BitOffset", AttrBitSize: "BitSize", AttrStmtList: "StmtList", AttrLowpc: "Lowpc", AttrHighpc: "Highpc", AttrLanguage: "Language", AttrDiscr: "Discr", AttrDiscrValue: "DiscrValue", AttrVisibility: "Visibility", AttrImport: "Import", AttrStringLength: "StringLength", AttrCommonRef: "CommonRef", AttrCompDir: "CompDir", AttrConstValue: "ConstValue", AttrContainingType: "ContainingType", AttrDefaultValue: "DefaultValue", AttrInline: "Inline", AttrIsOptional: "IsOptional", AttrLowerBound: "LowerBound", AttrProducer: "Producer", AttrPrototyped: "Prototyped", AttrReturnAddr: "ReturnAddr", AttrStartScope: "StartScope", AttrStrideSize: "StrideSize", AttrUpperBound: "UpperBound", AttrAbstractOrigin: "AbstractOrigin", AttrAccessibility: "Accessibility", AttrAddrClass: "AddrClass", AttrArtificial: "Artificial", AttrBaseTypes: "BaseTypes", AttrCalling: "Calling", AttrCount: "Count", AttrDataMemberLoc: "DataMemberLoc", AttrDeclColumn: "DeclColumn", AttrDeclFile: "DeclFile", AttrDeclLine: "DeclLine", AttrDeclaration: "Declaration", AttrDiscrList: "DiscrList", AttrEncoding: "Encoding", AttrExternal: "External", AttrFrameBase: "FrameBase", AttrFriend: "Friend", AttrIdentifierCase: "IdentifierCase", AttrMacroInfo: "MacroInfo", AttrNamelistItem: "NamelistItem", AttrPriority: "Priority", AttrSegment: "Segment", AttrSpecification: "Specification", AttrStaticLink: "StaticLink", AttrType: "Type", AttrUseLocation: "UseLocation", AttrVarParam: "VarParam", AttrVirtuality: "Virtuality", AttrVtableElemLoc: "VtableElemLoc", AttrAllocated: "Allocated", AttrAssociated: "Associated", AttrDataLocation: "DataLocation", AttrStride: "Stride", AttrEntrypc: "Entrypc", AttrUseUTF8: "UseUTF8", AttrExtension: "Extension", AttrRanges: "Ranges", AttrTrampoline: "Trampoline", AttrCallColumn: "CallColumn", AttrCallFile: "CallFile", AttrCallLine: "CallLine", AttrDescription: "Description", } func (a Attr) String() string { if int(a) < len(attrNames) { s := attrNames[a] if s != "" { return s } } return strconv.Itoa(int(a)) } func (a Attr) GoString() string { if int(a) < len(attrNames) { s := attrNames[a] if s != "" { return "dwarf.Attr" + s } } return "dwarf.Attr(" + strconv.FormatInt(int64(a), 10) + ")" } // A format is a DWARF data encoding format. type format uint32 const ( // value formats formAddr format = 0x01 formDwarfBlock2 format = 0x03 formDwarfBlock4 format = 0x04 formData2 format = 0x05 formData4 format = 0x06 formData8 format = 0x07 formString format = 0x08 formDwarfBlock format = 0x09 formDwarfBlock1 format = 0x0A formData1 format = 0x0B formFlag format = 0x0C formSdata format = 0x0D formStrp format = 0x0E formUdata format = 0x0F formRefAddr format = 0x10 formRef1 format = 0x11 formRef2 format = 0x12 formRef4 format = 0x13 formRef8 format = 0x14 formRefUdata format = 0x15 formIndirect format = 0x16 // The following are new in DWARF 4. formSecOffset format = 0x17 formExprloc format = 0x18 formFlagPresent format = 0x19 formRefSig8 format = 0x20 // Extensions for multi-file compression (.dwz) // http://www.dwarfstd.org/ShowIssue.php?issue=120604.1 formGnuRefAlt format = 0x1f20 formGnuStrpAlt format = 0x1f21 ) // A Tag is the classification (the type) of an Entry. type Tag uint32 const ( TagArrayType Tag = 0x01 TagClassType Tag = 0x02 TagEntryPoint Tag = 0x03 TagEnumerationType Tag = 0x04 TagFormalParameter Tag = 0x05 TagImportedDeclaration Tag = 0x08 TagLabel Tag = 0x0A TagLexDwarfBlock Tag = 0x0B TagMember Tag = 0x0D TagPointerType Tag = 0x0F TagReferenceType Tag = 0x10 TagCompileUnit Tag = 0x11 TagStringType Tag = 0x12 TagStructType Tag = 0x13 TagSubroutineType Tag = 0x15 TagTypedef Tag = 0x16 TagUnionType Tag = 0x17 TagUnspecifiedParameters Tag = 0x18 TagVariant Tag = 0x19 TagCommonDwarfBlock Tag = 0x1A TagCommonInclusion Tag = 0x1B TagInheritance Tag = 0x1C TagInlinedSubroutine Tag = 0x1D TagModule Tag = 0x1E TagPtrToMemberType Tag = 0x1F TagSetType Tag = 0x20 TagSubrangeType Tag = 0x21 TagWithStmt Tag = 0x22 TagAccessDeclaration Tag = 0x23 TagBaseType Tag = 0x24 TagCatchDwarfBlock Tag = 0x25 TagConstType Tag = 0x26 TagConstant Tag = 0x27 TagEnumerator Tag = 0x28 TagFileType Tag = 0x29 TagFriend Tag = 0x2A TagNamelist Tag = 0x2B TagNamelistItem Tag = 0x2C TagPackedType Tag = 0x2D TagSubprogram Tag = 0x2E TagTemplateTypeParameter Tag = 0x2F TagTemplateValueParameter Tag = 0x30 TagThrownType Tag = 0x31 TagTryDwarfBlock Tag = 0x32 TagVariantPart Tag = 0x33 TagVariable Tag = 0x34 TagVolatileType Tag = 0x35 // The following are new in DWARF 3. TagDwarfProcedure Tag = 0x36 TagRestrictType Tag = 0x37 TagInterfaceType Tag = 0x38 TagNamespace Tag = 0x39 TagImportedModule Tag = 0x3A TagUnspecifiedType Tag = 0x3B TagPartialUnit Tag = 0x3C TagImportedUnit Tag = 0x3D TagMutableType Tag = 0x3E // Later removed from DWARF. TagCondition Tag = 0x3F TagSharedType Tag = 0x40 // The following are new in DWARF 4. TagTypeUnit Tag = 0x41 TagRvalueReferenceType Tag = 0x42 TagTemplateAlias Tag = 0x43 ) var tagNames = [...]string{ TagArrayType: "ArrayType", TagClassType: "ClassType", TagEntryPoint: "EntryPoint", TagEnumerationType: "EnumerationType", TagFormalParameter: "FormalParameter", TagImportedDeclaration: "ImportedDeclaration", TagLabel: "Label", TagLexDwarfBlock: "LexDwarfBlock", TagMember: "Member", TagPointerType: "PointerType", TagReferenceType: "ReferenceType", TagCompileUnit: "CompileUnit", TagStringType: "StringType", TagStructType: "StructType", TagSubroutineType: "SubroutineType", TagTypedef: "Typedef", TagUnionType: "UnionType", TagUnspecifiedParameters: "UnspecifiedParameters", TagVariant: "Variant", TagCommonDwarfBlock: "CommonDwarfBlock", TagCommonInclusion: "CommonInclusion", TagInheritance: "Inheritance", TagInlinedSubroutine: "InlinedSubroutine", TagModule: "Module", TagPtrToMemberType: "PtrToMemberType", TagSetType: "SetType", TagSubrangeType: "SubrangeType", TagWithStmt: "WithStmt", TagAccessDeclaration: "AccessDeclaration", TagBaseType: "BaseType", TagCatchDwarfBlock: "CatchDwarfBlock", TagConstType: "ConstType", TagConstant: "Constant", TagEnumerator: "Enumerator", TagFileType: "FileType", TagFriend: "Friend", TagNamelist: "Namelist", TagNamelistItem: "NamelistItem", TagPackedType: "PackedType", TagSubprogram: "Subprogram", TagTemplateTypeParameter: "TemplateTypeParameter", TagTemplateValueParameter: "TemplateValueParameter", TagThrownType: "ThrownType", TagTryDwarfBlock: "TryDwarfBlock", TagVariantPart: "VariantPart", TagVariable: "Variable", TagVolatileType: "VolatileType", TagDwarfProcedure: "DwarfProcedure", TagRestrictType: "RestrictType", TagInterfaceType: "InterfaceType", TagNamespace: "Namespace", TagImportedModule: "ImportedModule", TagUnspecifiedType: "UnspecifiedType", TagPartialUnit: "PartialUnit", TagImportedUnit: "ImportedUnit", TagMutableType: "MutableType", TagCondition: "Condition", TagSharedType: "SharedType", TagTypeUnit: "TypeUnit", TagRvalueReferenceType: "RvalueReferenceType", TagTemplateAlias: "TemplateAlias", } func (t Tag) String() string { if int(t) < len(tagNames) { s := tagNames[t] if s != "" { return s } } return strconv.Itoa(int(t)) } func (t Tag) GoString() string { if int(t) < len(tagNames) { s := tagNames[t] if s != "" { return "dwarf.Tag" + s } } return "dwarf.Tag(" + strconv.FormatInt(int64(t), 10) + ")" } // Location expression operators. // The debug info encodes value locations like 8(R3) // as a sequence of these op codes. // This package does not implement full expressions; // the opPlusUconst operator is expected by the type parser. const ( opAddr = 0x03 /* 1 op, const addr */ opDeref = 0x06 opConst1u = 0x08 /* 1 op, 1 byte const */ opConst1s = 0x09 /* " signed */ opConst2u = 0x0A /* 1 op, 2 byte const */ opConst2s = 0x0B /* " signed */ opConst4u = 0x0C /* 1 op, 4 byte const */ opConst4s = 0x0D /* " signed */ opConst8u = 0x0E /* 1 op, 8 byte const */ opConst8s = 0x0F /* " signed */ opConstu = 0x10 /* 1 op, LEB128 const */ opConsts = 0x11 /* " signed */ opDup = 0x12 opDrop = 0x13 opOver = 0x14 opPick = 0x15 /* 1 op, 1 byte stack index */ opSwap = 0x16 opRot = 0x17 opXderef = 0x18 opAbs = 0x19 opAnd = 0x1A opDiv = 0x1B opMinus = 0x1C opMod = 0x1D opMul = 0x1E opNeg = 0x1F opNot = 0x20 opOr = 0x21 opPlus = 0x22 opPlusUconst = 0x23 /* 1 op, ULEB128 addend */ opShl = 0x24 opShr = 0x25 opShra = 0x26 opXor = 0x27 opSkip = 0x2F /* 1 op, signed 2-byte constant */ opBra = 0x28 /* 1 op, signed 2-byte constant */ opEq = 0x29 opGe = 0x2A opGt = 0x2B opLe = 0x2C opLt = 0x2D opNe = 0x2E opLit0 = 0x30 /* OpLitN = OpLit0 + N for N = 0..31 */ opReg0 = 0x50 /* OpRegN = OpReg0 + N for N = 0..31 */ opBreg0 = 0x70 /* 1 op, signed LEB128 constant */ /* OpBregN = OpBreg0 + N for N = 0..31 */ opRegx = 0x90 /* 1 op, ULEB128 register */ opFbreg = 0x91 /* 1 op, SLEB128 offset */ opBregx = 0x92 /* 2 op, ULEB128 reg; SLEB128 off */ opPiece = 0x93 /* 1 op, ULEB128 size of piece */ opDerefSize = 0x94 /* 1-byte size of data retrieved */ opXderefSize = 0x95 /* 1-byte size of data retrieved */ opNop = 0x96 /* next four new in Dwarf v3 */ opPushObjAddr = 0x97 opCall2 = 0x98 /* 2-byte offset of DIE */ opCall4 = 0x99 /* 4-byte offset of DIE */ opCallRef = 0x9A /* 4- or 8- byte offset of DIE */ /* 0xE0-0xFF reserved for user-specific */ ) // Basic type encodings -- the value for AttrEncoding in a TagBaseType Entry. const ( encAddress = 0x01 encBoolean = 0x02 encComplexFloat = 0x03 encFloat = 0x04 encSigned = 0x05 encSignedChar = 0x06 encUnsigned = 0x07 encUnsignedChar = 0x08 encImaginaryFloat = 0x09 ) // Line number opcodes. const ( LineExtendedOp = 0 LineCopy = 1 LineAdvancePC = 2 LineAdvanceLine = 3 LineSetFile = 4 LineSetColumn = 5 LineNegateStmt = 6 LineSetBasicBlock = 7 LineConstAddPC = 8 LineFixedAdvancePC = 9 // next 3 are DWARF 3 LineSetPrologueEnd = 10 LineSetEpilogueBegin = 11 LineSetISA = 12 ) // Line number extended opcodes. const ( LineExtEndSequence = 1 LineExtSetAddress = 2 LineExtDefineFile = 3 // next 1 is DWARF 4 LineExtSetDiscriminator = 4 )