[dev.link] cmd/link: simplify asmb2

Move lots of the binary-file format specific pieces into their
appropriate places. Similarly rescope some variables to just ld.

Change-Id: I74bc6d8aba58f5ac86e6579be1fcb356c4636825
Reviewed-on: https://go-review.googlesource.com/c/go/+/235278
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go
index 825dd9a..a9987ba 100644
--- a/src/cmd/link/internal/ld/asmb.go
+++ b/src/cmd/link/internal/ld/asmb.go
@@ -5,6 +5,7 @@
 package ld
 
 import (
+	"cmd/internal/objabi"
 	"cmd/link/internal/loader"
 	"fmt"
 	"sync"
@@ -80,66 +81,47 @@
 		return
 	}
 
-	Symsize = 0
-	Spsize = 0
-	Lcsize = 0
+	symSize = 0
+	spSize = 0
+	lcSize = 0
 
-	if ctxt.IsDarwin() {
-		machlink := doMachoLink(ctxt)
-		if !*FlagS && ctxt.IsExternal() {
-			symo := int64(Segdwarf.Fileoff + uint64(Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))) + uint64(machlink))
-			ctxt.Out.SeekSet(symo)
-			machoEmitReloc(ctxt)
-		}
-		ctxt.Out.SeekSet(0)
+	switch ctxt.HeadType {
+	default:
+		panic("unknown platform")
+
+	// Macho
+	case objabi.Hdarwin:
 		asmbMacho(ctxt)
-	}
 
-	if ctxt.IsElf() {
-		var symo int64
-		if !*FlagS {
-			symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen)
-			symo = Rnd(symo, int64(*FlagRound))
-			ctxt.Out.SeekSet(symo)
-			asmElfSym(ctxt)
-			ctxt.Out.Write(Elfstrdat)
-			if ctxt.IsExternal() {
-				elfEmitReloc(ctxt)
-			}
-		}
-		ctxt.Out.SeekSet(0)
-		asmbElf(ctxt, symo)
-	}
+	// Plan9
+	case objabi.Hplan9:
+		asmbPlan9(ctxt)
 
-	if ctxt.IsWindows() {
+	// PE
+	case objabi.Hwindows:
 		asmbPe(ctxt)
-	}
 
-	if ctxt.IsPlan9() {
-		if !*FlagS {
-			*FlagS = true
-			symo := int64(Segdata.Fileoff + Segdata.Filelen)
-			ctxt.Out.SeekSet(symo)
-			asmbPlan9Sym(ctxt)
-		}
-		ctxt.Out.SeekSet(0)
-		writePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit)
-	}
+	// Xcoff
+	case objabi.Haix:
+		asmbXcoff(ctxt)
 
-	if ctxt.IsAIX() {
-		ctxt.Out.SeekSet(0)
-		fileoff := uint32(Segdwarf.Fileoff + Segdwarf.Filelen)
-		fileoff = uint32(Rnd(int64(fileoff), int64(*FlagRound)))
-		asmbXcoff(ctxt, int64(fileoff))
+	// Elf
+	case objabi.Hdragonfly,
+		objabi.Hfreebsd,
+		objabi.Hlinux,
+		objabi.Hnetbsd,
+		objabi.Hopenbsd,
+		objabi.Hsolaris:
+		asmbElf(ctxt)
 	}
 
 	if *FlagC {
 		fmt.Printf("textsize=%d\n", Segtext.Filelen)
 		fmt.Printf("datsize=%d\n", Segdata.Filelen)
 		fmt.Printf("bsssize=%d\n", Segdata.Length-Segdata.Filelen)
-		fmt.Printf("symsize=%d\n", Symsize)
-		fmt.Printf("lcsize=%d\n", Lcsize)
-		fmt.Printf("total=%d\n", Segtext.Filelen+Segdata.Length+uint64(Symsize)+uint64(Lcsize))
+		fmt.Printf("symsize=%d\n", symSize)
+		fmt.Printf("lcsize=%d\n", lcSize)
+		fmt.Printf("total=%d\n", Segtext.Filelen+Segdata.Length+uint64(symSize)+uint64(lcSize))
 	}
 }
 
@@ -152,16 +134,28 @@
 	buf.Write32b(uint32(Segtext.Filelen))
 	buf.Write32b(uint32(Segdata.Filelen))
 	buf.Write32b(uint32(Segdata.Length - Segdata.Filelen))
-	buf.Write32b(uint32(Symsize))
+	buf.Write32b(uint32(symSize))
 	if is64Bit {
 		buf.Write32b(uint32(entry &^ 0x80000000))
 	} else {
 		buf.Write32b(uint32(entry))
 	}
-	buf.Write32b(uint32(Spsize))
-	buf.Write32b(uint32(Lcsize))
+	buf.Write32b(uint32(spSize))
+	buf.Write32b(uint32(lcSize))
 	// amd64 includes the entry at the beginning of the symbol table.
 	if is64Bit {
 		buf.Write64b(uint64(entry))
 	}
 }
