summaryrefslogtreecommitdiffstats
path: root/test/maymorestack.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/maymorestack.go')
-rw-r--r--test/maymorestack.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/test/maymorestack.go b/test/maymorestack.go
new file mode 100644
index 0000000..ec84ad4
--- /dev/null
+++ b/test/maymorestack.go
@@ -0,0 +1,47 @@
+// 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)
+}