diff options
author | bviyer <bviyer@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-08 19:52:27 +0000 |
---|---|---|
committer | bviyer <bviyer@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-08 19:52:27 +0000 |
commit | f67cdd0bb10fb6e8c4bce02f1d61b450c2b92e53 (patch) | |
tree | d10556df37047caa6cde1981c1ed68d05d6327c1 /libcilkrts | |
parent | 2aba31fee9cbcb2fe9ae64a9bcc9de6e79b51e9e (diff) | |
download | gcc-f67cdd0bb10fb6e8c4bce02f1d61b450c2b92e53.tar.gz |
+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.
+
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204592 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcilkrts')
-rw-r--r-- | libcilkrts/ChangeLog | 6 | ||||
-rw-r--r-- | libcilkrts/runtime/cilk_fiber-unix.cpp | 41 |
2 files changed, 33 insertions, 14 deletions
diff --git a/libcilkrts/ChangeLog b/libcilkrts/ChangeLog index 024eda57231..7f94aefb65f 100644 --- a/libcilkrts/ChangeLog +++ b/libcilkrts/ChangeLog @@ -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 diff --git a/libcilkrts/runtime/cilk_fiber-unix.cpp b/libcilkrts/runtime/cilk_fiber-unix.cpp index 4895c9c5d71..b0ed53ad052 100644 --- a/libcilkrts/runtime/cilk_fiber-unix.cpp +++ b/libcilkrts/runtime/cilk_fiber-unix.cpp @@ -44,24 +44,27 @@ #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) { |