Commit 49f4b5a4 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/internal/obj: remove Link.Plan9privates

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: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent b8d327a4
...@@ -725,7 +725,6 @@ type Link struct { ...@@ -725,7 +725,6 @@ type Link struct {
PosTable src.PosTable PosTable src.PosTable
InlTree InlTree // global inlining tree used by gc/inl.go InlTree InlTree // global inlining tree used by gc/inl.go
Imports []string Imports []string
Plan9privates *LSym
DiagFunc func(string, ...interface{}) DiagFunc func(string, ...interface{})
DebugInfo func(fn *LSym, curfn interface{}) []*dwarf.Var // if non-nil, curfn is a *gc.Node DebugInfo func(fn *LSym, curfn interface{}) []*dwarf.Var // if non-nil, curfn is a *gc.Node
Errors int Errors int
......
...@@ -39,6 +39,11 @@ import ( ...@@ -39,6 +39,11 @@ import (
"strings" "strings"
) )
var (
plan9privates *obj.LSym
deferreturn *obj.LSym
)
// Instruction layout. // Instruction layout.
const ( const (
...@@ -1830,10 +1835,6 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { ...@@ -1830,10 +1835,6 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) {
n := 0 n := 0
var c int32 var c int32
errors := ctxt.Errors errors := ctxt.Errors
var deferreturn *obj.LSym
if ctxt.Headtype == obj.Hnacl {
deferreturn = ctxt.Lookup("runtime.deferreturn", 0)
}
for { for {
loop := int32(0) loop := int32(0)
for i := range s.R { for i := range s.R {
...@@ -1973,6 +1974,13 @@ func instinit(ctxt *obj.Link) { ...@@ -1973,6 +1974,13 @@ func instinit(ctxt *obj.Link) {
return 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++ { for i := 1; optab[i].as != 0; i++ {
c := optab[i].as c := optab[i].as
if opindex[c&obj.AMask] != nil { if opindex[c&obj.AMask] != nil {
...@@ -4108,13 +4116,10 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { ...@@ -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) asmbuf.asmand(ctxt, cursym, p, &pp.From, &p.To)
} }
case obj.Hplan9: case obj.Hplan9:
if ctxt.Plan9privates == nil {
ctxt.Plan9privates = ctxt.Lookup("_privates", 0)
}
pp.From = obj.Addr{} pp.From = obj.Addr{}
pp.From.Type = obj.TYPE_MEM pp.From.Type = obj.TYPE_MEM
pp.From.Name = obj.NAME_EXTERN pp.From.Name = obj.NAME_EXTERN
pp.From.Sym = ctxt.Plan9privates pp.From.Sym = plan9privates
pp.From.Offset = 0 pp.From.Offset = 0
pp.From.Index = REG_NONE pp.From.Index = REG_NONE
asmbuf.Put1(0x8B) asmbuf.Put1(0x8B)
...@@ -4164,13 +4169,10 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { ...@@ -4164,13 +4169,10 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) {
asmbuf.PutInt32(0) asmbuf.PutInt32(0)
case obj.Hplan9: case obj.Hplan9:
if ctxt.Plan9privates == nil {
ctxt.Plan9privates = ctxt.Lookup("_privates", 0)
}
pp.From = obj.Addr{} pp.From = obj.Addr{}
pp.From.Type = obj.TYPE_MEM pp.From.Type = obj.TYPE_MEM
pp.From.Name = obj.NAME_EXTERN pp.From.Name = obj.NAME_EXTERN
pp.From.Sym = ctxt.Plan9privates pp.From.Sym = plan9privates
pp.From.Offset = 0 pp.From.Offset = 0
pp.From.Index = REG_NONE pp.From.Index = REG_NONE
asmbuf.rexflag |= Pw asmbuf.rexflag |= Pw
......
...@@ -589,10 +589,6 @@ func nacladdr(ctxt *obj.Link, p *obj.Prog, a *obj.Addr) { ...@@ -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) { 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 { if cursym.Text == nil || cursym.Text.Link == nil {
return return
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment