runtime: Mark runtime_goexit function as noinline.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Sep 2014 21:14:43 +0000 (21:14 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Sep 2014 21:14:43 +0000 (21:14 +0000)
If the compiler inlines this function into kickoff, it may reuse
the TLS block address to load g. However, this is not necessarily
correct, as the call to g->entry in kickoff may cause the TLS
address to change. If the wrong value is loaded for g->status in
runtime_goexit, it may cause a runtime panic.

By marking the function as noinline we prevent the compiler from
reusing the TLS address.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215484 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/runtime/proc.c

index 4195aff..87cd3ed 100644 (file)
@@ -1894,6 +1894,7 @@ runtime_gosched0(G *gp)
 // Need to mark it as nosplit, because it runs with sp > stackbase (as runtime_lessstack).
 // Since it does not return it does not matter.  But if it is preempted
 // at the split stack check, GC will complain about inconsistent sp.
+void runtime_goexit(void) __attribute__ ((noinline));
 void
 runtime_goexit(void)
 {