From: Michael Hudson-Doyle Date: Mon, 23 Nov 2015 20:15:36 +0000 (+1300) Subject: runtime: mark {g,m,p}uintptr methods as nosplit X-Git-Tag: go1.6beta1~324 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=239273d963395676484693328b17961f2f862b08;p=gostls13.git 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 Reviewed-on: https://go-review.googlesource.com/17165 Run-TryBot: Michael Hudson-Doyle TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox --- diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index eb7b30a344..05300106f6 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 {