On 20/08/14 16:22, Wilco Dijkstra wrote:
Hi,

Various targets implement -momit-leaf-frame-pointer to avoid using a frame 
pointer in leaf
functions. Currently the GCC mid-end does not provide a way of doing this, so 
targets have resorted
to hacks. Typically this involves forcing flag_omit_frame_pointer to be true in 
the
<arch>_option_override callback. The issue is that this doesn't work as it 
modifies the actual
option variable. As a result the callback is not idempotent, so option 
save/restore when using
function attributes fail as the callback is called multiple times on the 
modified options. Note this
bug exists on all targets which override options in <arch>_option_override (and 
despite claims to
the contrary in BZ 60580 this bug exists on all targets that implement 
-fomit-leaf-frame-pointer).

 agree, current gcc don't support finer control of frame pointer.

 currently all three targets i386/aarch64/bfin want finer control
 of frame pointer for leaf function have bug.
for example, for a simple testcase:

     __attribute__ ((optimize("no-omit-frame-pointer")))
     int
     cal (int a)
     {
       int b = a + 0x200;
       foo(&b);
       return a + b + 1;
     }

     __attribute__ ((optimize("omit-frame-pointer")))
     int
     cal1 (int a)
     {
       int b = a + 0x200;
       foo(&b);
       return a + b + 1;
     }

 ./cc1-bfin -O0 hello.c -momit-leaf-frame-pointer

 the attribute for "cal1" doesn't work.

2. Change the mid-end to call <arch>_frame_pointer_required even when 
!flag_omit_frame_pointer. This
is a generic solution which allows targets to decide when exactly to optimize 
frame pointers.
However it does mean all implementations of <arch>_frame_pointer_required must 
be updated (the
trivial safe fix is to add "if (!flag_omit_frame_pointer) return true;" at the 
start).

 IMHO, this fix make sense, it will let the calculation for 
frame_pointer_needed to be more
 flexible.

 remove the "! flag_omit_frame_pointer" when initialize frame_pointer_needed, 
and let frame_pointer_required
 hook to check flag_omit_frame_pointer and any other target frame pointer 
control flags like omit-leaf-frame-pointer
 etc to decide whether frame pointer needed.

  frame_pointer_needed
    = (! flag_omit_frame_pointer
       || (cfun->calls_alloca && EXIT_IGNORE_STACK)
       /* We need the frame pointer to catch stack overflow exceptions
  ....

  any comments?

  thanks.

 -- Jiong


Reply via email to