]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/compile: fix data race on LSym.Pkg
authorCherry Zhang <cherryyz@google.com>
Wed, 2 Oct 2019 21:45:05 +0000 (17:45 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 3 Oct 2019 14:14:43 +0000 (14:14 +0000)
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>
src/cmd/compile/internal/types/sym.go
src/cmd/internal/obj/sym.go

index d43efd3bd077c9e2a1642c3b34f420373b892eba..07bce4d5cdbb81a3d4a18c0f4b135c54d4ea1610 100644 (file)
@@ -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.
index c4eabe78063b371fbb3cf41234a6f398b95a230b..e47c511ddc753479f070bbb3cb158f49ca7ebe4e 100644 (file)
@@ -78,6 +78,13 @@ func (ctxt *Link) LookupStatic(name string) *LSym {
 // LookupABI looks up a symbol with the given ABI.
 // If it does not exist, it creates it.
 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
        switch abi {
        case ABI0:
@@ -94,6 +101,9 @@ func (ctxt *Link) LookupABI(name string, abi ABI) *LSym {
                s = &LSym{Name: name}
                s.SetABI(abi)
                hash[name] = s
+               if init != nil {
+                       init(s)
+               }
        }
        ctxt.hashmu.Unlock()
        return s