]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: make asmb parallel across all platforms
authorJeremy Faller <jeremy@golang.org>
Fri, 20 Mar 2020 16:24:35 +0000 (12:24 -0400)
committerJeremy Faller <jeremy@golang.org>
Mon, 30 Mar 2020 21:21:28 +0000 (21:21 +0000)
Numbers for x86:

Asmb                      54.8ms ±15%    12.1ms ±28%   -78.02%  (p=0.000 n=10+10)
TotalTime                  545ms ± 3%     515ms ± 4%    -5.42%  (p=0.000 n=10+10)

Change-Id: I8fc17f7ccdf83fbd70cf7d27b44f41f9db9c9922
Reviewed-on: https://go-review.googlesource.com/c/go/+/224419
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/mips/asm.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/riscv64/asm.go
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/x86/asm.go

index 40ecd2572e79e69556189a4769b9ba9dac79ebc5..cb1210422d1dfa465bc16f77c6ae8b3faa418d25 100644 (file)
@@ -705,19 +705,20 @@ func asmb(ctxt *ld.Link) {
 
        for _, sect := range ld.Segtext.Sections[1:] {
                offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
-               ld.WriteParallel(&wg, ld.Datblk2, ctxt, offset, sect.Vaddr, sect.Length)
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
        }
 
        if ld.Segrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk2, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
+
        if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk2, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
        }
 
-       ld.WriteParallel(&wg, ld.Datblk2, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ld.WriteParallel(&wg, ld.Dwarfblk2, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
 
        wg.Wait()
 }
index a76f0db1deaef0a3103bd584c9e9139a76003336..43ee4bf200ae60fb56611e4c525786b295879894 100644 (file)
@@ -39,6 +39,7 @@ import (
        "debug/elf"
        "fmt"
        "log"
+       "sync"
 )
 
 // This assembler:
@@ -763,28 +764,28 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
+       var wg sync.WaitGroup
        sect := ld.Segtext.Sections[0]
-       ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-       ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for _, sect = range ld.Segtext.Sections[1:] {
-               ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-               ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+       offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+       ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
+
+       for _, sect := range ld.Segtext.Sections[1:] {
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
        }
 
        if ld.Segrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
+
        if ld.Segrelrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
        }
 
-       ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff))
-       ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen))
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff))
-       ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen))
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       wg.Wait()
 }
 
 func asmb2(ctxt *ld.Link) {
index ddf5da8e8b969c2abf0fb907d261101454ae95d5..66fa1c3a569501ed7233f0d58714ffd2e7372495 100644 (file)
@@ -39,6 +39,7 @@ import (
        "debug/elf"
        "fmt"
        "log"
+       "sync"
 )
 
 func gentext(ctxt *ld.Link) {
@@ -824,28 +825,28 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
+       var wg sync.WaitGroup
        sect := ld.Segtext.Sections[0]
-       ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-       ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for _, sect = range ld.Segtext.Sections[1:] {
-               ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-               ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+       offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+       ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
+
+       for _, sect := range ld.Segtext.Sections[1:] {
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
        }
 
        if ld.Segrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
+
        if ld.Segrelrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
        }
 
-       ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff))
-       ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen))
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff))
-       ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen))
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       wg.Wait()
 }
 
 func asmb2(ctxt *ld.Link) {
index 7bdeb1f68b7a242649a6e55896956084dc8e8c48..b1c03b97ef4ca4d15e5d7644107fcd095c11c9ee 100644 (file)
@@ -729,8 +729,8 @@ func dynreloc(ctxt *Link, data *[sym.SXREF][]*sym.Symbol) {
        }
 }
 
-func Codeblk(ctxt *Link, addr int64, size int64) {
-       CodeblkPad(ctxt, ctxt.Out, addr, size, zeros[:])
+func Codeblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
+       CodeblkPad(ctxt, out, addr, size, zeros[:])
 }
 
 func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte) {
@@ -926,11 +926,7 @@ func WriteParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, leng
        }
 }
 
-func Datblk(ctxt *Link, addr int64, size int64) {
-       writeDatblkToOutBuf(ctxt, ctxt.Out, addr, size)
-}
-
-func Datblk2(ctxt *Link, out *OutBuf, addr, size int64) {
+func Datblk(ctxt *Link, out *OutBuf, addr, size int64) {
        writeDatblkToOutBuf(ctxt, out, addr, size)
 }
 
@@ -1017,7 +1013,7 @@ func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) {
        ctxt.Logf("\t%.8x|\n", uint(eaddr))
 }
 
