]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: remove duplicate asmb code
authorJeremy Faller <jeremy@golang.org>
Wed, 20 May 2020 19:10:05 +0000 (15:10 -0400)
committerJeremy Faller <jeremy@golang.org>
Thu, 21 May 2020 18:40:49 +0000 (18:40 +0000)
Lots of the architecture specific code for asmb() is very simimar. As
such, move to a common function.

Change-Id: Id1fd50ee7bfa1bc9978e3f42ad08914b04cd677b
Reviewed-on: https://go-review.googlesource.com/c/go/+/234683
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>
22 files changed:
src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/amd64/obj.go
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/arm/obj.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/arm64/obj.go
src/cmd/link/internal/ld/asmb.go [new file with mode: 0644]
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/main.go
src/cmd/link/internal/mips/asm.go
src/cmd/link/internal/mips/obj.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/mips64/obj.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/ppc64/obj.go
src/cmd/link/internal/riscv64/asm.go
src/cmd/link/internal/riscv64/obj.go
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/s390x/obj.go
src/cmd/link/internal/x86/asm.go
src/cmd/link/internal/x86/obj.go

index 06c5f30983b62ac71bdc5866d17589fe8884e24c..6e784b59f4b89c47db3b13ddd10f2051cbdb7d76 100644 (file)
@@ -38,7 +38,6 @@ import (
        "cmd/link/internal/sym"
        "debug/elf"
        "log"
-       "sync"
 )
 
 func PADDR(x uint32) uint32 {
@@ -680,40 +679,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
        }
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       sect := ld.Segtext.Sections[0]
-       offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
-       f := func(ctxt *ld.Link, out *ld.OutBuf, start, length int64) {
-               // 0xCC is INT $3 - breakpoint instruction
-               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 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        machlink := int64(0)
        if ctxt.HeadType == objabi.Hdarwin {
index 3239c61864b6eb10bec9fa60d8dff6df7f60048f..90de67d08662ab41504ebf27476e8cf43417a2a9 100644 (file)
@@ -50,12 +50,13 @@ func Init() (*sys.Arch, ld.Arch) {
                Minalign:   minAlign,
                Dwarfregsp: dwarfRegSP,
                Dwarfreglr: dwarfRegLR,
+               // 0xCC is INT $3 - breakpoint instruction
+               CodePad: []byte{0xCC},
 
                Adddynrel:        adddynrel,
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
index 357a22b87943d9c7549b1490d973662712c6c175..db2e2cf69af965ccd70da5c4895532edde15bf60 100644 (file)
@@ -39,7 +39,6 @@ import (
        "debug/elf"
        "fmt"
        "log"
-       "sync"
 )
 
 // This assembler:
@@ -672,35 +671,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
        }
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       sect := ld.Segtext.Sections[0]
-       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 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        /* output symbol table */
        ld.Symsize = 0
index 003c80a508f7c2cc62f25deae11889369f8c0a32..c70b10e75d1a9b5fce0ade20061c854db6d87878 100644 (file)
@@ -51,7 +51,6 @@ func Init() (*sys.Arch, ld.Arch) {
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
                Trampoline:       trampoline,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
index fae3aa5ac2a6a980e20a0ec9feb7014b2d09c345..94c86e0b46c20dd0c3cd3559d8ea9d847918ff1b 100644 (file)
@@ -39,7 +39,6 @@ import (
        "debug/elf"
        "fmt"
        "log"
-       "sync"
 )
 
 func gentext(ctxt *ld.Link, ldr *loader.Loader) {
@@ -797,35 +796,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
        }
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       sect := ld.Segtext.Sections[0]
-       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 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        machlink := uint32(0)
        if ctxt.HeadType == objabi.Hdarwin {
index 4ed05c087a04ca89b3bcefa3bc6f6fe672e4ec33..de6ab5832924f2c49f86155fe52327336025fe74 100644 (file)
@@ -50,7 +50,6 @@ func Init() (*sys.Arch, ld.Arch) {
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go
new file mode 100644 (file)
index 0000000..ede4f91
--- /dev/null
@@ -0,0 +1,70 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ld
+
+import (
+       "cmd/link/internal/loader"
+       "sync"
+)
+
+// Assembling the binary is broken into two steps:
+//  - writing out the code/data/dwarf Segments
+//  - writing out the architecture specific pieces.
+// This function handles the first part.
+func asmb(ctxt *Link, ldr *loader.Loader) {
+       // TODO(jfaller): delete me.
+       if thearch.Asmb != nil {
+               thearch.Asmb(ctxt, ldr)
+               return
+       }
+
+       if ctxt.IsELF {
+               Asmbelfsetup()
+       }
+
+       var wg sync.WaitGroup
+       sect := Segtext.Sections[0]
+       offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff
+       f := func(ctxt *Link, out *OutBuf, start, length int64) {
+               pad := thearch.CodePad
+               if pad == nil {
+                       pad = zeros[:]
+               }
+               CodeblkPad(ctxt, out, start, length, pad)
+       }
+
+       if !thearch.WriteTextBlocks {
+               writeParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length)
+               for _, sect := range Segtext.Sections[1:] {
+                       offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff
+                       writeParallel(&wg, Datblk, ctxt, offset, sect.Vaddr, sect.Length)
+               }
+       } else {
+               // TODO why can't we handle all sections this way?
+               for _, sect := range Segtext.Sections {
+                       offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff
+                       // Handle additional text sections with Codeblk
+                       if sect.Name == ".text" {
+                               writeParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length)
+                       } else {
+                               writeParallel(&wg, Datblk, ctxt, offset, sect.Vaddr, sect.Length)
+                       }
+               }
+       }
+
+       if Segrodata.Filelen > 0 {
+               writeParallel(&wg, Datblk, ctxt, Segrodata.Fileoff, Segrodata.Vaddr, Segrodata.Filelen)
+       }
+
+       if Segrelrodata.Filelen > 0 {
+               writeParallel(&wg, Datblk, ctxt, Segrelrodata.Fileoff, Segrelrodata.Vaddr, Segrelrodata.Filelen)
+       }
+
+       writeParallel(&wg, Datblk, ctxt, Segdata.Fileoff, Segdata.Vaddr, Segdata.Filelen)
+
+       writeParallel(&wg, dwarfblk, ctxt, Segdwarf.Fileoff, Segdwarf.Vaddr, Segdwarf.Filelen)
+
+       wg.Wait()
+}
index 98242b16e4d9e5acc4eda04588d860677684f33b..26f443c56a07ff97e2a1e9d4c0ad7f4aafd92737 100644 (file)
@@ -801,10 +801,6 @@ func (state *dodataState) dynreloc(ctxt *Link) {
        }
 }
 
-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) {
        writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad)
 }
