aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2019-05-11 01:12:37 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-05-11 01:12:37 +0000
commitc130ab6aad57e0309ec02f58f383aece584ac8cb (patch)
tree0a5fd2bf4f6ad9b59a03ff33d2758937064fc015 /libgo
parentd7b9b0805d5ab514c43e1fe57e43a10394d5d965 (diff)
downloadgcc-c130ab6aad57e0309ec02f58f383aece584ac8cb.zip
gcc-c130ab6aad57e0309ec02f58f383aece584ac8cb.tar.gz
gcc-c130ab6aad57e0309ec02f58f383aece584ac8cb.tar.bz2
runtime: set up g early
runtime.throw needs a g to work properly. Set up g early, to ensure that if something goes wrong in the runtime startup (e.g. runtime.check fails), the program terminates in a reasonable way. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/176657 From-SVN: r271088
Diffstat (limited to 'libgo')
-rw-r--r--libgo/go/runtime/proc.go18
-rw-r--r--libgo/runtime/go-libmain.c1
-rw-r--r--libgo/runtime/go-main.c1
-rw-r--r--libgo/runtime/runtime.h2
4 files changed, 15 insertions, 7 deletions
diff --git a/libgo/go/runtime/proc.go b/libgo/go/runtime/proc.go
index 8146c1d..b40198e 100644
--- a/libgo/go/runtime/proc.go
+++ b/libgo/go/runtime/proc.go
@@ -18,6 +18,7 @@ import (
//go:linkname acquirep runtime.acquirep
//go:linkname releasep runtime.releasep
//go:linkname incidlelocked runtime.incidlelocked
+//go:linkname ginit runtime.ginit
//go:linkname schedinit runtime.schedinit
//go:linkname ready runtime.ready
//go:linkname stopm runtime.stopm
@@ -515,6 +516,15 @@ func cpuinit() {
cpu.Initialize(env)
}
+func ginit() {
+ _m_ := &m0
+ _g_ := &g0
+ _m_.g0 = _g_
+ _m_.curg = _g_
+ _g_.m = _m_
+ setg(_g_)
+}
+
// The bootstrap sequence is:
//
// call osinit
@@ -524,13 +534,7 @@ func cpuinit() {
//
// The new G calls runtimeĀ·main.
func schedinit() {
- _m_ := &m0
- _g_ := &g0
- _m_.g0 = _g_
- _m_.curg = _g_
- _g_.m = _m_
- setg(_g_)
-
+ _g_ := getg()
sched.maxmcount = 10000
usestackmaps = probestackmaps()
diff --git a/libgo/runtime/go-libmain.c b/libgo/runtime/go-libmain.c
index 00a8e6b..8b5bab0 100644
--- a/libgo/runtime/go-libmain.c
+++ b/libgo/runtime/go-libmain.c
@@ -225,6 +225,7 @@ gostart (void *arg)
return NULL;
runtime_isstarted = true;
+ runtime_ginit ();
runtime_check ();
runtime_args (a->argc, (byte **) a->argv);
setncpu (getproccount ());
diff --git a/libgo/runtime/go-main.c b/libgo/runtime/go-main.c
index 301ac4e..e9da8ac 100644
--- a/libgo/runtime/go-main.c
+++ b/libgo/runtime/go-main.c
@@ -48,6 +48,7 @@ main (int argc, char **argv)
setIsCgo ();
__go_end = (uintptr)_end;
+ runtime_ginit ();
runtime_cpuinit ();
runtime_check ();
runtime_args (argc, (byte **) argv);
diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h
index 97b1f11..9506e3d 100644
--- a/libgo/runtime/runtime.h
+++ b/libgo/runtime/runtime.h
@@ -240,6 +240,8 @@ int32 runtime_snprintf(byte*, int32, const char*, ...);
#define runtime_memmove(a, b, s) __builtin_memmove((a), (b), (s))
String runtime_gostringnocopy(const byte*)
__asm__ (GOSYM_PREFIX "runtime.gostringnocopy");
+void runtime_ginit(void)
+ __asm__ (GOSYM_PREFIX "runtime.ginit");
void runtime_schedinit(void)
__asm__ (GOSYM_PREFIX "runtime.schedinit");
void runtime_initsig(bool)