From 16df2ccdedec47d0be940702bb064f656091bd28 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 13 Apr 2017 06:11:36 -0700 Subject: [PATCH] cmd/compile: emit string symbols during walk 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 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/walk.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 7cdc56d05cf..954433c447f 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -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)