github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/pkg/debug/dwarf/unit.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 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 asize int 18 vers int 19 is64 bool // True for 64-bit DWARF format 20 } 21 22 // Implement the dataFormat interface. 23 24 func (u *unit) version() int { 25 return u.vers 26 } 27 28 func (u *unit) dwarf64() (bool, bool) { 29 return u.is64, true 30 } 31 32 func (u *unit) addrsize() int { 33 return u.asize 34 } 35 36 func (d *Data) parseUnits() ([]unit, error) { 37 // Count units. 38 nunit := 0 39 b := makeBuf(d, unknownFormat{}, "info", 0, d.info) 40 for len(b.data) > 0 { 41 len := b.uint32() 42 if len == 0xffffffff { 43 len64 := b.uint64() 44 if len64 != uint64(uint32(len64)) { 45 b.error("unit length overflow") 46 break 47 } 48 len = uint32(len64) 49 } 50 b.skip(int(len)) 51 nunit++ 52 } 53 if b.err != nil { 54 return nil, b.err 55 } 56 57 // Again, this time writing them down. 58 b = makeBuf(d, unknownFormat{}, "info", 0, d.info) 59 units := make([]unit, nunit) 60 for i := range units { 61 u := &units[i] 62 u.base = b.off 63 n := b.uint32() 64 if n == 0xffffffff { 65 u.is64 = true 66 n = uint32(b.uint64()) 67 } 68 vers := b.uint16() 69 if vers != 2 && vers != 3 { 70 b.error("unsupported DWARF version " + strconv.Itoa(int(vers))) 71 break 72 } 73 u.vers = int(vers) 74 atable, err := d.parseAbbrev(b.uint32()) 75 if err != nil { 76 if b.err == nil { 77 b.err = err 78 } 79 break 80 } 81 u.atable = atable 82 u.asize = int(b.uint8()) 83 u.off = b.off 84 u.data = b.bytes(int(n - (2 + 4 + 1))) 85 } 86 if b.err != nil { 87 return nil, b.err 88 } 89 return units, nil 90 }