debug: Add a function for computing the stride of an array.
Make sizeof() return a bool indicating success.
Continue printing slices even if we can't determine the stride.
Ran go fmt.
Change-Id: I9cf3ae3806223dd7b8b420c817f02900fe7a1a05
Reviewed-on: https://go-review.googlesource.com/2684
Reviewed-by: Rob Pike <r@golang.org>
diff --git a/ogle/program/server/print.go b/ogle/program/server/print.go
index 5b69355..01db102 100644
--- a/ogle/program/server/print.go
+++ b/ogle/program/server/print.go
@@ -131,7 +131,7 @@
p.errorf("struct field %s is not a uint", fieldName)
return 0, false
}
- return p.peekUint(addr + address(f.ByteOffset), ut.ByteSize)
+ return p.peekUint(addr+address(f.ByteOffset), ut.ByteSize)
}
// peekIntStructField reads an int in the field fieldName of the struct
@@ -147,7 +147,7 @@
p.errorf("struct field %s is not an int", fieldName)
return 0, false
}
- return p.peekInt(addr + address(f.ByteOffset), it.ByteSize)
+ return p.peekInt(addr+address(f.ByteOffset), it.ByteSize)
}
// setCache initializes the cache to contain the contents of the
@@ -382,14 +382,9 @@
func (p *Printer) printArrayAt(typ *dwarf.ArrayType, a address) {
elemType := typ.Type
length := typ.Count
- stride := typ.StrideBitSize
- if stride > 0 {
- stride /= 8
- } else {
- stride = p.sizeof(elemType)
- if stride < 0 {
- p.errorf("array elements have no known size")
- }
+ stride, ok := p.arrayStride(typ)
+ if !ok {
+ p.errorf("can't determine element size")
}
p.printf("%s{", typ)
n := length
@@ -526,9 +521,9 @@
return
}
elemType := typ.ElemType
- size := p.sizeof(elemType)
- if size < 0 {
- return
+ size, ok := p.sizeof(typ.ElemType)
+ if !ok {
+ p.errorf("can't determine element size")
}
p.printf("%s{", typ)
for i := uint64(0); i < length; i++ {
@@ -570,19 +565,27 @@
}
}
-// sizeof returns the byte size of the type. It returns -1 if no size can be found.
-func (p *Printer) sizeof(typ dwarf.Type) int64 {
+// sizeof returns the byte size of the type.
+func (p *Printer) sizeof(typ dwarf.Type) (address, bool) {
size := typ.Size() // Will be -1 if ByteSize is not set.
if size >= 0 {
- return size
+ return address(size), true
}
switch typ.(type) {
case *dwarf.PtrType:
// This is the only one we know of, but more may arise.
- return int64(p.arch.PointerSize)
+ return address(p.arch.PointerSize), true
}
- p.errorf("unknown size for %s", typ)
- return -1
+ return 0, false
+}
+
+// arrayStride returns the stride of a dwarf.ArrayType in bytes.
+func (p *Printer) arrayStride(t *dwarf.ArrayType) (address, bool) {
+ stride := t.StrideBitSize
+ if stride > 0 {
+ return address(stride / 8), true
+ }
+ return p.sizeof(t.Type)
}
// getField finds the *dwarf.StructField in a dwarf.StructType with name fieldName.