[coop] Protect copy_stack_data from GCC optimizations. (#3157)
authorAleksey Kliger (λgeek) <akliger@gmail.com>
Mon, 13 Jun 2016 19:58:44 +0000 (15:58 -0400)
committerGitHub <noreply@github.com>
Mon, 13 Jun 2016 19:58:44 +0000 (15:58 -0400)
[coop] Protect copy_stack_data from GCC optimizations.

GCC 5.3.1 (Debian sid/amd64) "optimizied" the previous incarnation of
`void *stackdata_end = return_stack_ptr ()` to
`void *stackdata_end = 0`.

mono/utils/mono-threads-coop.c

index ddc3c6ebbe231b49371e86760e198272c3d08191..cd5d703a04a1095ffca4c1edbc2388f43a80b69f 100644 (file)
@@ -145,11 +145,14 @@ mono_threads_state_poll_with_info (MonoThreadInfo *info)
        }
 }
 
-static void *
-return_stack_ptr ()
+static volatile gpointer* dummy_global;
+
+static MONO_NEVER_INLINE
+void*
+return_stack_ptr (gpointer *i)
 {
-       gpointer i;
-       return &i;
+       dummy_global = i;
+       return i;
 }
 
 static void
@@ -157,7 +160,8 @@ copy_stack_data (MonoThreadInfo *info, gpointer *stackdata_begin)
 {
        MonoThreadUnwindState *state;
        int stackdata_size;
-       void* stackdata_end = return_stack_ptr ();
+       gpointer dummy;
+       void* stackdata_end = return_stack_ptr (&dummy);
 
        SAVE_REGS_ON_STACK;