mirror of
https://github.com/golang/go
synced 2024-11-23 17:40:03 -07:00
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 <khr@golang.org>
This commit is contained in:
parent
c8545722a1
commit
360771e422
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user