From d7cdf66978935664d783ff02d06c6c0856ef4bec Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 2 Mar 2016 14:29:44 -0800 Subject: [PATCH] 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 --- src/cmd/link/internal/ld/elf.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 8dd4df39574..efd2b4f62d1 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