github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/debug/dwarf/entry.go (about) 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 // DWARF debug information entry parser. 6 // An entry is a sequence of data items of a given format. 7 // The first word in the entry is an index into what DWARF 8 // calls the ``abbreviation table.'' An abbreviation is really 9 // just a type descriptor: it's an array of attribute tag/value format pairs. 10 11 package dwarf 12 13 import ( 14 "github.com/shogo82148/std/encoding/binary" 15 ) 16 17 // エントリは、属性/値のペアのシーケンスです。 18 type Entry struct { 19 Offset Offset 20 Tag Tag 21 Children bool 22 Field []Field 23 } 24 25 // Fieldは、[Entry] 内の単一の属性/値ペアです。 26 // 27 // 値は、DWARFによって定義されたいくつかの「属性クラス」のうちの1つです。 28 // 各クラスに対応するGoの型は次のとおりです。 29 // 30 // DWARFクラス Goの型 クラス 31 // ----------- ------- ----- 32 // address uint64 ClassAddress 33 // block []byte ClassBlock 34 // constant int64 ClassConstant 35 // flag bool ClassFlag 36 // reference 37 // to info dwarf.Offset ClassReference 38 // to type unit uint64 ClassReferenceSig 39 // string string ClassString 40 // exprloc []byte ClassExprLoc 41 // lineptr int64 ClassLinePtr 42 // loclistptr int64 ClassLocListPtr 43 // macptr int64 ClassMacPtr 44 // rangelistptr int64 ClassRangeListPtr 45 // 46 // 識別できないまたはベンダー定義の属性の場合、[Class] は [ClassUnknown] になります。 47 type Field struct { 48 Attr Attr 49 Val any 50 Class Class 51 } 52 53 // Classは、属性値のDWARF 4クラスです。 54 // 55 // 一般的に、特定の属性の値は、DWARFによって定義されたいくつかの可能なクラスのうちの1つを取ることができます。 56 // それぞれのクラスは、属性のわずかに異なる解釈につながります。 57 // 58 // DWARFバージョン4は、以前のDWARFバージョンよりも属性値クラスを細かく区別します。 59 // リーダーは、以前のDWARFバージョンの粗いクラスを、適切なDWARF 4クラスに明確に区別します。 60 // たとえば、DWARF 2は、定数だけでなくすべてのタイプのセクションオフセットに対して「constant」を使用しますが、 61 // リーダーは、セクションオフセットを参照するDWARF 2ファイルの属性を、Class*Ptrクラスの1つに正規化します。 62 // これらのクラスは、DWARF 3でのみ定義されていたにもかかわらずです。 63 type Class int 64 65 const ( 66 // ClassUnknownは、未知のDWARFクラスの値を表します。 67 ClassUnknown Class = iota 68 69 // ClassAddressは、ターゲットマシン上のアドレスであるuint64型の値を表します。 70 ClassAddress 71 72 // ClassBlockは、属性に依存する[]byte型の値を表します。 73 ClassBlock 74 75 // ClassConstantは、定数であるint64型の値を表します。 76 // この定数の解釈は、属性に依存します。 77 ClassConstant 78 79 // ClassExprLocは、エンコードされたDWARF式またはロケーション記述を含む[]byte型の値を表します。 80 ClassExprLoc 81 82 // ClassFlagは、bool型の値を表します。 83 ClassFlag 84 85 // ClassLinePtrは、int64オフセットである値を表します。 86 // このオフセットは、"line"セクション内の位置を指します。 87 ClassLinePtr 88 89 // ClassLocListPtrは、int64オフセットである値を表します。 90 // このオフセットは、"loclist"セクション内の位置を指します。 91 ClassLocListPtr 92 93 // ClassMacPtrは、int64オフセットである値を表します。 94 // このオフセットは、"mac"セクション内の位置を指します。 95 ClassMacPtr 96 97 // ClassRangeListPtrは、int64オフセットである値を表します。 98 // このオフセットは、"rangelist"セクション内の位置を指します。 99 ClassRangeListPtr 100 101 // ClassReferenceは、infoセクション内のEntryのオフセットを表す値を表します。 102 // (Reader.Seekで使用するため)。 103 // DWARF仕様は、ClassReferenceとClassReferenceSigをクラス"reference"に結合します。 104 ClassReference 105 106 // ClassReferenceSigは、型Entryを参照するuint64型のシグネチャを表す値を表します。 107 ClassReferenceSig 108 109 // ClassStringは、文字列を表す値を表します。 110 // コンパイルユニットがAttrUseUTF8フラグ(強く推奨)を指定している場合、 111 // 文字列値はUTF-8でエンコードされます。それ以外の場合、エンコーディングは未指定です。 112 ClassString 113 114 // ClassReferenceAltは、代替オブジェクトファイルのDWARF "info"セクション内のオフセットを表すint64型の値を表します。 115 ClassReferenceAlt 116 117 // ClassStringAltは、代替オブジェクトファイルのDWARF文字列セクション内のオフセットを表すint64型の値を表します。 118 ClassStringAlt 119 120 // ClassAddrPtrは、"addr"セクション内のint64オフセットである値を表します。 121 ClassAddrPtr 122 123 // ClassLocListは、"loclists"セクション内のint64オフセットである値を表します。 124 ClassLocList 125 126 // ClassRngListは、"rnglists"セクションのベースからのuint64オフセットを表す値を表します。 127 ClassRngList 128 129 // ClassRngListsPtrは、"rnglists"セクション内のint64オフセットである値を表します。 130 // これらは、ClassRngList値のベースとして使用されます。 131 ClassRngListsPtr 132 133 // ClassStrOffsetsPtrは、"str_offsets"セクション内のint64オフセットである値を表します。 134 ClassStrOffsetsPtr 135 ) 136 137 func (i Class) GoString() string 138 139 // Valは、[Entry] 内の属性 [Attr] に関連付けられた値を返します。 140 // そのような属性が存在しない場合は、nilを返します。 141 // 142 // 一般的なイディオムは、nilの返却値のチェックを、 143 // 期待される動的型を持つ値のチェックと統合することです。例えば、以下のようになります。 144 // 145 // v, ok := e.Val(AttrSibling).(int64) 146 func (e *Entry) Val(a Attr) any 147 148 // AttrFieldは、Entry内の属性 [Attr] に関連付けられた [Field] を返します。 149 // そのような属性が存在しない場合は、nilを返します。 150 func (e *Entry) AttrField(a Attr) *Field 151 152 // Offsetは、DWARF情報内の [Entry] の位置を表します。 153 // ([Reader.Seek] を参照してください。) 154 type Offset uint32 155 156 // Readerは、DWARF「info」セクションから [Entry] 構造体を読み取ることを可能にします。 157 // [Entry] 構造体はツリー形式で配置されています。[Reader.Next] 関数は、 158 // ツリーの先行順序の走査から連続するエントリを返します。 159 // エントリに子がある場合、そのChildrenフィールドはtrueになり、子は 160 // [Tag] 0の [Entry] で終了します。 161 type Reader struct { 162 b buf 163 d *Data 164 err error 165 unit int 166 lastUnit bool 167 lastChildren bool 168 lastSibling Offset 169 cu *Entry 170 } 171 172 // Readerは、[Data] のための新しいReaderを返します。 173 // このリーダーは、DWARF「info」セクションのバイトオフセット0に位置しています。 174 func (d *Data) Reader() *Reader 175 176 // AddressSizeは、現在のコンパイルユニットのアドレスのバイト数を返します。 177 func (r *Reader) AddressSize() int 178 179 // ByteOrderは、現在のコンパイルユニットのバイトオーダーを返します。 180 func (r *Reader) ByteOrder() binary.ByteOrder 181 182 // Seekは、エンコードされたエントリストリーム内のオフセットoffに [Reader] を配置します。 183 // オフセット0は最初のエントリを示すために使用できます。 184 func (r *Reader) Seek(off Offset) 185 186 // Nextは、エンコードされたエントリストリームから次のエントリを読み取ります。 187 // セクションの終わりに達した場合、nil、nilを返します。 188 // 現在のオフセットが無効であるか、オフセットのデータを有効な [Entry] としてデコードできない場合、エラーを返します。 189 func (r *Reader) Next() (*Entry, error) 190 191 // SkipChildrenは、[Reader.Next] によって返された最後の [Entry] に関連付けられた子エントリをスキップします。 192 // その [Entry] に子がない場合、または [Reader.Next] が呼び出されていない場合、SkipChildrenは何もしません。 193 func (r *Reader) SkipChildren() 194 195 // SeekPCは、pcを含むコンパイルユニットの [Entry] を返し、 196 // そのユニットの子を読み取るためにリーダーを配置します。 197 // pcがどのユニットにも含まれていない場合、SeekPCは [ErrUnknownPC] を返し、 198 // リーダーの位置は未定義です。 199 // 200 // コンパイルユニットが実行可能ファイルの複数の領域を記述できるため、 201 // SeekPCは最悪の場合、すべてのコンパイルユニットのすべての範囲を検索する必要があります。 202 // SeekPCの各呼び出しは、前回の呼び出しのコンパイルユニットから検索を開始するため、 203 // 一般的には、PCをソートすると、連続する高速なPC検索を行う場合に効果的です。 204 // 呼び出し元が繰り返し高速なPC検索を行いたい場合は、Rangesメソッドを使用して適切なインデックスを構築する必要があります。 205 func (r *Reader) SeekPC(pc uint64) (*Entry, error) 206 207 // Rangesは、eによってカバーされるPC範囲、つまり[low, high)のペアのスライスを返します。 208 // [TagCompileUnit] や [TagSubprogram] など、一部のエントリタイプのみがPC範囲を持っています。 209 // それ以外の場合、エラーを返さずにnilを返します。 210 func (d *Data) Ranges(e *Entry) ([][2]uint64, error)