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)