]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: convert asmb2 pass to new style on Plan 9
authorCherry Zhang <cherryyz@google.com>
Mon, 11 May 2020 16:52:37 +0000 (12:52 -0400)
committerCherry Zhang <cherryyz@google.com>
Mon, 11 May 2020 19:51:04 +0000 (19:51 +0000)
And no longer do loadlibfull there.

Change-Id: I0359f40123f6b0b7855d6fced5876fd4da9c6130
Reviewed-on: https://go-review.googlesource.com/c/go/+/233337
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@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/lib.go
src/cmd/link/internal/ld/main.go
src/cmd/link/internal/ld/symtab.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/x86/asm.go

index c05767022ca8446cc3091594981c77555db27c19..c8b4a1f26116d4de007383621856cc65b9c1269f 100644 (file)
@@ -795,12 +795,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                case objabi.Hplan9:
                        ld.Asmplan9sym(ctxt)
 
-                       sym := ctxt.Syms.Lookup("pclntab", 0)
-                       if sym != nil {
-                               ld.Lcsize = int32(len(sym.P))
-                               ctxt.Out.Write(sym.P)
-                       }
-
                case objabi.Hwindows:
                        // Do nothing
 
@@ -823,7 +817,7 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
                ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
                ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */
-               vl := ld.Entryvalue(ctxt)
+               vl := ld.Entryvalue2(ctxt)
                ctxt.Out.Write32b(PADDR(uint32(vl))) /* va of entry */
                ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */
                ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */
index 5990179fe74c09f5eb652e304b1f3916a249fff9..e268c155653452fb05cc8579d573b486bb230d0a 100644 (file)
@@ -734,12 +734,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                case objabi.Hplan9:
                        ld.Asmplan9sym(ctxt)
 
-                       sym := ctxt.Syms.Lookup("pclntab", 0)
-                       if sym != nil {
-                               ld.Lcsize = int32(len(sym.P))
-                               ctxt.Out.Write(sym.P)
-                       }
-
                case objabi.Hwindows:
                        // Do nothing
                }
@@ -753,8 +747,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */
                ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
                ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
-               ctxt.Out.Write32b(uint32(ld.Symsize))          /* nsyms */
-               ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */
+               ctxt.Out.Write32b(uint32(ld.Symsize))           /* nsyms */
+               ctxt.Out.Write32b(uint32(ld.Entryvalue2(ctxt))) /* va of entry */
                ctxt.Out.Write32b(0)
                ctxt.Out.Write32b(uint32(ld.Lcsize))
 
index 306eb7d46cf8ee3de7a4f3f4030be79e31409591..787851bbd29b5f15f1794b9168231846c4f12dc3 100644 (file)
@@ -867,12 +867,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                case objabi.Hplan9:
                        ld.Asmplan9sym(ctxt)
 
