src/pkg/debug/dwarf/unit.go - The Go Programming Language

Golang

Source file src/pkg/debug/dwarf/unit.go

     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	package dwarf
     6	
     7	import "strconv"
     8	
     9	// DWARF debug info is split into a sequence of compilation units.
    10	// Each unit has its own abbreviation table and address size.
    11	
    12	type unit struct {
    13		base     Offset // byte offset of header within the aggregate info
    14		off      Offset // byte offset of data within the aggregate info
    15		data     []byte
    16		atable   abbrevTable
    17		addrsize int
    18	}
    19	
    20	func (d *Data) parseUnits() ([]unit, error) {
    21		// Count units.
    22		nunit := 0
    23		b := makeBuf(d, "info", 0, d.info, 0)
    24		for len(b.data) > 0 {
    25			b.skip(int(b.uint32()))
    26			nunit++
    27		}
    28		if b.err != nil {
    29			return nil, b.err
    30		}
    31	
    32		// Again, this time writing them down.
    33		b = makeBuf(d, "info", 0, d.info, 0)
    34		units := make([]unit, nunit)
    35		for i := range units {
    36			u := &units[i]
    37			u.base = b.off
    38			n := b.uint32()
    39			if vers := b.uint16(); vers != 2 {
    40				b.error("unsupported DWARF version " + strconv.Itoa(int(vers)))
    41				break
    42			}
    43			atable, err := d.parseAbbrev(b.uint32())
    44			if err != nil {
    45				if b.err == nil {
    46					b.err = err
    47				}
    48				break
    49			}
    50			u.atable = atable
    51			u.addrsize = int(b.uint8())
    52			u.off = b.off
    53			u.data = b.bytes(int(n - (2 + 4 + 1)))
    54		}
    55		if b.err != nil {
    56			return nil, b.err
    57		}
    58		return units, nil
    59	}