diff options
author | Cherry Zhang <cherryyz@google.com> | 2019-10-02 17:45:05 -0400 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2019-10-03 14:14:43 +0000 |
commit | a09cd8ccb372d760bd21d7e56f42b9dbea6ecc2b (patch) | |
tree | b7fb933a69cbb9db7792ddceb6edc49339b78bd8 /src/cmd/compile/internal/types/sym.go | |
parent | 53b7c18284a404de6ca814bc3313d980b8e5ecc3 (diff) | |
download | go-a09cd8ccb372d760bd21d7e56f42b9dbea6ecc2b.tar.gz go-a09cd8ccb372d760bd21d7e56f42b9dbea6ecc2b.zip |
[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>
Diffstat (limited to 'src/cmd/compile/internal/types/sym.go')
-rw-r--r-- | src/cmd/compile/internal/types/sym.go | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/src/cmd/compile/internal/types/sym.go b/src/cmd/compile/internal/types/sym.go index d43efd3bd0..07bce4d5cd 100644 --- a/src/cmd/compile/internal/types/sym.go +++ b/src/cmd/compile/internal/types/sym.go @@ -76,24 +76,22 @@ func (sym *Sym) LinksymName() string { return sym.Pkg.Prefix + "." + sym.Name } -func (sym *Sym) Linksym() (r *obj.LSym) { +func (sym *Sym) Linksym() *obj.LSym { if sym == nil { return nil } - if sym.Func() { - // 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 == "" { + initPkg := func(r *obj.LSym) { if sym.Linkname != "" { r.Pkg = "_" } else { 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. |