runtime: expose the g variable

Currently, getg is implemented in C, which loads the thread-local
g variable. The g variable is declared static in C.

This CL exposes the g variable, so it can be accessed from the Go
side. This allows the Go compiler to inline getg calls to direct
access of g.

Currently, the actual inlining is only implemented in the gollvm
compiler. The g variable is thread-local and the compiler backend
may choose to cache the TLS address in a register or on stack. If
a thread switch happens the cache may become invalid. I don't
know how to disable the TLS address cache in gccgo, therefore
the inlining of getg is not implemented. In the future gccgo may
gain this if we know how to do it safely.

Change-Id: I6c47debcf32fc0c519b18fc1c169d2fc14a2b6a4
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/186238
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c
index 26125cc..523dfd9 100644
--- a/libgo/runtime/proc.c
+++ b/libgo/runtime/proc.c
@@ -65,7 +65,7 @@
 #define __thread
 #endif
 
-static __thread G *g;
+__thread G *g __asm__(GOSYM_PREFIX "runtime.g");
 
 #ifndef SETCONTEXT_CLOBBERS_TLS
 
@@ -320,7 +320,7 @@
 	if(gp != nil) {
 
 #ifdef USING_SPLIT_STACK
-		__splitstack_getcontext((void*)(&g->stackcontext[0]));
+		__splitstack_getcontext((void*)(&gp->stackcontext[0]));
 #else
 		// We have to point to an address on the stack that is
 		// below the saved registers.