From: Brad Fitzpatrick Date: Wed, 2 Mar 2016 22:29:44 +0000 (-0800) Subject: cmd/link: stop generating garbage in elfhash X-Git-Tag: go1.7beta1~1594 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d7cdf66978935664d783ff02d06c6c0856ef4bec;p=gostls13.git cmd/link: stop generating garbage in elfhash All callers already had strings. No need to generate byte slice copies to work on bytes. Performance not measured, but probably helps at least a bit. Change-Id: Iec3230b69724fac68caae7aad46f2ce1504e82e5 Reviewed-on: https://go-review.googlesource.com/20136 Reviewed-by: David Crawshaw Reviewed-by: Dave Cheney Run-TryBot: Brad Fitzpatrick --- diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 8dd4df3957..efd2b4f62d 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1042,19 +1042,15 @@ func elfwritehdr() uint32 { } /* Taken directly from the definition document for ELF64 */ -func elfhash(name []byte) uint32 { - var h uint32 = 0 - var g uint32 - for len(name) != 0 { - h = (h << 4) + uint32(name[0]) - name = name[1:] - g = h & 0xf0000000 - if g != 0 { +func elfhash(name string) uint32 { + var h uint32 + for i := 0; i < len(name); i++ { + h = (h << 4) + uint32(name[i]) + if g := h & 0xf0000000; g != 0 { h ^= g >> 24 } h &= 0x0fffffff } - return h } @@ -1371,7 +1367,7 @@ func elfdynhash() { } name := sy.Extname - hc := elfhash([]byte(name)) + hc := elfhash(name) b = int(hc % uint32(nbucket)) chain[sy.Dynid] = buckets[b] @@ -1418,7 +1414,7 @@ func elfdynhash() { i++ // aux struct - Adduint32(Ctxt, s, elfhash([]byte(x.vers))) // hash + Adduint32(Ctxt, s, elfhash(x.vers)) // hash Adduint16(Ctxt, s, 0) // flags Adduint16(Ctxt, s, uint16(x.num)) // other - index we refer to this by Adduint32(Ctxt, s, uint32(Addstring(dynstr, x.vers))) // version string offset