runtime: set up g early
authorIan Lance Taylor <ian@gcc.gnu.org>
Sat, 11 May 2019 01:12:37 +0000 (01:12 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sat, 11 May 2019 01:12:37 +0000 (01:12 +0000)
    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

gcc/go/gofrontend/MERGE
libgo/go/runtime/proc.go
libgo/runtime/go-libmain.c
libgo/runtime/go-main.c
libgo/runtime/runtime.h

index d8bcef43a92414cb5cf2c79ade123de73a713b71..a3acadd42595acfe244e8eaa6be319b5e8eb951a 100644 (file)
@@ -1,4 +1,4 @@
-76ab85364745e445498fe53f9ca8e37b49650779
+5c2c4743980556c041561533ef31762f524737ca
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 8146c1d0206f7d699b22e52f7fd5417f2fb4af18..b40198e9d3e07d4211d72271d37d802c16a76570 100644 (file)
@@ -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()
index 00a8e6b1bda31c035c9912c6e3688e64a0617cb6..8b5bab09ac7683a38284fb5c5455f5f5cb25a3c3 100644 (file)
@@ -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 ());
index 301ac4ed803ba929667eb1e7a5342db6bb38bba4..e9da8aca9cc0bab56a9442db7231a1d4dc5331f8 100644 (file)
@@ -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);
index 97b1f114c5688b2cef31b8ae1411daf8b3948823..9506e3dec80dc1e63ccb6acbd44e0eeac9422eaf 100644 (file)
@@ -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)