-                       sym := ctxt.Syms.Lookup("pclntab", 0)
-                       if sym != nil {
-                               ld.Lcsize = int32(len(sym.P))
-                               ctxt.Out.Write(sym.P)
-                       }
-
                case objabi.Hdarwin:
                        if ctxt.LinkMode == ld.LinkExternal {
                                ld.Machoemitreloc(ctxt)
@@ -888,8 +882,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
                ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
                ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
-               ctxt.Out.Write32(uint32(ld.Symsize))          /* nsyms */
-               ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
+               ctxt.Out.Write32(uint32(ld.Symsize))           /* nsyms */
+               ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */
                ctxt.Out.Write32(0)
                ctxt.Out.Write32(uint32(ld.Lcsize))
 
index 20c483ea4468adddda4dadea3e591187bb174546..229ed12f269cbbba966a0be1715e551b585a9e6c 100644 (file)
@@ -2477,7 +2477,7 @@ func usage() {
        Exit(2)
 }
 
-type SymbolType int8
+type SymbolType int8 // TODO: after genasmsym is gone, maybe rename to plan9typeChar or something
 
 const (
        // see also https://9p.io/magic/man2html/1/nm
index 3c28a8b6da8c547dae39aafbd0e53884d082ce84..bcb1e888a04559238c0a0ed515ebe6e99660d4a2 100644 (file)
@@ -320,7 +320,7 @@ func Main(arch *sys.Arch, theArch Arch) {
        thearch.Asmb(ctxt, ctxt.loader)
        bench.Start("reloc")
        ctxt.reloc()
-       newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm()
+       newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() || ctxt.IsPlan9()
        if !newasmb2 {
                bench.Start("loadlibfull")
                // We don't need relocations at this point.
index 7ddd3eb6f695f307f96f6fe8db66b9b70febae7c..9748de96d18bd142e8230a87ccf67b5225a13d06 100644 (file)
@@ -224,37 +224,77 @@ func Asmelfsym(ctxt *Link) {
        genasmsym(ctxt, putelfsym)
 }
 
-func putplan9sym(ctxt *Link, x *sym.Symbol, s string, typ SymbolType, addr int64) {
-       t := int(typ)
-       switch typ {
-       case TextSym, DataSym, BSSSym:
-               if x.IsFileLocal() {
-                       t += 'a' - 'A'
-               }
-               fallthrough
+func putplan9sym(ctxt *Link, ldr *loader.Loader, s loader.Sym, char SymbolType) {
+       t := int(char)
+       if ldr.IsFileLocal(s) {
+               t += 'a' - 'A'
+       }
+       l := 4
+       addr := ldr.SymValue(s)
+       if ctxt.IsAMD64() && !Flag8 {
+               ctxt.Out.Write32b(uint32(addr >> 32))
+               l = 8
+       }
 
-       case AutoSym, ParamSym, FrameSym:
-               l := 4
-               if ctxt.HeadType == objabi.Hplan9 && ctxt.Arch.Family == sys.AMD64 && !Flag8 {
-                       ctxt.Out.Write32b(uint32(addr >> 32))
-                       l = 8
-               }
+       ctxt.Out.Write32b(uint32(addr))
+       ctxt.Out.Write8(uint8(t + 0x80)) /* 0x80 is variable length */
 
-               ctxt.Out.Write32b(uint32(addr))
-               ctxt.Out.Write8(uint8(t + 0x80)) /* 0x80 is variable length */
+       name := ldr.SymName(s)
+       ctxt.Out.WriteString(name)
+       ctxt.Out.Write8(0)
 
-               ctxt.Out.WriteString(s)
-               ctxt.Out.Write8(0)
+       Symsize += int32(l) + 1 + int32(len(name)) + 1
+}
 
-               Symsize += int32(l) + 1 + int32(len(s)) + 1
+func Asmplan9sym(ctxt *Link) {
+       ldr := ctxt.loader
 
-       default:
-               return
+       // Add special runtime.text and runtime.etext symbols.
+       s := ldr.Lookup("runtime.text", 0)
+       if ldr.SymType(s) == sym.STEXT {
+               putplan9sym(ctxt, ldr, s, TextSym)
+       }
+       s = ldr.Lookup("runtime.etext", 0)
+       if ldr.SymType(s) == sym.STEXT {
+               putplan9sym(ctxt, ldr, s, TextSym)
        }
-}
 
-func Asmplan9sym(ctxt *Link) {
-       genasmsym(ctxt, putplan9sym)
+       // Add text symbols.
+       for _, s := range ctxt.Textp2 {
+               putplan9sym(ctxt, ldr, s, TextSym)
+       }
+
+       shouldBeInSymbolTable := func(s loader.Sym) bool {
+               if ldr.AttrNotInSymbolTable(s) {
+                       return false
+               }
+               name := ldr.RawSymName(s) // TODO: try not to read the name
+               if name == "" || name[0] == '.' {
+                       return false
+               }
+               return true
+       }
+
+       // Add data symbols and external references.
+       for s := loader.Sym(1); s < loader.Sym(ldr.NSym()); s++ {
+               if !ldr.AttrReachable(s) {
+                       continue
+               }
+               t := ldr.SymType(s)
+               if t >= sym.SELFRXSECT && t < sym.SXREF { // data sections handled in dodata
+                       if t == sym.STLSBSS {
+                               continue
+                       }
+                       if !shouldBeInSymbolTable(s) {
+                               continue
+                       }
+                       char := DataSym
+                       if t == sym.SBSS || t == sym.SNOPTRBSS {
+                               char = BSSSym
+                       }
+                       putplan9sym(ctxt, ldr, s, char)
+               }
+       }
 }
 
 type byPkg []*sym.Library
index c67753c290e30da9f44c781f0b248783bcb0151e..479157cb506104946ad7c0f0c2777851ae6b1ec8 100644 (file)
@@ -226,12 +226,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
 
                case objabi.Hplan9:
                        ld.Asmplan9sym(ctxt)
-
-                       sym := ctxt.Syms.Lookup("pclntab", 0)
-                       if sym != nil {
-                               ld.Lcsize = int32(len(sym.P))
-                               ctxt.Out.Write(sym.P)
-                       }
                }
        }
 
@@ -247,8 +241,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
                ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
                ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
-               ctxt.Out.Write32(uint32(ld.Symsize))          /* nsyms */
-               ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
+               ctxt.Out.Write32(uint32(ld.Symsize))           /* nsyms */
+               ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */
                ctxt.Out.Write32(0)
                ctxt.Out.Write32(uint32(ld.Lcsize))
 
index c6ee3d6033a9b59d6b5729b7bc14a2aa0a6afdb2..7e08e534b31c10a0deb14ee75cccc59bb162744e 100644 (file)
@@ -1143,12 +1143,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                case objabi.Hplan9:
                        ld.Asmplan9sym(ctxt)
 
-                       sym := ctxt.Syms.Lookup("pclntab", 0)
-                       if sym != nil {
-                               ld.Lcsize = int32(len(sym.P))
-                               ctxt.Out.Write(sym.P)
-                       }
-
                case objabi.Haix:
                        // symtab must be added once sections have been created in ld.Asmbxcoff
                }
@@ -1162,8 +1156,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
                ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
                ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
-               ctxt.Out.Write32(uint32(ld.Symsize))          /* nsyms */
-               ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
+               ctxt.Out.Write32(uint32(ld.Symsize))           /* nsyms */
+               ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */
                ctxt.Out.Write32(0)
                ctxt.Out.Write32(uint32(ld.Lcsize))
 
index 824e20b828eebc04f1ca9523baae5caef192be53..5858845475f72189879a4774a3475963e96c0615 100644 (file)
@@ -632,12 +632,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                case objabi.Hplan9:
                        ld.Asmplan9sym(ctxt)
 
-                       sym := ctxt.Syms.Lookup("pclntab", 0)
-                       if sym != nil {
-                               ld.Lcsize = int32(len(sym.P))
-                               ctxt.Out.Write(sym.P)
-                       }
-
                case objabi.Hwindows:
                        // Do nothing
 
@@ -658,10 +652,10 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
                ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */
                ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
                ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
-               ctxt.Out.Write32b(uint32(ld.Symsize))          /* nsyms */
-               ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */
-               ctxt.Out.Write32b(uint32(ld.Spsize))           /* sp offsets */
-               ctxt.Out.Write32b(uint32(ld.Lcsize))           /* line offsets */
+               ctxt.Out.Write32b(uint32(ld.Symsize))           /* nsyms */
+               ctxt.Out.Write32b(uint32(ld.Entryvalue2(ctxt))) /* va of entry */
+               ctxt.Out.Write32b(uint32(ld.Spsize))            /* sp offsets */
+               ctxt.Out.Write32b(uint32(ld.Lcsize))            /* line offsets */
 
        case objabi.Hdarwin:
                ld.Asmbmacho(ctxt)