Skip to content

Commit

Permalink
runtime: mark {g,m,p}uintptr methods as nosplit
Browse files Browse the repository at this point in the history
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 golang#11482

Change-Id: Ia065c385978a2e7fe9f587811991d088c4d68325
  • Loading branch information
mwhudson committed Nov 23, 2015
1 parent a7c09ad commit 2cc4173
Showing 1 changed file with 14 additions and 3 deletions.
17 changes: 14 additions & 3 deletions src/runtime/runtime2.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit 2cc4173

Please sign in to comment.