On Fri, Dec 7, 2018 at 2:07 AM Rainer Orth <r...@cebitec.uni-bielefeld.de> wrote: > > > This libgo patch by Cherry Zhang adds support for precise stack > > scanning to the Go runtime. This uses per-function stack maps stored > > in the exception tables in the language-specific data area. The > > compiler needs to generate these stack maps; currently this is only > > done by a version of LLVM, not by GCC. Each safepoint in a function > > is associated with a (real or dummy) landing pad, and its "type info" > > in the exception table is a pointer to the stack map. When a stack is > > scanned, the stack map is found by the stack unwinding code. > > > > For precise stack scan we need to unwind the stack. There are three cases: > > > > - If a goroutine is scanning its own stack, it can unwind the stack > > and scan the frames. > > > > - If a goroutine is scanning another, stopped, goroutine, it cannot > > directly unwind the target stack. We handle this by switching > > (runtime.gogo) to the target g, letting it unwind and scan the stack, > > and switch back. > > > > - If we are scanning a goroutine that is blocked in a syscall, we send > > a signal to the target goroutine's thread, and let the signal handler > > unwind and scan the stack. Extra care is needed as this races with > > enter/exit syscall. > > > > Currently this is only implemented on GNU/Linux. > > > > Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed > > to mainline. > > this broke Solaris (and other non-Linux) bootstrap: > > /vol/gcc/src/hg/trunk/local/libgo/go/runtime/stubs_nonlinux.go:20:1: error: > missing return at end of function > 20 | } > | ^ > > Fixed by returning 0 for now, the return value is ignored in > go/runtime/proc.go (scang) anyway.
Thanks. Committed to mainline. Ian