Jakub Jelinek <jakub at gcc dot> changed:

           What    |Removed                     |Added
                 CC|                            |jakub at gcc dot
   Target Milestone|---                         |8.0

--- Comment #5 from Jakub Jelinek <jakub at gcc dot> ---
--- gcc/config/aarch64/aarch64.c.jj     2018-02-22 09:26:12.028616476 +0100
+++ gcc/config/aarch64/aarch64.c        2018-02-22 20:23:29.449621557 +0100
@@ -7432,6 +7432,20 @@ aarch64_secondary_reload (bool in_p ATTR
   return NO_REGS;

+/* Value should be nonzero if functions must have frame pointers.
+   Zero means the frame pointer need not be set up (and parms may
+   be accessed via the stack pointer) in functions that seem suitable.  */
+static bool
+aarch64_frame_pointer_required (void)
+  /* __builtin_setjmp requries frame pointers.  */
+  if (cfun->calls_setjmp)
+    return true;
+  return false;
 static bool
 aarch64_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
@@ -17463,6 +17477,9 @@ aarch64_run_selftests (void)
 #define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false

+#define TARGET_FRAME_POINTER_REQUIRED aarch64_frame_pointer_required
 #define TARGET_CAN_ELIMINATE aarch64_can_eliminate

(completely untested) would require frame pointers for all setjmp calls, not
just __builtin_setjmp.

I agree pretty much all uses of __builtin_setjmp are a bug, but somebody needs
to explain it to the ruby authors.  It is even weirder because they are using
the builtin with jmp_buf variable, jmp_buf is for the libc setjmp, for
__builtin_setjmp I think it is just void *buf[5]; or something similar.

BTW, does __builtin_return_address really work on aarch64 without frame
pointers?  Various other targets require frame pointers when
cfun->machine->access_prev_frame (i.e. when SETUP_FRAME_ADDRESSES () has been

Reply via email to