Source file test/maymorestack.go

     1  // run -gcflags=-d=maymorestack=main.mayMoreStack
     2  
     3  // Copyright 2021 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test the maymorestack testing hook by injecting a hook that counts
     8  // how many times it is called and checking that count.
     9  
    10  package main
    11  
    12  import "runtime"
    13  
    14  var count uint32
    15  
    16  //go:nosplit
    17  func mayMoreStack() {
    18  	count++
    19  }
    20  
    21  func main() {
    22  	const wantCount = 128
    23  
    24  	anotherFunc(wantCount - 1) // -1 because the call to main already counted
    25  
    26  	if count == 0 {
    27  		panic("mayMoreStack not called")
    28  	} else if count != wantCount {
    29  		println(count, "!=", wantCount)
    30  		panic("wrong number of calls to mayMoreStack")
    31  	}
    32  }
    33  
    34  //go:noinline
    35  func anotherFunc(n int) {
    36  	// Trigger a stack growth on at least some calls to
    37  	// anotherFunc to test that mayMoreStack is called outside the
    38  	// morestack loop. It's also important that it is called
    39  	// before (not after) morestack, but that's hard to test.
    40  	var x [1 << 10]byte
    41  
    42  	if n > 1 {
    43  		anotherFunc(n - 1)
    44  	}
    45  
    46  	runtime.KeepAlive(x)
    47  }
    48  

View as plain text