| // Copyright 2016 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. |
| // issue 17381: make sure leave function with non-empty frame |
| // saves link register, so that traceback will work. |
| pcs := make([]uintptr, 20) |
| n := runtime.Callers(1, pcs) |
| for _, pc := range pcs[:n] { |
| if runtime.FuncForPC(pc).Name() == "main.main" { |
| panic("cannot find main.main in backtrace") |
| func funcPC(f interface{}) uintptr { |
| return **(**uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&f)) + unsafe.Sizeof(ptr))) |
| var t [1]int // non-empty frame |
| var p = funcPC(runtime.GC) + 8 |
| // put some garbage on stack |
| var x = [20]uintptr{p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p} |