This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Do not disable -fomit-frame-pointer on !ACCUMULATE_OUTGOING_ARGS targets
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Richard Henderson <rth at redhat dot com>
- Date: Mon, 25 Mar 2013 12:26:31 +0100
- Subject: 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