mirror of
https://github.com/golang/go
synced 2024-11-14 06:00:22 -07:00
3839b60014
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>
48 lines
1.1 KiB
Go
48 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)
|
|
}
|