diff options
| author | Cherry Zhang <cherryyz@google.com> | 2020-06-26 19:17:33 -0400 |
|---|---|---|
| committer | Cherry Zhang <cherryyz@google.com> | 2020-07-05 23:57:04 +0000 |
| commit | 36939aef772219e896e00e60b4ad83cd7bee2aa5 (patch) | |
| tree | ffd8cd5e19d427df8e55589eaaa7803f6a3bbd6d /src/cmd/link/internal/mips64 | |
| parent | 987ce938245566f8a8568cb3b7f43ff8442c2353 (diff) | |
| download | go-36939aef772219e896e00e60b4ad83cd7bee2aa5.tar.xz | |
[dev.link] cmd/link: parallelize ELF relocation writing
Now that we write ELF relocation records in mapped memory with
known sizes and offsets, we can write them in parallel.
Further speed up Asmb2 pass. Linking cmd/compile with external
linking,
Asmb2 141ms ± 4% 97ms ± 5% -30.98% (p=0.000 n=10+9)
Change-Id: I52c2b9230e90ed4421c21d7ef13a4f1e996f6054
Reviewed-on: https://go-review.googlesource.com/c/go/+/240400
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Diffstat (limited to 'src/cmd/link/internal/mips64')
| -rw-r--r-- | src/cmd/link/internal/mips64/asm.go | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index dcca72c930..d8760b45f5 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -41,7 +41,7 @@ import ( func gentext(ctxt *ld.Link, ldr *loader.Loader) {} -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { // mips64 ELF relocation (endian neutral) // offset uint64 @@ -52,36 +52,36 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo // type uint8 // addend int64 - ctxt.Out.Write64(uint64(sectoff)) + out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - ctxt.Out.Write32(uint32(elfsym)) - ctxt.Out.Write8(0) - ctxt.Out.Write8(0) - ctxt.Out.Write8(0) + out.Write32(uint32(elfsym)) + out.Write8(0) + out.Write8(0) + out.Write8(0) switch r.Type() { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: switch r.Siz() { case 4: - ctxt.Out.Write8(uint8(elf.R_MIPS_32)) + out.Write8(uint8(elf.R_MIPS_32)) case 8: - ctxt.Out.Write8(uint8(elf.R_MIPS_64)) + out.Write8(uint8(elf.R_MIPS_64)) default: return false } case objabi.R_ADDRMIPS: - ctxt.Out.Write8(uint8(elf.R_MIPS_LO16)) + out.Write8(uint8(elf.R_MIPS_LO16)) case objabi.R_ADDRMIPSU: - ctxt.Out.Write8(uint8(elf.R_MIPS_HI16)) + out.Write8(uint8(elf.R_MIPS_HI16)) case objabi.R_ADDRMIPSTLS: - ctxt.Out.Write8(uint8(elf.R_MIPS_TLS_TPREL_LO16)) + out.Write8(uint8(elf.R_MIPS_TLS_TPREL_LO16)) case objabi.R_CALLMIPS, objabi.R_JMPMIPS: - ctxt.Out.Write8(uint8(elf.R_MIPS_26)) + out.Write8(uint8(elf.R_MIPS_26)) } - ctxt.Out.Write64(uint64(r.Xadd)) + out.Write64(uint64(r.Xadd)) return true } |
