You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
20 lines
928 B
20 lines
928 B
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c |
|
index 6dfbb4642..9f30b2749 100644 |
|
--- a/gcc/cfgexpand.c |
|
+++ b/gcc/cfgexpand.c |
|
@@ -316,6 +316,15 @@ stack_var_conflict_p (size_t x, size_t y) |
|
struct stack_var *b = &stack_vars[y]; |
|
if (x == y) |
|
return false; |
|
+ /* GCC 4.8 does not calculate the control flow for setjmp correctly |
|
+ (BZ 56982). This might lead to merging stack variable slots |
|
+ which in fact are live at the same time. The following check |
|
+ considers all variables being live across setjmp invocations |
|
+ (these must be marked volatile) to conflict with all other stack |
|
+ variables. */ |
|
+ if (cfun->calls_setjmp |
|
+ && (TREE_THIS_VOLATILE (a->decl) || TREE_THIS_VOLATILE (b->decl))) |
|
+ return true; |
|
/* Partitions containing an SSA name result from gimple registers |
|
with things like unsupported modes. They are top-level and |
|
hence conflict with everything else. */
|
|
|