From c130ab6aad57e0309ec02f58f383aece584ac8cb Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 11 May 2019 01:12:37 +0000 Subject: [PATCH] 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 --- gcc/go/gofrontend/MERGE | 2 +- libgo/go/runtime/proc.go | 18 +++++++++++------- libgo/runtime/go-libmain.c | 1 + libgo/runtime/go-main.c | 1 + libgo/runtime/runtime.h | 2 ++ 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index d8bcef43a92..a3acadd4259 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -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. diff --git a/libgo/go/runtime/proc.go b/libgo/go/runtime/proc.go index 8146c1d0206..b40198e9d3e 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 00a8e6b1bda..8b5bab09ac7 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 301ac4ed803..e9da8aca9cc 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 97b1f114c56..9506e3dec80 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)