]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: stop generating garbage in elfhash
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 2 Mar 2016 22:29:44 +0000 (14:29 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 3 Mar 2016 00:11:31 +0000 (00:11 +0000)
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 <crawshaw@golang.org>
Reviewed-by: Dave Cheney <dave@cheney.net>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>

src/cmd/link/internal/ld/elf.go

index 8dd4df395740ca21a8a51b04d6c5b3e53141a0a8..efd2b4f62d1a01de0ea60248afbc3ca298b1ff6c 100644 (file)
@@ -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