]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
+2013-11-08 Balaji V.
authorBalaji V. Iyer <balaji.v.iyer@intel.com>
Fri, 8 Nov 2013 19:52:27 +0000 (19:52 +0000)
committerBalaji V. Iyer <bviyer@gcc.gnu.org>
Fri, 8 Nov 2013 19:52:27 +0000 (11:52 -0800)
+2013-11-08  Balaji V. Iyer  <balaji.v.iyer@intel.com>
+
+       PR c/59039
+       * runtime/cilk_fiber-unix.cpp: Fixed a crash in run() function
+       when optimization is turned on.
+

From-SVN: r204592

libcilkrts/ChangeLog
libcilkrts/runtime/cilk_fiber-unix.cpp

index 024eda5723149baa510a28198959fad82347e9f0..7f94aefb65f3c0baeff3d370c4d99f57ac58ec27 100644 (file)
@@ -1,3 +1,9 @@
+2013-11-08  Balaji V. Iyer  <balaji.v.iyer@intel.com>
+
+       PR c/59039
+       * runtime/cilk_fiber-unix.cpp: Fixed a crash in run() function
+       when optimization is turned on.
+
 2013-11-04  Balaji V. Iyer  <balaji.v.iyer@intel.com>
 
        PR bootstrap/58951
index 4895c9c5d712ab7f60966c6d7076327269c552fd..b0ed53ad0524afa2bfcc83517e404f4f46c9c32d 100644 (file)
 #include <cstdio>
 #include <cstdlib>
 
+#include <errno.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+// You'd think that getting a defintion for alloca would be easy.  But you'd
+// be wrong. Here's a variant on what's recommended in the autoconf doc.  I've
+// remove the Windows portion since this is Unix-specific code.
 #if defined HAVE_ALLOCA_H
-# include <alloca.h>
+#   include <alloca.h>
 #elif defined __GNUC__
-# define alloca __builtin_alloca
+#   define alloca __builtin_alloca
 #elif defined _AIX
-# define alloca __alloca
+#   define alloca __alloca
 #else
-# include <stddef.h>
-# ifdef  __cplusplus
+#   include <stddef.h>
+#   ifdef  __cplusplus
 extern "C"
-# endif
+#   endif
 void *alloca (size_t);
 #endif
 
-#include <errno.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
 // MAP_ANON is deprecated on Linux, but seems to be required on Mac...
 #ifndef MAP_ANONYMOUS
 #define MAP_ANONYMOUS MAP_ANON
@@ -163,8 +166,15 @@ NORETURN cilk_fiber_sysdep::jump_to_resume_other_sysdep(cilk_fiber_sysdep* other
     __cilkrts_bug("Should not get here");
 }
 
-#pragma GCC push_options
-#pragma GCC optimize ("-O0")
+// GCC doesn't allow us to call __builtin_longjmp in the same function that
+// calls __builtin_setjmp, so create a new function to house the call to
+// __builtin_longjmp
+static void __attribute__((noinline))
+do_cilk_longjmp(__CILK_JUMP_BUFFER jmpbuf)
+{
+    CILK_LONGJMP(jmpbuf);
+}
+
 NORETURN cilk_fiber_sysdep::run()
 {
     // Only fibers created from a pool have a proc method to run and execute. 
@@ -201,7 +211,11 @@ NORETURN cilk_fiber_sysdep::run()
         // switching to for any temporaries required for this run()
         // function.
         JMPBUF_SP(m_resume_jmpbuf) = m_stack_base - frame_size;
-        CILK_LONGJMP(m_resume_jmpbuf);
+
+        // GCC doesn't allow us to call __builtin_longjmp in the same function
+        // that calls __builtin_setjmp, so it's been moved into it's own
+        // function that cannot be inlined.
+        do_cilk_longjmp(m_resume_jmpbuf);
     }
 
     // Note: our resetting of the stack pointer is valid only if the
@@ -228,7 +242,6 @@ NORETURN cilk_fiber_sysdep::run()
     // User proc should never return.
     __cilkrts_bug("Should not get here");
 }
-#pragma GCC pop_options
 
 void cilk_fiber_sysdep::make_stack(size_t stack_size)
 {