aboutsummaryrefslogtreecommitdiff
path: root/libgo/runtime
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2021-07-30 14:28:58 -0700
committerIan Lance Taylor <iant@golang.org>2021-08-12 20:23:07 -0700
commitc5b21c3f4c17b0649155035d2f9aa97b2da8a813 (patch)
treec6d3a68b503ba5b16182acbb958e3e5dbc95a43b /libgo/runtime
parent72be20e20299ec57b4bc9ba03d5b7d6bf10e97cc (diff)
downloadgcc-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.c4
-rw-r--r--libgo/runtime/runtime_c.c23
-rw-r--r--libgo/runtime/stack.c65
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
+}