[dev.link] cmd/link run generators in parallel

Small runtime win:

Stats for darwin, building cmd/compile:

Asmb                      20.7ms ±14%    18.3ms ±14%  -11.54%  (p=0.002 n=10+10)
TotalTime                  365ms ±10%     351ms ± 2%     ~     (p=0.211 n=10+9)

Change-Id: Ia8afdf6948111d59b0c89e52cb50557a10f33c40
Reviewed-on: https://go-review.googlesource.com/c/go/+/257964
Trust: Jeremy Faller <jeremy@golang.org>
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go
index 6f4ccbf..778b0e9 100644
--- a/src/cmd/link/internal/ld/main.go
+++ b/src/cmd/link/internal/ld/main.go
@@ -36,12 +36,14 @@
 	"cmd/internal/objabi"
 	"cmd/internal/sys"
 	"cmd/link/internal/benchmark"
+	"cmd/link/internal/loader"
 	"flag"
 	"log"
 	"os"
 	"runtime"
 	"runtime/pprof"
 	"strings"
+	"sync"
 )
 
 var (
@@ -324,9 +326,15 @@
 	bench.Start("Asmb")
 	asmb(ctxt)
 	// Generate large symbols.
+	var wg sync.WaitGroup
 	for s, f := range ctxt.generatorSyms {
-		f(ctxt, s)
+		wg.Add(1)
+		go func(f generatorFunc, s loader.Sym) {
+			defer wg.Done()
+			f(ctxt, s)
+		}(f, s)
 	}
+	wg.Wait()
 	bench.Start("Asmb2")
 	asmb2(ctxt)