This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: libgo patch committed: Change some stack fields to uintptr
- From: Rainer Orth <ro at CeBiTec dot Uni-Bielefeld dot DE>
- To: Ian Lance Taylor <iant at golang dot org>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>, "gofrontend-dev\@googlegroups.com" <gofrontend-dev at googlegroups dot com>
- Date: Thu, 22 Jun 2017 20:09:45 +0200
- Subject: Re: libgo patch committed: Change some stack fields to uintptr
- Authentication-results: sourceware.org; auth=none
- References: <CAOyqgcVORpQEvSgJ1uF+8R_ru1L-XwvB2Q8G-VZXzwDqeb_dnA@mail.gmail.com>
Hi Ian,
> Because of how gccgo implements cgo calls, the code in dropm may not
> have any write barriers. As a step toward implementing that, change
> the gcstack, gcnextsegment, and gcnextsp fields of the g struct to
> uintptr, so that assignments to them do not require write barriers.
> The gcinitialsp field remains unsafe.Pointer, as on 32-bit systems
> that do not support split stack it points to a heap allocated space
> used for the goroutine stack.
>
> The test for this is runtime tests like TestCgoCallbackGC, which are
> not run today but will be run with a future gotools patch.
>
> Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed
> to mainline.
this patch broke bootstrap on non-split-stack targets like Solaris:
/vol/gcc/src/hg/trunk/local/libgo/runtime/proc.c: In function âdoentersyscallblockâ:
/vol/gcc/src/hg/trunk/local/libgo/runtime/proc.c:681:15: error: assignment makes integer from pointer without a cast [-Werror=int-conversion]
g->gcnextsp = (byte *) &v;
^
The patch below allowed sparc-sun-solaris2.12 and i386-pc-solaris2.12
builds to finish.
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c
--- a/libgo/runtime/proc.c
+++ b/libgo/runtime/proc.c
@@ -678,7 +678,7 @@ doentersyscallblock(uintptr pc, uintptr
{
void *v;
- g->gcnextsp = (byte *) &v;
+ g->gcnextsp = (uintptr)(&v);
}
#endif