aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/types/sym.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2019-10-02 17:45:05 -0400
committerCherry Zhang <cherryyz@google.com>2019-10-03 14:14:43 +0000
commita09cd8ccb372d760bd21d7e56f42b9dbea6ecc2b (patch)
treeb7fb933a69cbb9db7792ddceb6edc49339b78bd8 /src/cmd/compile/internal/types/sym.go
parent53b7c18284a404de6ca814bc3313d980b8e5ecc3 (diff)
downloadgo-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.go16
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.