mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 00:30:57 +00:00 
			
		
		
		
	 e862f98d1e
			
		
	
	
		e862f98d1e
		
	
	
	
	
		
			
			CL 76551 modified inline_callers.go to build everything, including the runtime, with -l=4. While that works in most places (and ideally should work everywhere), it blows out the nosplit stack on solaris/amd64. Fix this by only building the test itself with -l=4. This undoes some of the changes to this test from CL 73212, which originally changed the go tool to rebuild all packages with the given flags. This change modified the expected output of this test, so now that we can go back to building only the test itself with inlining, we revert these changes to the expected output. (That CL also changed log.Fatalf to log.Printf, but didn't add "\n" to the end of the lines, so this CL fixes that, too.) Fixes #22797. Change-Id: I6a91963a59ebe98edbe0921d8717af6b2c2191b0 Reviewed-on: https://go-review.googlesource.com/79197 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
		
			
				
	
	
		
			95 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // run -gcflags=-l=4
 | |
| 
 | |
| // Copyright 2017 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.
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"runtime"
 | |
| )
 | |
| 
 | |
| var skip int
 | |
| var npcs int
 | |
| var pcs = make([]uintptr, 32)
 | |
| 
 | |
| func f() {
 | |
| 	g()
 | |
| }
 | |
| 
 | |
| func g() {
 | |
| 	h()
 | |
| }
 | |
| 
 | |
| func h() {
 | |
| 	npcs = runtime.Callers(skip, pcs)
 | |
| }
 | |
| 
 | |
| func testCallers(skp int) (frames []string) {
 | |
| 	skip = skp
 | |
| 	f()
 | |
| 	for i := 0; i < npcs; i++ {
 | |
| 		fn := runtime.FuncForPC(pcs[i])
 | |
| 		frames = append(frames, fn.Name())
 | |
| 		if fn.Name() == "main.main" {
 | |
| 			break
 | |
| 		}
 | |
| 	}
 | |
| 	return
 | |
| }
 | |
| 
 | |
| func testCallersFrames(skp int) (frames []string) {
 | |
| 	skip = skp
 | |
| 	f()
 | |
| 	callers := pcs[:npcs]
 | |
| 	ci := runtime.CallersFrames(callers)
 | |
| 	for {
 | |
| 		frame, more := ci.Next()
 | |
| 		frames = append(frames, frame.Function)
 | |
| 		if !more || frame.Function == "main.main" {
 | |
| 			break
 | |
| 		}
 | |
| 	}
 | |
| 	return
 | |
| }
 | |
| 
 | |
| var expectedFrames [][]string = [][]string{
 | |
| 	0: {"runtime.Callers", "main.testCallers", "main.main"},
 | |
| 	1: {"main.testCallers", "main.main"},
 | |
| 	2: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
 | |
| 	3: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
 | |
| 	4: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
 | |
| 	5: {"main.main"},
 | |
| }
 | |
| 
 | |
| var allFrames = []string{"runtime.Callers", "main.h", "main.g", "main.f", "main.testCallersFrames", "main.main"}
 | |
| 
 | |
| func same(xs, ys []string) bool {
 | |
| 	if len(xs) != len(ys) {
 | |
| 		return false
 | |
| 	}
 | |
| 	for i := range xs {
 | |
| 		if xs[i] != ys[i] {
 | |
| 			return false
 | |
| 		}
 | |
| 	}
 | |
| 	return true
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	for i := 0; i <= 5; i++ {
 | |
| 		frames := testCallers(i)
 | |
| 		expected := expectedFrames[i]
 | |
| 		if !same(frames, expected) {
 | |
| 			fmt.Printf("testCallers(%d):\n got %v\n want %v\n", i, frames, expected)
 | |
| 		}
 | |
| 
 | |
| 		frames = testCallersFrames(i)
 | |
| 		expected = allFrames[i:]
 | |
| 		if !same(frames, expected) {
 | |
| 			fmt.Printf("testCallersFrames(%d):\n got %v\n want %v\n", i, frames, expected)
 | |
| 		}
 | |
| 	}
 | |
| }
 |