From 2cc41731df58f584e44a1aae275896db8d105535 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Tue, 24 Nov 2015 09:15:36 +1300 Subject: [PATCH] runtime: mark {g,m,p}uintptr methods as nosplit These are methods that are "obviously" going to get inlined -- until you build with -l, when they can trigger a stack split at a bad time. Fixes #11482 Change-Id: Ia065c385978a2e7fe9f587811991d088c4d68325 --- src/runtime/runtime2.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index eb7b30a344d2c0..05300106f60289 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -122,20 +122,31 @@ func efaceOf(ep *interface{}) *eface { // alternate arena. Using guintptr doesn't make that problem any worse. type guintptr uintptr -func (gp guintptr) ptr() *g { return (*g)(unsafe.Pointer(gp)) } +//go:nosplit +func (gp guintptr) ptr() *g { return (*g)(unsafe.Pointer(gp)) } + +//go:nosplit func (gp *guintptr) set(g *g) { *gp = guintptr(unsafe.Pointer(g)) } + +//go:nosplit func (gp *guintptr) cas(old, new guintptr) bool { return atomic.Casuintptr((*uintptr)(unsafe.Pointer(gp)), uintptr(old), uintptr(new)) } type puintptr uintptr -func (pp puintptr) ptr() *p { return (*p)(unsafe.Pointer(pp)) } +//go:nosplit +func (pp puintptr) ptr() *p { return (*p)(unsafe.Pointer(pp)) } + +//go:nosplit func (pp *puintptr) set(p *p) { *pp = puintptr(unsafe.Pointer(p)) } type muintptr uintptr -func (mp muintptr) ptr() *m { return (*m)(unsafe.Pointer(mp)) } +//go:nosplit +func (mp muintptr) ptr() *m { return (*m)(unsafe.Pointer(mp)) } + +//go:nosplit func (mp *muintptr) set(m *m) { *mp = muintptr(unsafe.Pointer(m)) } type gobuf struct {