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/amd64 | |
| 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/amd64')
| -rw-r--r-- | src/cmd/link/internal/amd64/asm.go | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index e07321f855..609daef078 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -384,8 +384,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { - ctxt.Out.Write64(uint64(sectoff)) +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() @@ -394,21 +394,21 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo return false case objabi.R_ADDR, objabi.R_DWARFSECREF: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_32) | uint64(elfsym)<<32) } else if siz == 8 { - ctxt.Out.Write64(uint64(elf.R_X86_64_64) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_64) | uint64(elfsym)<<32) } else { return false } case objabi.R_TLS_LE: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_TPOFF32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_TPOFF32) | uint64(elfsym)<<32) } else { return false } case objabi.R_TLS_IE: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTTPOFF) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_GOTTPOFF) | uint64(elfsym)<<32) } else { return false } @@ -416,12 +416,12 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo if siz == 4 { if ldr.SymType(r.Xsym) == sym.SDYNIMPORT { if ctxt.DynlinkingGo() { - ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) } } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) } } else { return false @@ -429,22 +429,22 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo case objabi.R_PCREL: if siz == 4 { if ldr.SymType(r.Xsym) == sym.SDYNIMPORT && ldr.SymElfType(r.Xsym) == elf.STT_FUNC { - ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) } } else { return false } case objabi.R_GOTPCREL: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) } else { return false } } - ctxt.Out.Write64(uint64(r.Xadd)) + out.Write64(uint64(r.Xadd)) return true } |
