mirror of
https://github.com/golang/go
synced 2024-11-23 14:10:05 -07:00
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>
96 lines
1.9 KiB
Go
96 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)
|
|
}
|
|
}
|
|
}
|