]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: remove Link.Plan9privates
authorJosh Bleecher Snyder <josharian@gmail.com>
Wed, 12 Apr 2017 13:11:08 +0000 (06:11 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Wed, 12 Apr 2017 15:56:14 +0000 (15:56 +0000)
Move it to the x86 package, matching our handling
of deferreturn in x86 and arm.
While we're here, improve the concurrency safety
of both Plan9privates and deferreturn
by eagerly initializing them in instinit.

Updates #15756

Change-Id: If3b1995c1e4ec816a5443a18f8d715631967a8b1
Reviewed-on: https://go-review.googlesource.com/40408
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/internal/obj/link.go
src/cmd/internal/obj/x86/asm6.go
src/cmd/internal/obj/x86/obj6.go

index 82b12105dadbb72132a174eac92bd89565e94f9a..d5d96f792ec248bc229a4324c5f0c6cdd541f5f9 100644 (file)
@@ -725,7 +725,6 @@ type Link struct {
        PosTable      src.PosTable
        InlTree       InlTree // global inlining tree used by gc/inl.go
        Imports       []string
-       Plan9privates *LSym
        DiagFunc      func(string, ...interface{})
        DebugInfo     func(fn *LSym, curfn interface{}) []*dwarf.Var // if non-nil, curfn is a *gc.Node
        Errors        int
index 3fd5052e65ed07bb5808ed09fbf68740259aba83..8d55f9cfe00310daa75d9e9d95660fb6f0502fde 100644 (file)
@@ -39,6 +39,11 @@ import (
        "strings"
 )
 
+var (
+       plan9privates *obj.LSym
+       deferreturn   *obj.LSym
+)
+
 // Instruction layout.
 
 const (
@@ -1830,10 +1835,6 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) {
        n := 0
        var c int32
        errors := ctxt.Errors
-       var deferreturn *obj.LSym
-       if ctxt.Headtype == obj.Hnacl {
-               deferreturn = ctxt.Lookup("runtime.deferreturn", 0)
-       }
        for {
                loop := int32(0)
                for i := range s.R {
@@ -1973,6 +1974,13 @@ func instinit(ctxt *obj.Link) {
                return
        }
 
+       switch ctxt.Headtype {
+       case obj.Hplan9:
+               plan9privates = ctxt.Lookup("_privates", 0)
+       case obj.Hnacl:
+               deferreturn = ctxt.Lookup("runtime.deferreturn", 0)
+       }
+
        for i := 1; optab[i].as != 0; i++ {
                c := optab[i].as
                if opindex[c&obj.AMask] != nil {
@@ -4108,13 +4116,10 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) {
                                                                asmbuf.asmand(ctxt, cursym, p, &pp.From, &p.To)
                                                        }
                                                case obj.Hplan9:
-                                                       if ctxt.Plan9privates == nil {
-                                                               ctxt.Plan9privates = ctxt.Lookup("_privates", 0)
-                                                       }
                                                        pp.From = obj.Addr{}
                                                        pp.From.Type = obj.TYPE_MEM
                                                        pp.From.Name = obj.NAME_EXTERN
-                                                       pp.From.Sym = ctxt.Plan9privates
+                                                       pp.From.Sym = plan9privates
                                                        pp.From.Offset = 0
                                                        pp.From.Index = REG_NONE
                                                        asmbuf.Put1(0x8B)
@@ -4164,13 +4169,10 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) {
                                                asmbuf.PutInt32(0)
 
                                        case obj.Hplan9:
-                                               if ctxt.Plan9privates == nil {
-                                                       ctxt.Plan9privates = ctxt.Lookup("_privates", 0)
-                                               }
                                                pp.From = obj.Addr{}
                                                pp.From.Type = obj.TYPE_MEM
                                                pp.From.Name = obj.NAME_EXTERN
-                                               pp.From.Sym = ctxt.Plan9privates
+                                               pp.From.Sym = plan9privates
                                                pp.From.Offset = 0
                                                pp.From.Index = REG_NONE
                                                asmbuf.rexflag |= Pw
index b931871cee9d6622daba2302a04b7013d5cef139..fc39efeaa86f7e342e6868090b8308c6d0c0fe4d 100644 (file)
@@ -589,10 +589,6 @@ func nacladdr(ctxt *obj.Link, p *obj.Prog, a *obj.Addr) {
 }
 
 func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
-       if ctxt.Headtype == obj.Hplan9 && ctxt.Plan9privates == nil {
-               ctxt.Plan9privates = ctxt.Lookup("_privates", 0)
-       }
-
        if cursym.Text == nil || cursym.Text.Link == nil {
                return
        }