runtime: mark dropm and callees nowritebarrierrec
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 22 Jun 2017 22:11:01 +0000 (22:11 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 22 Jun 2017 22:11:01 +0000 (22:11 +0000)
    The CgocallbackDone function calls dropm after it calls entersyscall,
    which means that dropm must not have any write barriers. Mark it
    accordingly.

    Reviewed-on: https://go-review.googlesource.com/46464

From-SVN: r249577

gcc/go/gofrontend/MERGE
libgo/go/runtime/os_gccgo.go
libgo/go/runtime/proc.go
libgo/go/runtime/signal_unix.go

index fb6b7be02c10506f205664ea41658c24e83b4ddc..3f42df6305698f41426ee106317f70825bf6e6d3 100644 (file)
@@ -1,4 +1,4 @@
-55b2b2dee55bd495a770347daaf858634057ecb0
+c5aa42107d116c9121de447d214297c88dd9f5fa
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 358a38bd3a3cdb6c1d5cac0da8a675748ba553bd..db3ea48ef4850959174f21fdf42b380519b47a3e 100644 (file)
@@ -32,6 +32,7 @@ func minit() {
 
 // Called from dropm to undo the effect of an minit.
 //go:nosplit
+//go:nowritebarrierrec
 func unminit() {
        unminitSignals()
 }
index bdf7144ee0c63272adbe1c291184d2a9823cc4b4..77b624ba61216c31c764258bc4a3aacd44e0126f 100644 (file)
@@ -1447,6 +1447,9 @@ func oneNewExtraM() {
 // in which dropm happens on each cgo call, is still correct too.
 // We may have to keep the current version on systems with cgo
 // but without pthreads, like Windows.
+//
+// CgocallBackDone calls this after releasing p, so no write barriers.
+//go:nowritebarrierrec
 func dropm() {
        // Clear m and g, and return m to the extra list.
        // After the call to setg we can only call nosplit functions
@@ -1492,6 +1495,7 @@ var extraMWaiters uint32
 // return a nil list head if that's what it finds. If nilokay is false,
 // lockextra will keep waiting until the list head is no longer nil.
 //go:nosplit
+//go:nowritebarrierrec
 func lockextra(nilokay bool) *m {
        const locked = 1
 
@@ -1524,6 +1528,7 @@ func lockextra(nilokay bool) *m {
 }
 
 //go:nosplit
+//go:nowritebarrierrec
 func unlockextra(mp *m) {
        atomic.Storeuintptr(&extram, uintptr(unsafe.Pointer(mp)))
 }
index c8713b6770ac0f5632075ebfe50f1e55051f523d..e2642ee25fc0ed00efc8060661125a317a30d7d4 100644 (file)
@@ -599,6 +599,7 @@ func minitSignalMask() {
 // unminitSignals is called from dropm, via unminit, to undo the
 // effect of calling minit on a non-Go thread.
 //go:nosplit
+//go:nowritebarrierrec
 func unminitSignals() {
        if getg().m.newSigstack {
                signalstack(nil, 0)