This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: libgo patch committed: Add precise stack scan support
- From: Matthias Klose <doko at ubuntu dot com>
- To: Ian Lance Taylor <iant at golang dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>, gofrontend-dev at googlegroups dot com
- Date: Mon, 10 Dec 2018 07:40:54 +0100
- Subject: Re: libgo patch committed: Add precise stack scan support
- References: <CAOyqgcWS1nnv+pi3zGC9kDFFoj8_CnJaPa3YmuXdUZuTo9TDLQ@mail.gmail.com>
On 06.12.18 00:09, Ian Lance Taylor 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 the libgo build on ARM32:
../../../src/libgo/runtime/go-unwind.c: In function 'scanstackwithmap_callback':
../../../src/libgo/runtime/go-unwind.c:754:18: error: '_URC_NORMAL_STOP'
undeclared (first use in this function)
754 | return _URC_NORMAL_STOP;
| ^~~~~~~~~~~~~~~~
../../../src/libgo/runtime/go-unwind.c:754:18: note: each undeclared identifier
is reported only once for each function i
t appears in
../../../src/libgo/runtime/go-unwind.c: In function 'probestackmaps_callback':
../../../src/libgo/runtime/go-unwind.c:802:10: error: '_URC_NORMAL_STOP'
undeclared (first use in this function)
802 | return _URC_NORMAL_STOP;
| ^~~~~~~~~~~~~~~~
../../../src/libgo/runtime/go-unwind.c:803:1: warning: control reaches end of
non-void function [-Wreturn-type]
803 | }
| ^
make[6]: *** [Makefile:1474: runtime/go-unwind.lo] Error 1
make[6]: Leaving directory '/<<PKGBUILDDIR>>/build/arm-linux-gnueabihf/libgo'