This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Do not disable -fomit-frame-pointer on !ACCUMULATE_OUTGOING_ARGS targets


Hi,

process_options has had these lines for a couple of releases:

  /* ??? Unwind info is not correct around the CFG unless either a frame
     pointer is present or A_O_A is set.  Fixing this requires rewriting
     unwind info generation to be aware of the CFG and propagating states
     around edges.  */
  if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS
      && flag_omit_frame_pointer)
    {
      warning (0, "unwind tables currently require a frame pointer "
	       "for correctness");
      flag_omit_frame_pointer = 0;
    }

I think that's too broad: for example, it's a common pattern for a target to 
really enable -fomit-frame-pointer only if the stack pointer is unchanging in 
the function; in this case, the unwind info will be correct even if !A_O_A.

So I'm proposing to disable -fomit-frame-pointer on a per-function basis 
instead in ira_setup_eliminable_regset.

Tested on x86_64-suse-linux, OK for the mainline?


2013-03-25  Eric Botcazou  <ebotcazou@adacore.com>

	* toplev.c (process_options): Do not disable -fomit-frame-pointer on a
	general basis if unwind info is requested and ACCUMULATE_OUTGOING_ARGS
	is not enabled.
	* ira.c (ira_setup_eliminable_regset): Instead disable it only on a per
	function basis if the stack pointer is not unchanging in the function.


-- 
Eric Botcazou
Index: ira.c
===================================================================
--- ira.c	(revision 196816)
+++ ira.c	(working copy)
@@ -1875,6 +1875,15 @@ ira_setup_eliminable_regset (bool from_i
        || crtl->stack_realign_needed
        || targetm.frame_pointer_required ());
 
+  /* ??? Unwind info is not correct around the CFG unless either a frame
+     pointer is present or A_O_A is set or the stack pointer is unchanging.
+     Fixing this requires rewriting unwind info generation to be aware of
+     the CFG and propagating states around edges.  */
+  if (flag_unwind_tables
+      && !ACCUMULATE_OUTGOING_ARGS
+      && !crtl->sp_is_unchanging)
+    frame_pointer_needed = true;
+
   if (from_ira_p && ira_use_lra_p)
     /* It can change FRAME_POINTER_NEEDED.  We call it only from IRA
        because it is expensive.  */
Index: toplev.c
===================================================================
--- toplev.c	(revision 196816)
+++ toplev.c	(working copy)
@@ -1527,18 +1527,6 @@ process_options (void)
   if (!flag_stack_protect)
     warn_stack_protect = 0;
 
-  /* ??? Unwind info is not correct around the CFG unless either a frame
-     pointer is present or A_O_A is set.  Fixing this requires rewriting
-     unwind info generation to be aware of the CFG and propagating states
-     around edges.  */
-  if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS
-      && flag_omit_frame_pointer)
-    {
-      warning (0, "unwind tables currently require a frame pointer "
-	       "for correctness");
-      flag_omit_frame_pointer = 0;
-    }
-
   /* Address Sanitizer needs porting to each target architecture.  */
   if (flag_asan
       && (targetm.asan_shadow_offset == NULL

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]