summaryrefslogtreecommitdiff
path: root/libcilkrts
diff options
context:
space:
mode:
authorbviyer <bviyer@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-08 19:52:27 +0000
committerbviyer <bviyer@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-08 19:52:27 +0000
commitf67cdd0bb10fb6e8c4bce02f1d61b450c2b92e53 (patch)
treed10556df37047caa6cde1981c1ed68d05d6327c1 /libcilkrts
parent2aba31fee9cbcb2fe9ae64a9bcc9de6e79b51e9e (diff)
+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/ChangeLog6
-rw-r--r--libcilkrts/runtime/cilk_fiber-unix.cpp41
2 files changed, 33 insertions, 14 deletions
diff --git a/libcilkrts/ChangeLog b/libcilkrts/ChangeLog
index 024eda572314..7f94aefb65f3 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 4895c9c5d712..b0ed53ad0524 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)
{