mirror of
https://github.com/golang/go
synced 2024-11-17 16:14:42 -07:00
cmd/link, cmd/internal/obj: use encoding/binary for varint
This code was written before the c2go toolchain conversion. Replace the handwritten varint encoding routines and the handwritten unsigned-to-signed conversions with calls to encoding/binary. Passes toolstash-check. Change-Id: I30d7f408cde3772ee98a3825e83075c4e1ec96d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/171769 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
c70a7849af
commit
134ef176f0
@ -6,6 +6,7 @@ package obj
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"cmd/internal/src"
|
"cmd/internal/src"
|
||||||
|
"encoding/binary"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -14,13 +15,6 @@ const (
|
|||||||
EpilogueBegin // overload "is_stmt" to include epilogue_end
|
EpilogueBegin // overload "is_stmt" to include epilogue_end
|
||||||
)
|
)
|
||||||
|
|
||||||
func addvarint(d *Pcdata, v uint32) {
|
|
||||||
for ; v >= 0x80; v >>= 7 {
|
|
||||||
d.P = append(d.P, uint8(v|0x80))
|
|
||||||
}
|
|
||||||
d.P = append(d.P, uint8(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
// funcpctab writes to dst a pc-value table mapping the code in func to the values
|
// funcpctab writes to dst a pc-value table mapping the code in func to the values
|
||||||
// returned by valfunc parameterized by arg. The invocation of valfunc to update the
|
// returned by valfunc parameterized by arg. The invocation of valfunc to update the
|
||||||
// current value is, for each p,
|
// current value is, for each p,
|
||||||
@ -52,8 +46,8 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(*
|
|||||||
ctxt.Logf("%6x %6d %v\n", uint64(pc), val, func_.Func.Text)
|
ctxt.Logf("%6x %6d %v\n", uint64(pc), val, func_.Func.Text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buf := make([]byte, binary.MaxVarintLen32)
|
||||||
started := false
|
started := false
|
||||||
var delta uint32
|
|
||||||
for p := func_.Func.Text; p != nil; p = p.Link {
|
for p := func_.Func.Text; p != nil; p = p.Link {
|
||||||
// Update val. If it's not changing, keep going.
|
// Update val. If it's not changing, keep going.
|
||||||
val = valfunc(ctxt, func_, val, p, 0, arg)
|
val = valfunc(ctxt, func_, val, p, 0, arg)
|
||||||
@ -97,17 +91,15 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(*
|
|||||||
}
|
}
|
||||||
|
|
||||||
if started {
|
if started {
|
||||||
addvarint(dst, uint32((p.Pc-pc)/int64(ctxt.Arch.MinLC)))
|
pcdelta := (p.Pc - pc) / int64(ctxt.Arch.MinLC)
|
||||||
|
n := binary.PutUvarint(buf, uint64(pcdelta))
|
||||||
|
dst.P = append(dst.P, buf[:n]...)
|
||||||
pc = p.Pc
|
pc = p.Pc
|
||||||
}
|
}
|
||||||
|
|
||||||
delta = uint32(val) - uint32(oldval)
|
delta := val - oldval
|
||||||
if delta>>31 != 0 {
|
n := binary.PutVarint(buf, int64(delta))
|
||||||
delta = 1 | ^(delta << 1)
|
dst.P = append(dst.P, buf[:n]...)
|
||||||
} else {
|
|
||||||
delta <<= 1
|
|
||||||
}
|
|
||||||
addvarint(dst, delta)
|
|
||||||
oldval = val
|
oldval = val
|
||||||
started = true
|
started = true
|
||||||
val = valfunc(ctxt, func_, val, p, 1, arg)
|
val = valfunc(ctxt, func_, val, p, 1, arg)
|
||||||
@ -117,8 +109,14 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(*
|
|||||||
if dbg {
|
if dbg {
|
||||||
ctxt.Logf("%6x done\n", uint64(func_.Func.Text.Pc+func_.Size))
|
ctxt.Logf("%6x done\n", uint64(func_.Func.Text.Pc+func_.Size))
|
||||||
}
|
}
|
||||||
addvarint(dst, uint32((func_.Size-pc)/int64(ctxt.Arch.MinLC)))
|
v := (func_.Size - pc) / int64(ctxt.Arch.MinLC)
|
||||||
addvarint(dst, 0) // terminator
|
if v < 0 {
|
||||||
|
ctxt.Diag("negative pc offset: %v", v)
|
||||||
|
}
|
||||||
|
n := binary.PutUvarint(buf, uint64(v))
|
||||||
|
dst.P = append(dst.P, buf[:n]...)
|
||||||
|
// add terminating varint-encoded 0, which is just 0
|
||||||
|
dst.P = append(dst.P, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
if dbg {
|
if dbg {
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"cmd/internal/src"
|
"cmd/internal/src"
|
||||||
"cmd/internal/sys"
|
"cmd/internal/sys"
|
||||||
"cmd/link/internal/sym"
|
"cmd/link/internal/sym"
|
||||||
|
"encoding/binary"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -17,22 +18,6 @@ import (
|
|||||||
|
|
||||||
// iteration over encoded pcdata tables.
|
// iteration over encoded pcdata tables.
|
||||||
|
|
||||||
func getvarint(pp *[]byte) uint32 {
|
|
||||||
v := uint32(0)
|
|
||||||
p := *pp
|
|
||||||
for shift := 0; ; shift += 7 {
|
|
||||||
v |= uint32(p[0]&0x7F) << uint(shift)
|
|
||||||
tmp4 := p
|
|
||||||
p = p[1:]
|
|
||||||
if tmp4[0]&0x80 == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*pp = p
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func pciternext(it *Pciter) {
|
func pciternext(it *Pciter) {
|
||||||
it.pc = it.nextpc
|
it.pc = it.nextpc
|
||||||
if it.done != 0 {
|
if it.done != 0 {
|
||||||
@ -44,21 +29,28 @@ func pciternext(it *Pciter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// value delta
|
// value delta
|
||||||
v := getvarint(&it.p)
|
val, n := binary.Varint(it.p)
|
||||||
|
if n <= 0 {
|
||||||
|
log.Fatalf("bad value varint in pciternext: read %v", n)
|
||||||
|
}
|
||||||
|
it.p = it.p[n:]
|
||||||
|
|
||||||
if v == 0 && it.start == 0 {
|
if val == 0 && it.start == 0 {
|
||||||
it.done = 1
|
it.done = 1
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
it.start = 0
|
it.start = 0
|
||||||
dv := int32(v>>1) ^ (int32(v<<31) >> 31)
|
it.value += int32(val)
|
||||||
it.value += dv
|
|
||||||
|
|
||||||
// pc delta
|
// pc delta
|
||||||
v = getvarint(&it.p)
|
pc, n := binary.Uvarint(it.p)
|
||||||
|
if n <= 0 {
|
||||||
|
log.Fatalf("bad pc varint in pciternext: read %v", n)
|
||||||
|
}
|
||||||
|
it.p = it.p[n:]
|
||||||
|
|
||||||
it.nextpc = it.pc + v*it.pcscale
|
it.nextpc = it.pc + uint32(pc)*it.pcscale
|
||||||
}
|
}
|
||||||
|
|
||||||
func pciterinit(ctxt *Link, it *Pciter, d *sym.Pcdata) {
|
func pciterinit(ctxt *Link, it *Pciter, d *sym.Pcdata) {
|
||||||
@ -73,28 +65,6 @@ func pciterinit(ctxt *Link, it *Pciter, d *sym.Pcdata) {
|
|||||||
pciternext(it)
|
pciternext(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
func addvarint(d *sym.Pcdata, val uint32) {
|
|
||||||
n := int32(0)
|
|
||||||
for v := val; v >= 0x80; v >>= 7 {
|
|
||||||
n++
|
|
||||||
}
|
|
||||||
n++
|
|
||||||
|
|
||||||
old := len(d.P)
|
|
||||||
for cap(d.P) < len(d.P)+int(n) {
|
|
||||||
d.P = append(d.P[:cap(d.P)], 0)
|
|
||||||
}
|
|
||||||
d.P = d.P[:old+int(n)]
|
|
||||||
|
|
||||||
p := d.P[old:]
|
|
||||||
var v uint32
|
|
||||||
for v = val; v >= 0x80; v >>= 7 {
|
|
||||||
p[0] = byte(v | 0x80)
|
|
||||||
p = p[1:]
|
|
||||||
}
|
|
||||||
p[0] = byte(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func addpctab(ctxt *Link, ftab *sym.Symbol, off int32, d *sym.Pcdata) int32 {
|
func addpctab(ctxt *Link, ftab *sym.Symbol, off int32, d *sym.Pcdata) int32 {
|
||||||
var start int32
|
var start int32
|
||||||
if len(d.P) > 0 {
|
if len(d.P) > 0 {
|
||||||
@ -128,6 +98,7 @@ func renumberfiles(ctxt *Link, files []*sym.Symbol, d *sym.Pcdata) {
|
|||||||
numberfile(ctxt, f)
|
numberfile(ctxt, f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buf := make([]byte, binary.MaxVarintLen32)
|
||||||
newval := int32(-1)
|
newval := int32(-1)
|
||||||
var out sym.Pcdata
|
var out sym.Pcdata
|
||||||
var it Pciter
|
var it Pciter
|
||||||
@ -147,15 +118,20 @@ func renumberfiles(ctxt *Link, files []*sym.Symbol, d *sym.Pcdata) {
|
|||||||
|
|
||||||
dv := val - newval
|
dv := val - newval
|
||||||
newval = val
|
newval = val
|
||||||
v := (uint32(dv) << 1) ^ uint32(dv>>31)
|
|
||||||
addvarint(&out, v)
|
// value
|
||||||
|
n := binary.PutVarint(buf, int64(dv))
|
||||||
|
out.P = append(out.P, buf[:n]...)
|
||||||
|
|
||||||
// pc delta
|
// pc delta
|
||||||
addvarint(&out, (it.nextpc-it.pc)/it.pcscale)
|
pc := (it.nextpc - it.pc) / it.pcscale
|
||||||
|
n = binary.PutUvarint(buf, uint64(pc))
|
||||||
|
out.P = append(out.P, buf[:n]...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// terminating value delta
|
// terminating value delta
|
||||||
addvarint(&out, 0)
|
// we want to write varint-encoded 0, which is just 0
|
||||||
|
out.P = append(out.P, 0)
|
||||||
|
|
||||||
*d = out
|
*d = out
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user