runtime: Mark runtime_goexit function as noinline.
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 22 Sep 2014 21:14:43 +0000 (21:14 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
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.

From-SVN: r215484

libgo/runtime/proc.c

index 4195aff76a78a5f87ba1964ffaf57af449c15bdc..87cd3edac00aebce9602b0f1d6d011607db9bf65 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)
 {