From c5b21c3f4c17b0649155035d2f9aa97b2da8a813 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 30 Jul 2021 14:28:58 -0700 Subject: libgo: update to Go1.17rc2 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/341629 --- libgo/runtime/stack.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) (limited to 'libgo/runtime/stack.c') diff --git a/libgo/runtime/stack.c b/libgo/runtime/stack.c index c78f0c4..0c0c30e 100644 --- a/libgo/runtime/stack.c +++ b/libgo/runtime/stack.c @@ -23,7 +23,7 @@ bool runtime_usestackmaps; #pragma GCC optimize ("-fno-optimize-sibling-calls") extern void scanstackblock(uintptr addr, uintptr size, void *gcw) - __asm__("runtime.scanstackblock"); + __asm__(GOSYM_PREFIX "runtime.scanstackblock"); static bool doscanstack1(G*, void*) __attribute__ ((noinline)); @@ -125,3 +125,66 @@ static bool doscanstack1(G *gp, void *gcw) { #endif return true; } + +extern bool onCurrentStack(uintptr p) + __asm__(GOSYM_PREFIX "runtime.onCurrentStack"); + +bool onCurrentStack(uintptr p) +{ +#ifdef USING_SPLIT_STACK + + void* sp; + size_t spsize; + void* next_segment; + void* next_sp; + void* initial_sp; + + sp = __splitstack_find(nil, nil, &spsize, &next_segment, &next_sp, + &initial_sp); + while (sp != nil) { + if (p >= (uintptr)(sp) && p < (uintptr)(sp) + spsize) { + return true; + } + sp = __splitstack_find(next_segment, next_sp, &spsize, + &next_segment, &next_sp, &initial_sp); + } + return false; + +#else + + G* gp; + byte* bottom; + byte* top; + byte* temp; + byte* nextsp2; + byte* initialsp2; + + gp = runtime_g(); + bottom = (byte*)(&p); + top = (byte*)(void*)(gp->gcinitialsp) + gp->gcstacksize; + if ((uintptr)(top) < (uintptr)(bottom)) { + temp = top; + top = bottom; + bottom = temp; + } + if (p >= (uintptr)(bottom) && p < (uintptr)(top)) { + return true; + } + + nextsp2 = secondary_stack_pointer(); + if (nextsp2 != nil) { + initialsp2 = (byte*)(void*)(gp->gcinitialsp2); + if (uintptr(initialsp2) < uintptr(nextsp2)) { + temp = initialsp2; + initialsp2 = nextsp2; + nextsp2 = temp; + } + if (p >= (uintptr)(nextsp2) && p < (uintptr)(initialsp2)) { + return true; + } + } + + return false; + +#endif +} -- cgit v1.1 From e5c00544cce1feb2c8c4e9aad766315d389c69c4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 13 Aug 2021 10:15:45 -0700 Subject: runtime: use C cast syntax in stack.c Didn't notice earlier because this code is only used on systems that do not support -fsplit-stack. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/342051 --- libgo/runtime/stack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libgo/runtime/stack.c') diff --git a/libgo/runtime/stack.c b/libgo/runtime/stack.c index 0c0c30e..65e8fa3 100644 --- a/libgo/runtime/stack.c +++ b/libgo/runtime/stack.c @@ -174,7 +174,7 @@ bool onCurrentStack(uintptr p) nextsp2 = secondary_stack_pointer(); if (nextsp2 != nil) { initialsp2 = (byte*)(void*)(gp->gcinitialsp2); - if (uintptr(initialsp2) < uintptr(nextsp2)) { + if ((uintptr)(initialsp2) < (uintptr)(nextsp2)) { temp = initialsp2; initialsp2 = nextsp2; nextsp2 = temp; -- cgit v1.1