+
+// asmbPlan9 assembles a plan 9 binary.
+func asmbPlan9(ctxt *Link) {
+	if !*FlagS {
+		*FlagS = true
+		symo := int64(Segdata.Fileoff + Segdata.Filelen)
+		ctxt.Out.SeekSet(symo)
+		asmbPlan9Sym(ctxt)
+	}
+	ctxt.Out.SeekSet(0)
+	writePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit)
+}
diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go
index 8bf1259..eaa3ffd 100644
--- a/src/cmd/link/internal/ld/elf.go
+++ b/src/cmd/link/internal/ld/elf.go
@@ -1780,7 +1780,19 @@
 	}
 }
 
-func asmbElf(ctxt *Link, symo int64) {
+func asmbElf(ctxt *Link) {
+	var symo int64
+	if !*FlagS {
+		symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen)
+		symo = Rnd(symo, int64(*FlagRound))
+		ctxt.Out.SeekSet(symo)
+		asmElfSym(ctxt)
+		ctxt.Out.Write(Elfstrdat)
+		if ctxt.IsExternal() {
+			elfEmitReloc(ctxt)
+		}
+	}
+	ctxt.Out.SeekSet(0)
 
 	ldr := ctxt.loader
 	eh := getElfEhdr()
@@ -2231,7 +2243,7 @@
 		sh := elfshname(".symtab")
 		sh.type_ = SHT_SYMTAB
 		sh.off = uint64(symo)
-		sh.size = uint64(Symsize)
+		sh.size = uint64(symSize)
 		sh.addralign = uint64(ctxt.Arch.RegSize)
 		sh.entsize = 8 + 2*uint64(ctxt.Arch.RegSize)
 		sh.link = uint32(elfshname(".strtab").shnum)
@@ -2239,7 +2251,7 @@
 
 		sh = elfshname(".strtab")
 		sh.type_ = SHT_STRTAB
-		sh.off = uint64(symo) + uint64(Symsize)
+		sh.off = uint64(symo) + uint64(symSize)
 		sh.size = uint64(len(Elfstrdat))
 		sh.addralign = 1
 	}
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index 5c047c8..b0c8f91 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -258,10 +258,10 @@
 
 var (
 	thearch Arch
-	Lcsize  int32
+	lcSize  int32
 	rpath   Rpath
-	Spsize  int32
-	Symsize int32
+	spSize  int32
+	symSize int32
 )
 
 const (
diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go
index 61a56f3..c8f02c4 100644
--- a/src/cmd/link/internal/ld/macho.go
+++ b/src/cmd/link/internal/ld/macho.go
@@ -575,6 +575,14 @@
 }
 
 func asmbMacho(ctxt *Link) {
+	machlink := doMachoLink(ctxt)
+	if !*FlagS && ctxt.IsExternal() {
+		symo := int64(Segdwarf.Fileoff + uint64(Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))) + uint64(machlink))
+		ctxt.Out.SeekSet(symo)
+		machoEmitReloc(ctxt)
+	}
+	ctxt.Out.SeekSet(0)
+
 	/* apple MACH */
 	va := *FlagTextAddr - int64(HEADR)
 
diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go
index dd94373..a448244 100644
--- a/src/cmd/link/internal/ld/symtab.go
+++ b/src/cmd/link/internal/ld/symtab.go
@@ -61,7 +61,7 @@
 		out.Write16(uint16(shndx))
 		out.Write64(uint64(addr))
 		out.Write64(uint64(size))
-		Symsize += ELF64SYMSIZE
+		symSize += ELF64SYMSIZE
 	} else {
 		out.Write32(uint32(off))
 		out.Write32(uint32(addr))
@@ -69,7 +69,7 @@
 		out.Write8(uint8(info))
 		out.Write8(uint8(other))
 		out.Write16(uint16(shndx))
-		Symsize += ELF32SYMSIZE
+		symSize += ELF32SYMSIZE
 	}
 }
 
@@ -271,7 +271,7 @@
 	ctxt.Out.WriteString(name)
 	ctxt.Out.Write8(0)
 
-	Symsize += int32(l) + 1 + int32(len(name)) + 1
+	symSize += int32(l) + 1 + int32(len(name)) + 1
 }
 
 func asmbPlan9Sym(ctxt *Link) {
diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go
index a116a1f..563fe49 100644
--- a/src/cmd/link/internal/ld/xcoff.go
+++ b/src/cmd/link/internal/ld/xcoff.go
@@ -1130,7 +1130,7 @@
 	}
 
 	if ctxt.Debugvlog != 0 || *flagN {
-		ctxt.Logf("symsize = %d\n", uint32(Symsize))
+		ctxt.Logf("symsize = %d\n", uint32(symSize))
 	}
 	xfile.updatePreviousFile(ctxt, true)
 }
@@ -1556,7 +1556,11 @@
 }
 
 // Generate XCOFF assembly file
-func asmbXcoff(ctxt *Link, fileoff int64) {
+func asmbXcoff(ctxt *Link) {
+	ctxt.Out.SeekSet(0)
+	fileoff := int64(Segdwarf.Fileoff + Segdwarf.Filelen)
+	fileoff = int64(Rnd(int64(fileoff), int64(*FlagRound)))
+
 	xfile.sectNameToScnum = make(map[string]int16)
 
 	// Add sections