diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2014-09-22 21:14:43 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2014-09-22 21:14:43 +0000 |
commit | 76deefd0cd9c4066f2f7000b9b7fb475bddcc5c9 (patch) | |
tree | 082a0c27401b1c808011f524ac48284b258eb287 /libgo | |
parent | d87fc699839f068bc14ea189bc2aba4afc986a9c (diff) | |
download | gcc-76deefd0cd9c4066f2f7000b9b7fb475bddcc5c9.zip gcc-76deefd0cd9c4066f2f7000b9b7fb475bddcc5c9.tar.gz gcc-76deefd0cd9c4066f2f7000b9b7fb475bddcc5c9.tar.bz2 |
runtime: Mark runtime_goexit function as noinline.
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
Diffstat (limited to 'libgo')
-rw-r--r-- | libgo/runtime/proc.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c index 4195aff..87cd3eda 100644 --- a/libgo/runtime/proc.c +++ b/libgo/runtime/proc.c @@ -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) { |