]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: emit string symbols during walk
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 13 Apr 2017 13:11:36 +0000 (06:11 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 13 Apr 2017 16:37:04 +0000 (16:37 +0000)
This avoids needing a mutex to protect stringsym,
and preserves a consistent ctxt.Data ordering
in the face of a concurrent backend.

Updates #15756

Change-Id: I775daae11db5db1269533a00f5249e3a03086ffc
Reviewed-on: https://go-review.googlesource.com/40509
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/walk.go

index 7cdc56d05cfc46063f579a8aec0a7ce909d9b19c..954433c447f7d10357f7ec5e36a4cab1ab8f110e 100644 (file)
@@ -502,6 +502,8 @@ opswitch:
        case OTYPE, ONAME, OLITERAL:
                // TODO(mdempsky): Just return n; see discussion on CL 38655.
                // Perhaps refactor to use Node.mayBeShared for these instead.
+               // If these return early, make sure to still call
+               // stringsym for constant strings.
 
        case ONOT, OMINUS, OPLUS, OCOM, OREAL, OIMAG, ODOTMETH, ODOTINTER,
                OIND, OSPTR, OITAB, OIDATA, OADDR:
@@ -1653,6 +1655,11 @@ opswitch:
        }
        if n.Op == OLITERAL {
                n = typecheck(n, Erv)
+               // Emit string symbol now to avoid emitting
+               // any concurrently during the backend.
+               if s, ok := n.Val().U.(string); ok {
+                       _ = stringsym(s)
+               }
        }
 
        updateHasCall(n)