1
0
mirror of https://github.com/golang/go synced 2024-11-07 15:46:23 -07:00

[dev.link] cmd/compile: fix data race on LSym.Pkg

LSym may be created concurrently. Reading/writing LSym.Pkg may
cause data race (see
https://build.golang.org/log/f0351c5cc7bf4c92e3aa5e78e294c2d009ebf118).
Fix this by setting LSym.Pkg only when holding the lock.

Change-Id: Ib3160ecf47c4ca530b09369e0e8284db6597cfd0
Reviewed-on: https://go-review.googlesource.com/c/go/+/198492
Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
Cherry Zhang 2019-10-02 17:45:05 -04:00
parent 53b7c18284
commit a09cd8ccb3
2 changed files with 17 additions and 9 deletions

View File

@ -76,24 +76,22 @@ func (sym *Sym) LinksymName() string {
return sym.Pkg.Prefix + "." + sym.Name return sym.Pkg.Prefix + "." + sym.Name
} }
func (sym *Sym) Linksym() (r *obj.LSym) { func (sym *Sym) Linksym() *obj.LSym {
if sym == nil { if sym == nil {
return nil return nil
} }
if sym.Func() { initPkg := func(r *obj.LSym) {
// This is a function symbol. Mark it as "internal ABI".
r = Ctxt.LookupABI(sym.LinksymName(), obj.ABIInternal)
} else {
r = Ctxt.Lookup(sym.LinksymName())
}
if r.Pkg == "" {
if sym.Linkname != "" { if sym.Linkname != "" {
r.Pkg = "_" r.Pkg = "_"
} else { } else {
r.Pkg = sym.Pkg.Prefix r.Pkg = sym.Pkg.Prefix
} }
} }
return if sym.Func() {
// This is a function symbol. Mark it as "internal ABI".
return Ctxt.LookupABIInit(sym.LinksymName(), obj.ABIInternal, initPkg)
}
return Ctxt.LookupInit(sym.LinksymName(), initPkg)
} }
// Less reports whether symbol a is ordered before symbol b. // Less reports whether symbol a is ordered before symbol b.

View File

@ -78,6 +78,13 @@ func (ctxt *Link) LookupStatic(name string) *LSym {
// LookupABI looks up a symbol with the given ABI. // LookupABI looks up a symbol with the given ABI.
// If it does not exist, it creates it. // If it does not exist, it creates it.
func (ctxt *Link) LookupABI(name string, abi ABI) *LSym { func (ctxt *Link) LookupABI(name string, abi ABI) *LSym {
return ctxt.LookupABIInit(name, abi, nil)
}
// LookupABI looks up a symbol with the given ABI.
// If it does not exist, it creates it and
// passes it to init for one-time initialization.
func (ctxt *Link) LookupABIInit(name string, abi ABI, init func(s *LSym)) *LSym {
var hash map[string]*LSym var hash map[string]*LSym
switch abi { switch abi {
case ABI0: case ABI0:
@ -94,6 +101,9 @@ func (ctxt *Link) LookupABI(name string, abi ABI) *LSym {
s = &LSym{Name: name} s = &LSym{Name: name}
s.SetABI(abi) s.SetABI(abi)
hash[name] = s hash[name] = s
if init != nil {
init(s)
}
} }
ctxt.hashmu.Unlock() ctxt.hashmu.Unlock()
return s return s