diff options
author | Ian Lance Taylor <iant@golang.org> | 2021-07-30 14:28:58 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2021-08-12 20:23:07 -0700 |
commit | c5b21c3f4c17b0649155035d2f9aa97b2da8a813 (patch) | |
tree | c6d3a68b503ba5b16182acbb958e3e5dbc95a43b /libgo/runtime | |
parent | 72be20e20299ec57b4bc9ba03d5b7d6bf10e97cc (diff) | |
download | gcc-c5b21c3f4c17b0649155035d2f9aa97b2da8a813.zip gcc-c5b21c3f4c17b0649155035d2f9aa97b2da8a813.tar.gz gcc-c5b21c3f4c17b0649155035d2f9aa97b2da8a813.tar.bz2 |
libgo: update to Go1.17rc2
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/341629
Diffstat (limited to 'libgo/runtime')
-rw-r--r-- | libgo/runtime/go-now.c | 4 | ||||
-rw-r--r-- | libgo/runtime/runtime_c.c | 23 | ||||
-rw-r--r-- | libgo/runtime/stack.c | 65 |
3 files changed, 88 insertions, 4 deletions
diff --git a/libgo/runtime/go-now.c b/libgo/runtime/go-now.c index 1c02e52..e1dcd18 100644 --- a/libgo/runtime/go-now.c +++ b/libgo/runtime/go-now.c @@ -8,7 +8,7 @@ #include "runtime.h" -// Return current time. This is the implementation of time.walltime1(). +// Return current time. This is the implementation of runtime.walltime(). struct walltime_ret { @@ -16,7 +16,7 @@ struct walltime_ret int32_t nsec; }; -struct walltime_ret now(void) __asm__ (GOSYM_PREFIX "runtime.walltime1") +struct walltime_ret now(void) __asm__ (GOSYM_PREFIX "runtime.walltime") __attribute__ ((no_split_stack)); struct walltime_ret diff --git a/libgo/runtime/runtime_c.c b/libgo/runtime/runtime_c.c index bc920a5..f92bdd4 100644 --- a/libgo/runtime/runtime_c.c +++ b/libgo/runtime/runtime_c.c @@ -199,10 +199,13 @@ getEnd() uintptr getText(void) __asm__ (GOSYM_PREFIX "runtime.getText"); +extern void main_main(void*) + __asm__(GOSYM_PREFIX "main.main"); + uintptr getText(void) { - return (uintptr)(const void *)(getText); + return (uintptr)(const void *)(main_main); } // Return the end of the text segment, assumed to come after the @@ -224,6 +227,24 @@ getEtext(void) return (uintptr)(p); } +// Return the start of the BSS section. + +uintptr getBSS(void) + __asm__ (GOSYM_PREFIX "runtime.getBSS"); + +uintptr +getBSS(void) +{ + const void *p; + + p = __edata; + if (p == NULL) + p = _edata; + if (p == NULL) + p = __bss_start; + return (uintptr)(p); +} + // CPU-specific initialization. // Fetch CPUID info on x86. 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 +} |