cmd/internal/ld: remove pointless allocs

Reduces allocs linking cmd/go and runtime.test
by ~13%. No functional changes.

The most easily addressed sources of allocations
after this are expandpkg, rdstring, and symbuf
string conversion.

These can be reduced by interning strings,
but that increases the overall memory footprint.

Change-Id: Ifedefc9f2a0403bcc75460d6b139e8408374e058
Reviewed-on: https://go-review.googlesource.com/9391
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/src/cmd/internal/ld/dwarf.go b/src/cmd/internal/ld/dwarf.go
index ec540fd..6d90404 100644
--- a/src/cmd/internal/ld/dwarf.go
+++ b/src/cmd/internal/ld/dwarf.go
@@ -158,16 +158,16 @@
 	return int(length)
 }
 
+var encbuf [10]byte
+
 func uleb128put(v int64) {
-	var buf [10]byte
-	n := uleb128enc(uint64(v), buf[:])
-	Cwrite(buf[:n])
+	n := uleb128enc(uint64(v), encbuf[:])
+	Cwrite(encbuf[:n])
 }
 
 func sleb128put(v int64) {
-	var buf [10]byte
-	n := sleb128enc(v, buf[:])
-	Cwrite(buf[:n])
+	n := sleb128enc(v, encbuf[:])
+	Cwrite(encbuf[:n])
 }
 
 /*
diff --git a/src/cmd/internal/ld/go.go b/src/cmd/internal/ld/go.go
index e6756ab..06f1d87 100644
--- a/src/cmd/internal/ld/go.go
+++ b/src/cmd/internal/ld/go.go
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// go-specific code shared across loaders (5l, 6l, 8l).
+
 package ld
 
 import (
@@ -20,12 +22,6 @@
 	return strings.Replace(t0, `"".`, pkg+".", -1)
 }
 
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// go-specific code shared across loaders (5l, 6l, 8l).
-
 // accumulate all type information from .6 files.
 // check for inconsistencies.
 
diff --git a/src/cmd/internal/ld/objfile.go b/src/cmd/internal/ld/objfile.go
index 41534c8..8eac634 100644
--- a/src/cmd/internal/ld/objfile.go
+++ b/src/cmd/internal/ld/objfile.go
@@ -80,8 +80,7 @@
 	}
 	size := int(rdint(f))
 	typ := rdsym(ctxt, f, pkg)
-	var data []byte
-	rddata(f, &data)
+	data := rddata(f)
 	nreloc := int(rdint(f))
 
 	if v != 0 {
@@ -183,14 +182,14 @@
 
 		s.Pcln = new(Pcln)
 		pc := s.Pcln
-		rddata(f, &pc.Pcsp.P)
-		rddata(f, &pc.Pcfile.P)
-		rddata(f, &pc.Pcline.P)
+		pc.Pcsp.P = rddata(f)
+		pc.Pcfile.P = rddata(f)
+		pc.Pcline.P = rddata(f)
 		n = int(rdint(f))
 		pc.Pcdata = make([]Pcdata, n)
 		pc.Npcdata = n
 		for i := 0; i < n; i++ {
-			rddata(f, &pc.Pcdata[i].P)
+			pc.Pcdata[i].P = rddata(f)
 		}
 		n = int(rdint(f))
 		pc.Funcdata = make([]*LSym, n)
@@ -302,10 +301,11 @@
 	return string(p)
 }
 
-func rddata(f *Biobuf, pp *[]byte) {
+func rddata(f *Biobuf) []byte {
 	n := rdint(f)
-	*pp = make([]byte, n)
-	Bread(f, *pp)
+	p := make([]byte, n)
+	Bread(f, p)
+	return p
 }
 
 var symbuf []byte