From 360771e422ff0e586963e1dc0818c427b5444379 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Aug 2018 12:09:34 -0400 Subject: [PATCH] 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 --- src/cmd/compile/internal/gc/plive.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 } -- 2.48.1