// 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
}
