From f67cdd0bb10fb6e8c4bce02f1d61b450c2b92e53 Mon Sep 17 00:00:00 2001 From: bviyer Date: Fri, 8 Nov 2013 19:52:27 +0000 Subject: +2013-11-08 Balaji V. Iyer + + 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 --- libcilkrts/ChangeLog | 6 +++++ libcilkrts/runtime/cilk_fiber-unix.cpp | 41 ++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 14 deletions(-) (limited to 'libcilkrts') 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 + + 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 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 #include +#include +#include +#include + +// 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 +# include #elif defined __GNUC__ -# define alloca __builtin_alloca +# define alloca __builtin_alloca #elif defined _AIX -# define alloca __alloca +# define alloca __alloca #else -# include -# ifdef __cplusplus +# include +# ifdef __cplusplus extern "C" -# endif +# endif void *alloca (size_t); #endif -#include -#include -#include - // 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) { -- cgit v1.2.3