aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/mips64
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2020-06-26 19:17:33 -0400
committerCherry Zhang <cherryyz@google.com>2020-07-05 23:57:04 +0000
commit36939aef772219e896e00e60b4ad83cd7bee2aa5 (patch)
treeffd8cd5e19d427df8e55589eaaa7803f6a3bbd6d /src/cmd/link/internal/mips64
parent987ce938245566f8a8568cb3b7f43ff8442c2353 (diff)
downloadgo-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.go26
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
}