1
0
mirror of https://github.com/golang/go synced 2024-10-02 06:28:33 -06:00

runtime: allow write barriers in startpanic_m

We're about to start tracking nowritebarrierrec through systemstack
calls, which will reveal write barriers in startpanic_m prohibited by
various callers.

We actually can allow write barriers here because the write barrier is
a no-op when we're panicking. Let the compiler know.

Updates #22384.
For #22460.

Change-Id: Ifb3a38d3dd9a4125c278c3680f8648f987a5b0b8
Reviewed-on: https://go-review.googlesource.com/72770
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
This commit is contained in:
Austin Clements 2017-10-22 18:10:08 -04:00
parent 249b5cc945
commit 070cc8eb02
2 changed files with 8 additions and 0 deletions

View File

@ -182,6 +182,8 @@ func gcmarkwb_m(slot *uintptr, ptr uintptr) {
func writebarrierptr_prewrite1(dst *uintptr, src uintptr) { func writebarrierptr_prewrite1(dst *uintptr, src uintptr) {
mp := acquirem() mp := acquirem()
if mp.inwb || mp.dying > 0 { if mp.inwb || mp.dying > 0 {
// We explicitly allow write barriers in startpanic_m,
// since we're going down anyway. Ignore them here.
releasem(mp) releasem(mp)
return return
} }

View File

@ -654,6 +654,12 @@ func recovery(gp *g) {
gogo(&gp.sched) gogo(&gp.sched)
} }
// startpanic_m implements unrecoverable panic.
//
// It can have write barriers because the write barrier explicitly
// ignores writes once dying > 0.
//
//go:yeswritebarrierrec
func startpanic_m() { func startpanic_m() {
_g_ := getg() _g_ := getg()
if mheap_.cachealloc.size == 0 { // very early if mheap_.cachealloc.size == 0 { // very early