diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-06-22 14:44:30 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-06-22 14:44:30 +0000 |
commit | 3b0ddadf74ec9c7aa404765ec50bb55d255dbec7 (patch) | |
tree | 0c76bd6000837d9b83d3a57a300d41d87eaf3fb1 /libgo/runtime/stack.c | |
parent | a055692a25c10bcd8fd90825cc39709f455335b2 (diff) | |
download | gcc-3b0ddadf74ec9c7aa404765ec50bb55d255dbec7.zip gcc-3b0ddadf74ec9c7aa404765ec50bb55d255dbec7.tar.gz gcc-3b0ddadf74ec9c7aa404765ec50bb55d255dbec7.tar.bz2 |
runtime: change some stack fields to uintptr
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.
Reviewed-on: https://go-review.googlesource.com/46396
From-SVN: r249561
Diffstat (limited to 'libgo/runtime/stack.c')
-rw-r--r-- | libgo/runtime/stack.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/libgo/runtime/stack.c b/libgo/runtime/stack.c index 1ce30db..900ca64 100644 --- a/libgo/runtime/stack.c +++ b/libgo/runtime/stack.c @@ -60,12 +60,12 @@ static void doscanstack1(G *gp, void *gcw) { // as schedlock and may have needed to start a new stack segment. // Use the stack segment and stack pointer at the time of // the system call instead, since that won't change underfoot. - if(gp->gcstack != nil) { - sp = gp->gcstack; + if(gp->gcstack != 0) { + sp = (void*)(gp->gcstack); spsize = gp->gcstacksize; - next_segment = gp->gcnextsegment; - next_sp = gp->gcnextsp; - initial_sp = gp->gcinitialsp; + next_segment = (void*)(gp->gcnextsegment); + next_sp = (void*)(gp->gcnextsp); + initial_sp = (void*)(gp->gcinitialsp); } else { sp = __splitstack_find_context((void**)(&gp->stackcontext[0]), &spsize, &next_segment, @@ -89,11 +89,11 @@ static void doscanstack1(G *gp, void *gcw) { } else { // Scanning another goroutine's stack. // The goroutine is usually asleep (the world is stopped). - bottom = (byte*)gp->gcnextsp; + bottom = (void*)gp->gcnextsp; if(bottom == nil) return; } - top = (byte*)gp->gcinitialsp + gp->gcstacksize; + top = (byte*)(void*)(gp->gcinitialsp) + gp->gcstacksize; if(top > bottom) scanstackblock(bottom, (uintptr)(top - bottom), gcw); else |