@@ -951,8 +947,8 @@ func writeBlock(out *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size i
 
 type writeFn func(*Link, *OutBuf, int64, int64)
 
-// WriteParallel handles scheduling parallel execution of data write functions.
-func WriteParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, length uint64) {
+// writeParallel handles scheduling parallel execution of data write functions.
+func writeParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, length uint64) {
        if out, err := ctxt.Out.View(seek); err != nil {
                ctxt.Out.SeekSet(int64(seek))
                fn(ctxt, ctxt.Out, int64(vaddr), int64(length))
@@ -981,7 +977,7 @@ func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) {
        writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap, addr, size, zeros[:])
 }
 
-func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
+func dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
        // Concatenate the section symbol lists into a single list to pass
        // to writeBlocks.
        //
index 04c4adfb860be0e0383cd7c55585498ff59228a5..33cb9788c4b41ebaa78681e42aabe20dbf5d96b8 100644 (file)
@@ -184,8 +184,18 @@ type Arch struct {
        Openbsddynld   string
        Dragonflydynld string
        Solarisdynld   string
-       Adddynrel      func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool
-       Archinit       func(*Link)
+
+       // Empty spaces between codeblocks will be padded with this value.
+       // For example an architecture might want to pad with a trap instruction to
+       // catch wayward programs. Architectures that do not define a padding value
+       // are padded with zeros.
+       CodePad []byte
+
+       // Set to true to write all text blocks in with CodeBlkWrite
+       WriteTextBlocks bool
+
+       Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool
+       Archinit  func(*Link)
        // Archreloc is an arch-specific hook that assists in relocation processing
        // (invoked by 'relocsym'); it handles target-specific relocation tasks.
        // Here "rel" is the current relocation being examined, "sym" is the symbol
@@ -212,10 +222,13 @@ type Arch struct {
        // index of the relocation.
        Trampoline func(ctxt *Link, ldr *loader.Loader, ri int, rs, s loader.Sym)
 
-       // Asmb and Asmb2 are arch-specific routines that write the output
-       // file. Typically, Asmb writes most of the content (sections and
-       // segments), for which we have computed the size and offset. Asmb2
-       // writes the rest.
+       // Assembling the binary breaks into two phases, writing the code/data/
+       // dwarf information (which is rather generic), and some more architecture
+       // specific work like setting up the elf headers/dynamic relocations, etc.
+       // The phases are called "Asmb" and "Asmb2". Asmb2 needs to be defined for
+       // every architecture, but only if architecture has an Asmb function will
+       // it be used for assembly.  Otherwise a generic assembly Asmb function is
+       // used.
        Asmb  func(*Link, *loader.Loader)
        Asmb2 func(*Link, *loader.Loader)
 
index 6bb1ea7a56db8e3d025943930702a7b236c23a0b..ee5cc19bad30a0a65d11589f23ca37025e364800 100644 (file)
@@ -313,11 +313,11 @@ func Main(arch *sys.Arch, theArch Arch) {
                        panic(err)
                }
        }
-       // Asmb will redirect symbols to the output file mmap, and relocations
+       // asmb will redirect symbols to the output file mmap, and relocations
        // will be applied directly there.
        bench.Start("Asmb")
        ctxt.loader.InitOutData()
-       thearch.Asmb(ctxt, ctxt.loader)
+       asmb(ctxt, ctxt.loader)
        bench.Start("reloc")
        ctxt.reloc()
        bench.Start("Asmb2")
index fdcb79326d32fd12e4ebb7db231ca1b263c427b0..c43b1e61ef6575aac0597587762ebc9dcaf92cbd 100644 (file)
@@ -38,7 +38,6 @@ import (
        "cmd/link/internal/sym"
        "debug/elf"
        "fmt"
-       "sync"
 )
 
 func gentext(ctxt *ld.Link, ldr *loader.Loader) {
@@ -153,31 +152,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
        return -1
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       sect := ld.Segtext.Sections[0]
-       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 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        /* output symbol table */
        ld.Symsize = 0
index 5acbaddd4106667ba1f1ac810cd48279a7c094c5..eb0dbe62beb38f43ed8c33f745a8f16f6536eb3a 100644 (file)
@@ -52,7 +52,6 @@ func Init() (*sys.Arch, ld.Arch) {
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
index d72f6d2496b4143242b69f4c0f329cc48e4a5c74..c10bbb4fec11f149ff4e81b060ff1a66f18be964 100644 (file)
@@ -38,7 +38,6 @@ import (
        "cmd/link/internal/sym"
        "debug/elf"
        "fmt"
-       "sync"
 )
 
 func gentext(ctxt *ld.Link, ldr *loader.Loader) {}
@@ -159,35 +158,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
        return -1
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       sect := ld.Segtext.Sections[0]
-       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 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        /* output symbol table */
        ld.Symsize = 0
index 55ca337e06537f842d6666734e78748003ddc5dc..90919ee7376231ed8d07507d4666b762a796d05e 100644 (file)
@@ -51,7 +51,6 @@ func Init() (*sys.Arch, ld.Arch) {
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
index aae42c0bbce217ecd5e331e3ecec8c669d7d719a..74c4c4d05d50f219ffc97f2998a1b497a46b6003 100644 (file)
@@ -41,7 +41,6 @@ import (
        "fmt"
        "log"
        "strings"
-       "sync"
 )
 
 func genplt(ctxt *ld.Link, ldr *loader.Loader) {
@@ -1081,36 +1080,6 @@ func ensureglinkresolver(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilde
        return glink
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       for _, sect := range ld.Segtext.Sections {
-               offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
-               // Handle additional text sections with Codeblk
-               if sect.Name == ".text" {
-                       ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
-               } else {
-                       ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
-               }
-       }
-
-       if ld.Segrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        /* output symbol table */
        ld.Symsize = 0
index 49c7ec21034645f49c68187ad07a723c41b7f691..ae291f87fcd19f0c5e6be1b1912fa852845681db 100644 (file)
@@ -43,17 +43,17 @@ func Init() (*sys.Arch, ld.Arch) {
        }
 
        theArch := ld.Arch{
-               Funcalign:  funcAlign,
-               Maxalign:   maxAlign,
-               Minalign:   minAlign,
-               Dwarfregsp: dwarfRegSP,
-               Dwarfreglr: dwarfRegLR,
+               Funcalign:       funcAlign,
+               Maxalign:        maxAlign,
+               Minalign:        minAlign,
+               Dwarfregsp:      dwarfRegSP,
+               Dwarfreglr:      dwarfRegLR,
+               WriteTextBlocks: true,
 
                Adddynrel:        adddynrel,
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
index b9c5c68693f8408b4d282f22743c118d142846c6..bc39c0630996cc5e6ca733c08639c691a7aa8530 100644 (file)
@@ -13,7 +13,6 @@ import (
        "cmd/link/internal/sym"
        "fmt"
        "log"
-       "sync"
 )
 
 func gentext(ctxt *ld.Link, ldr *loader.Loader) {
@@ -91,35 +90,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
        return -1
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       sect := ld.Segtext.Sections[0]
-       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 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        ld.Symsize = 0
        ld.Lcsize = 0
index 9fe9822a32057b74d2554d16900104f20c3a3ae3..a0ff179d83311797455e500de483e6de488c9550 100644 (file)
@@ -23,7 +23,6 @@ func Init() (*sys.Arch, ld.Arch) {
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
index ae2baaa05a34106e093f2f4add87435a23e1c247..7465212b9daf82f6e42b4ab81a0d0ca8bc122a8a 100644 (file)
@@ -38,7 +38,6 @@ import (
        "cmd/link/internal/sym"
        "debug/elf"
        "fmt"
-       "sync"
 )
 
 // gentext generates assembly to append the local moduledata to the global
@@ -477,35 +476,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
        }
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       sect := ld.Segtext.Sections[0]
-       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 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        /* output symbol table */
        ld.Symsize = 0
index 54d640731e9beeb94c326e5129807a43963d2269..28886804b773b336309f8405dbefebee0da36b26 100644 (file)
@@ -50,7 +50,6 @@ func Init() (*sys.Arch, ld.Arch) {
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
index ecd5058f4c7d46fe321ef509cf7ac66447b9cc67..967261a8cd5d2ebc9e5cc2cad1d7ebf4d89b9b3d 100644 (file)
@@ -38,7 +38,6 @@ import (
        "cmd/link/internal/sym"
        "debug/elf"
        "log"
-       "sync"
 )
 
 func gentext(ctxt *ld.Link, ldr *loader.Loader) {
@@ -511,38 +510,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
        }
 }
 
-func asmb(ctxt *ld.Link, _ *loader.Loader) {
-       if ctxt.IsELF {
-               ld.Asmbelfsetup()
-       }
-
-       var wg sync.WaitGroup
-       sect := ld.Segtext.Sections[0]
-       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 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
-       }
-
-       if ld.Segrelrodata.Filelen > 0 {
-               ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
-       }
-
-       ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
-
-       ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
-       wg.Wait()
-}
-
 func asmb2(ctxt *ld.Link, _ *loader.Loader) {
        machlink := uint32(0)
        if ctxt.HeadType == objabi.Hdarwin {
index f53ecc8fc0eea2d3fb6348c2e82662746ccb858f..b604c1f8c2db2507423d55adcb2294f7b730de26 100644 (file)
@@ -45,12 +45,13 @@ func Init() (*sys.Arch, ld.Arch) {
                Minalign:   minAlign,
                Dwarfregsp: dwarfRegSP,
                Dwarfreglr: dwarfRegLR,
+               // 0xCC is INT $3 - breakpoint instruction
+               CodePad: []byte{0xCC},
 
                Adddynrel:        adddynrel,
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
-               Asmb:             asmb,
                Asmb2:            asmb2,
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,