Like we do for applying relocations, for generator symbols, run
the generator function along with symbol writing. This will
probably have better locality and parallelism.
Linking cmd/compile,
Asmb 29.9ms ± 5% 19.1ms ±12% -36.18% (p=0.000 n=10+9)
TotalTime 351ms ± 3% 339ms ± 2% -3.51% (p=0.000 n=11+10)
Change-Id: I9cda6718bf70b3bcf1b7a501a845d6136234d2ee
Reviewed-on: https://go-review.googlesource.com/c/go/+/263640
Trust: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
}
P := out.WriteSym(ldr, s)
st.relocsym(s, P)
+ if f, ok := ctxt.generatorSyms[s]; ok {
+ f(ctxt, s)
+ }
addr += int64(len(P))
siz := ldr.SymSize(s)
if addr < val+siz {
"cmd/internal/objabi"
"cmd/internal/sys"
"cmd/link/internal/benchmark"
- "cmd/link/internal/loader"
"flag"
"log"
"os"
"runtime"
"runtime/pprof"
"strings"
- "sync"
)
var (
// will be applied directly there.
bench.Start("Asmb")
asmb(ctxt)
- // Generate large symbols.
- var wg sync.WaitGroup
- for s, f := range ctxt.generatorSyms {
- wg.Add(1)
- go func(f generatorFunc, s loader.Sym) {
- defer wg.Done()
- f(ctxt, s)
- }(f, s)
- }
- wg.Wait()
// Generate additional symbols for the native symbol table just prior
// to code generation.