-func Dwarfblk2(ctxt *Link, out *OutBuf, addr int64, size int64) {
+func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
        if *flagA {
                ctxt.Logf("dwarfblk [%#x,%#x) at offset %#x\n", addr, addr+size, ctxt.Out.Offset())
        }
@@ -1025,14 +1021,6 @@ func Dwarfblk2(ctxt *Link, out *OutBuf, addr int64, size int64) {
        writeBlocks(out, ctxt.outSem, dwarfp, addr, size, zeros[:])
 }
 
-func Dwarfblk(ctxt *Link, addr int64, size int64) {
-       if *flagA {
-               ctxt.Logf("dwarfblk [%#x,%#x) at offset %#x\n", addr, addr+size, ctxt.Out.Offset())
-       }
-
-       writeBlock(ctxt.Out, dwarfp, addr, size, zeros[:])
-}
-
 var zeros [512]byte
 
 var (
index 44503a13480bface34073ac88cc8a8a0c71f9c0b..f8386d8ac038da9ea2e762810f82b654680dbd6c 100644 (file)
@@ -39,6 +39,7 @@ import (
        "debug/elf"
        "fmt"
        "log"
+       "sync"
 )
 
 func gentext(ctxt *ld.Link) {
@@ -168,24 +169,24 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
+       var wg sync.WaitGroup
        sect := ld.Segtext.Sections[0]
-       ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-       ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+       offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+       ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
+
        for _, sect = range ld.Segtext.Sections[1:] {
-               ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-               ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
        }
 
        if ld.Segrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
 
-       ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff))
-       ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen))
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff))
-       ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen))
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       wg.Wait()
 }
 
 func asmb2(ctxt *ld.Link) {
index 2024c082e94af4b87191d8c5e9018f79848efdd3..3323616a37b2613e4c9af097bab875da4c64aeb2 100644 (file)
@@ -39,6 +39,7 @@ import (
        "debug/elf"
        "fmt"
        "log"
+       "sync"
 )
 
 func gentext(ctxt *ld.Link) {}
@@ -174,28 +175,28 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
+       var wg sync.WaitGroup
        sect := ld.Segtext.Sections[0]
-       ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-       ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for _, sect = range ld.Segtext.Sections[1:] {
-               ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-               ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+       offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+       ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
+
+       for _, sect := range ld.Segtext.Sections[1:] {
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
        }
 
        if ld.Segrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
+
        if ld.Segrelrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
        }
 
-       ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff))
-       ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen))
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff))
-       ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen))
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       wg.Wait()
 }
 
 func asmb2(ctxt *ld.Link) {
index f12522a5dd81017751fa39c33aa9b6c9079bb24e..f4ba47b8b6c5c59ee9a618d9adf4373f5569bf01 100644 (file)
@@ -41,6 +41,7 @@ import (
        "fmt"
        "log"
        "strings"
+       "sync"
 )
 
 func genplt(ctxt *ld.Link) {
@@ -1065,30 +1066,34 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
+       var wg sync.WaitGroup
        for _, sect := range ld.Segtext.Sections {
-               ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
                // Handle additional text sections with Codeblk
                if sect.Name == ".text" {
-                       ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+                       ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
                } else {
-                       ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+                       ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
                }
        }
 
+       for _, sect := range ld.Segtext.Sections[1:] {
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
+       }
+
        if ld.Segrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
+
        if ld.Segrelrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
        }
 
-       ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff))
-       ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen))
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff))
-       ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen))
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       wg.Wait()
 }
 
 func asmb2(ctxt *ld.Link) {
index 6148f6c035317ae22e114f6669142edb499ff58d..cc83b96a969e9df1076a67d38c33e7236f8a9458 100644 (file)
@@ -13,6 +13,7 @@ import (
        "cmd/link/internal/sym"
        "fmt"
        "log"
+       "sync"
 )
 
 func gentext(ctxt *ld.Link) {
@@ -102,28 +103,28 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
+       var wg sync.WaitGroup
        sect := ld.Segtext.Sections[0]
-       ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-       ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for _, sect = range ld.Segtext.Sections[1:] {
-               ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-               ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+       offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+       ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
+
+       for _, sect := range ld.Segtext.Sections[1:] {
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
        }
 
        if ld.Segrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
+
        if ld.Segrelrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
        }
 
-       ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff))
-       ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen))
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff))
-       ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen))
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       wg.Wait()
 }
 
 func asmb2(ctxt *ld.Link) {
index b118a4db63e9cd97d98e26be1cddb79dd9fe6038..7750da21cd59c3245f295065892086f046541d71 100644 (file)
@@ -38,6 +38,7 @@ import (
        "cmd/link/internal/sym"
        "debug/elf"
        "fmt"
+       "sync"
 )
 
 // gentext generates assembly to append the local moduledata to the global
@@ -506,28 +507,28 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
+       var wg sync.WaitGroup
        sect := ld.Segtext.Sections[0]
-       ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-       ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for _, sect = range ld.Segtext.Sections[1:] {
-               ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-               ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+       offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+       ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
+
+       for _, sect := range ld.Segtext.Sections[1:] {
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
        }
 
        if ld.Segrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
+
        if ld.Segrelrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
        }
 
-       ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff))
-       ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen))
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff))
-       ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen))
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       wg.Wait()
 }
 
 func asmb2(ctxt *ld.Link) {
index 0fdd7307ae58554991ca923fe5f1570585dd8fb2..bb7365410e16194e4105740e7fc587f3833b8fcc 100644 (file)
@@ -38,6 +38,7 @@ import (
        "cmd/link/internal/sym"
        "debug/elf"
        "log"
+       "sync"
 )
 
 // Append 4 bytes to s and create a R_CALL relocation targeting t to fill them in.
@@ -623,29 +624,31 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
+       var wg sync.WaitGroup
        sect := ld.Segtext.Sections[0]
-       ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-       // 0xCC is INT $3 - breakpoint instruction
-       ld.CodeblkPad(ctxt, ctxt.Out, int64(sect.Vaddr), int64(sect.Length), []byte{0xCC})
-       for _, sect = range ld.Segtext.Sections[1:] {
-               ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
-               ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
+       offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+       f := func(ctxt *ld.Link, out *ld.OutBuf, start, length int64) {
+               ld.CodeblkPad(ctxt, out, start, length, []byte{0xCC})
+       }
+       ld.WriteParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length)
+
+       for _, sect := range ld.Segtext.Sections[1:] {
+               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
        }
 
        if ld.Segrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
        }
+
        if ld.Segrelrodata.Filelen > 0 {
-               ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff))
-               ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen))
+               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
        }
 
-       ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff))
-       ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen))
+       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
 
-       ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff))
-       ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen))
+       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
+       wg.Wait()
 }
 
 func asmb2(ctxt *ld.Link) {