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

