go/test/maymorestack.go
Austin Clements 3839b60014 cmd/{asm,compile,internal/obj}: add "maymorestack" support
This adds a debugging hook for optionally calling a "maymorestack"
function in the prologue of any function that might call morestack
(whether it does at run time or not). The maymorestack function will
let us improve lock checking and add debugging modes that stress
function preemption and stack growth.

Passes toolstash-check -all (except on js/wasm, where toolstash
appears to be broken)

Fixes #48297.

Change-Id: I27197947482b329af75dafb9971fc0d3a52eaf31
Reviewed-on: https://go-review.googlesource.com/c/go/+/359795
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
2021-11-05 00:52:06 +00:00

47 lines
1.1 KiB
Go

// run -gcflags=-d=maymorestack=main.mayMoreStack
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Test the maymorestack testing hook by injecting a hook that counts
// how many times it is called and checking that count.
package main
import "runtime"
var count uint32
//go:nosplit
func mayMoreStack() {
count++
}
func main() {
const wantCount = 128
anotherFunc(wantCount - 1) // -1 because the call to main already counted
if count == 0 {
panic("mayMoreStack not called")
} else if count != wantCount {
println(count, "!=", wantCount)
panic("wrong number of calls to mayMoreStack")
}
}
//go:noinline
func anotherFunc(n int) {
// Trigger a stack growth on at least some calls to
// anotherFunc to test that mayMoreStack is called outside the
// morestack loop. It's also important that it is called
// before (not after) morestack, but that's hard to test.
var x [1 << 10]byte
if n > 1 {
anotherFunc(n - 1)
}
runtime.KeepAlive(x)
}