// 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.Itoa64(int64(a)) + ")"; } // 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; ) // 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; 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; ) 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", } 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.Itoa64(int64(t)) + ")"; } // 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; )