From: Cherry Zhang Date: Wed, 29 Aug 2018 16:09:34 +0000 (-0400) Subject: cmd/compile: don't clobber dead slots in runtime.wbBufFlush X-Git-Tag: go1.12beta1~1218 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=360771e422ff0e586963e1dc0818c427b5444379;p=gostls13.git cmd/compile: don't clobber dead slots in runtime.wbBufFlush runtime.wbBufFlush must not modify its arguments, because the argument slots are also used as spill slots in runtime.gcWriteBarrier. So, GOEXPERIMENT=clobberdead must not clobber them. Updates #27326. Change-Id: Id02bb22a45201eecee748d89e7bdb3df7e4940e4 Reviewed-on: https://go-review.googlesource.com/131957 Reviewed-by: Keith Randall --- diff --git a/src/cmd/compile/internal/gc/plive.go b/src/cmd/compile/internal/gc/plive.go index be53384c1f..e070a5cd1a 100644 --- a/src/cmd/compile/internal/gc/plive.go +++ b/src/cmd/compile/internal/gc/plive.go @@ -1203,13 +1203,16 @@ func (lv *Liveness) clobber() { } fmt.Printf("\t\t\tCLOBBERDEAD %s\n", lv.fn.funcname()) } - if lv.f.Name == "forkAndExecInChild" { + if lv.f.Name == "forkAndExecInChild" || lv.f.Name == "wbBufFlush" { // forkAndExecInChild calls vfork (on linux/amd64, anyway). // The code we add here clobbers parts of the stack in the child. // When the parent resumes, it is using the same stack frame. But the // child has clobbered stack variables that the parent needs. Boom! // In particular, the sys argument gets clobbered. // Note to self: GOCLOBBERDEADHASH=011100101110 + // + // runtime.wbBufFlush must not modify its arguments. See the comments + // in runtime/mwbbuf.go:wbBufFlush. return }