mirror of
https://github.com/golang/go
synced 2024-11-23 19:30:05 -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())
|
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).
|
// forkAndExecInChild calls vfork (on linux/amd64, anyway).
|
||||||
// The code we add here clobbers parts of the stack in the child.
|
// 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
|
// When the parent resumes, it is using the same stack frame. But the
|
||||||
// child has clobbered stack variables that the parent needs. Boom!
|
// child has clobbered stack variables that the parent needs. Boom!
|
||||||
// In particular, the sys argument gets clobbered.
|
// In particular, the sys argument gets clobbered.
|
||||||
// Note to self: GOCLOBBERDEADHASH=011100101110
|
// Note to self: GOCLOBBERDEADHASH=011100101110
|
||||||
|
//
|
||||||
|
// runtime.wbBufFlush must not modify its arguments. See the comments
|
||||||
|
// in runtime/mwbbuf.go:wbBufFlush.
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user