URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [debug/] [dwarf/] [buf.go] - Rev 747
Compare with Previous | Blame | View Log
// 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.// Buffered reading and decoding of DWARF data streams.package dwarfimport ("encoding/binary""strconv")// Data buffer being decoded.type buf struct {dwarf *Dataorder binary.ByteOrdername stringoff Offsetdata []byteaddrsize interr error}func makeBuf(d *Data, name string, off Offset, data []byte, addrsize int) buf {return buf{d, d.order, name, off, data, addrsize, nil}}func (b *buf) uint8() uint8 {if len(b.data) < 1 {b.error("underflow")return 0}val := b.data[0]b.data = b.data[1:]b.off++return val}func (b *buf) bytes(n int) []byte {if len(b.data) < n {b.error("underflow")return nil}data := b.data[0:n]b.data = b.data[n:]b.off += Offset(n)return data}func (b *buf) skip(n int) { b.bytes(n) }func (b *buf) string() string {for i := 0; i < len(b.data); i++ {if b.data[i] == 0 {s := string(b.data[0:i])b.data = b.data[i+1:]b.off += Offset(i + 1)return s}}b.error("underflow")return ""}func (b *buf) uint16() uint16 {a := b.bytes(2)if a == nil {return 0}return b.order.Uint16(a)}func (b *buf) uint32() uint32 {a := b.bytes(4)if a == nil {return 0}return b.order.Uint32(a)}func (b *buf) uint64() uint64 {a := b.bytes(8)if a == nil {return 0}return b.order.Uint64(a)}// Read a varint, which is 7 bits per byte, little endian.// the 0x80 bit means read another byte.func (b *buf) varint() (c uint64, bits uint) {for i := 0; i < len(b.data); i++ {byte := b.data[i]c |= uint64(byte&0x7F) << bitsbits += 7if byte&0x80 == 0 {b.off += Offset(i + 1)b.data = b.data[i+1:]return c, bits}}return 0, 0}// Unsigned int is just a varint.func (b *buf) uint() uint64 {x, _ := b.varint()return x}// Signed int is a sign-extended varint.func (b *buf) int() int64 {ux, bits := b.varint()x := int64(ux)if x&(1<<(bits-1)) != 0 {x |= -1 << bits}return x}// Address-sized uint.func (b *buf) addr() uint64 {switch b.addrsize {case 1:return uint64(b.uint8())case 2:return uint64(b.uint16())case 4:return uint64(b.uint32())case 8:return uint64(b.uint64())}b.error("unknown address size")return 0}func (b *buf) error(s string) {if b.err == nil {b.data = nilb.err = DecodeError{b.name, b.off, s}}}type DecodeError struct {Name stringOffset OffsetErr string}func (e DecodeError) Error() string {return "decoding dwarf section " + e.Name + " at offset 0x" + strconv.FormatInt(int64(e.Offset), 16) + ": " + e.Err}
