diff options
| author | Russ Cox <rsc@golang.org> | 2009-09-15 21:58:45 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-09-15 21:58:45 -0700 |
| commit | f249c4114c11b2f236395b08c66afc2a2be4c303 (patch) | |
| tree | 3b579bd5c89109761cd6d7dbe293397fffbfab03 /src/pkg/debug/dwarf/unit.go | |
| parent | aaaa1fc69b33e39284df07d09047494d824395f3 (diff) | |
| download | go-f249c4114c11b2f236395b08c66afc2a2be4c303.tar.xz | |
basic DWARF reading.
R=r
DELTA=949 (949 added, 0 deleted, 0 changed)
OCL=34676
CL=34678
Diffstat (limited to 'src/pkg/debug/dwarf/unit.go')
| -rw-r--r-- | src/pkg/debug/dwarf/unit.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/pkg/debug/dwarf/unit.go b/src/pkg/debug/dwarf/unit.go new file mode 100644 index 0000000000..040151f39d --- /dev/null +++ b/src/pkg/debug/dwarf/unit.go @@ -0,0 +1,63 @@ +// 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. + +package dwarf + +import ( + "os"; + "strconv"; +) + +// DWARF debug info is split into a sequence of compilation units. +// Each unit has its own abbreviation table and address size. + +type unit struct { + base Offset; // byte offset of header within the aggregate info + off Offset; // byte offset of data within the aggregate info + data []byte; + atable abbrevTable; + addrsize int; +} + +func (d *Data) parseUnits() ([]unit, os.Error) { + // Count units. + nunit := 0; + b := makeBuf(d, "info", 0, d.info, 0); + for len(b.data) > 0 { + b.skip(int(b.uint32())); + nunit++; + } + if b.err != nil { + return nil, b.err; + } + + // Again, this time writing them down. + b = makeBuf(d, "info", 0, d.info, 0); + units := make([]unit, nunit); + for i := range units { + u := &units[i]; + u.base = b.off; + n := b.uint32(); + if vers := b.uint16(); vers != 2 { + b.error("unsupported DWARF version " + strconv.Itoa(int(vers))); + break; + } + atable, err := d.parseAbbrev(b.uint32()); + if err != nil { + if b.err == nil { + b.err = err; + } + break; + } + u.atable = atable; + u.addrsize = int(b.uint8()); + u.off = b.off; + u.data = b.bytes(int(n - (2+4+1))); + } + if b.err != nil { + return nil, b.err; + } + return units, nil; +} + |
