Hi Ian, > 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. The Solaris equivalents would be thr_self (for gettid) and thr_kill (for tgkill). It were probably better to use non-Linux specific names here... Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University
# HG changeset patch # Parent 2c9abfeb2f017f5c48ccdee7ce72d72bcffb9250 Fix go/runtime/stubs_nonlinux.go compilation diff --git a/libgo/go/runtime/stubs_nonlinux.go b/libgo/go/runtime/stubs_nonlinux.go --- a/libgo/go/runtime/stubs_nonlinux.go +++ b/libgo/go/runtime/stubs_nonlinux.go @@ -17,4 +17,5 @@ func gettid() _pid_t { func tgkill(pid _pid_t, tid _pid_t, sig uint32) uint32 { throw("tgkill not implemented") + return 0; }