Patchwork PATCH: Turn on -fomit-frame-pointer by default for 32bit Linux/x86

login
register
mail settings
Submitter H.J. Lu
Date Aug. 12, 2010, 5:06 p.m.
Message ID <AANLkTi==ByATdy=JQrZJ05LwwcvoC0x+opVApWAEiMyr@mail.gmail.com>
Download mbox | patch
Permalink /patch/61628/
State New
Headers show

Comments

H.J. Lu - Aug. 12, 2010, 5:06 p.m.
On Thu, Aug 12, 2010 at 10:03 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Aug 12, 2010 at 10:00 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>> On Thu, Aug 12, 2010 at 6:43 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>
>>>>> 2010-08-12  H.J. Lu  <hongjiu.lu@intel.com>
>>>>>            Uros Bizjak  <ubizjak@gmail.com>
>>>>>
>>>>>        * config.gcc: Handle --enable-frame-pointer.
>>>>>
>>>>>        * configure.ac: Add --enable-frame-pointer.
>>>>>        * configure: Regenerated.
>>>>>
>>>>>        * config/i386/i386.c (USE_IX86_FRAME_POINTER): Default to 0.
>>>>>        (override_options): Enable -fomit-frame-pointer for 32bit code
>>>>>        if compiling for TARGET_MACHO and not optimizing for size
>>>>>        unless configured with --enable-frame-pointer.  Enable
>>>>>        -fasynchronous-unwind-tables unless configured with
>>>>>        --enable-frame-pointer.  Enable -maccumulate-outgoing-args
>>>>>        by default unless configured with --enable-frame-pointer.
>>>>>
>>>>
>>>> Please change the ChangeLog text to something like:
>>>>
>>>> If not configured with --enable-frame-pointer, enable
>>>> -fomit-frame-pointer (but not for TARGET_MACHO or when optimizing for
>>>> size), enable -fasynchronous-unwind-tables and
>>>> -maccumulate-outgoing-args by default.
>>>>
>>>
>>> I checked it in with updated ChangeLog.
>>>
>>> How should we document it? We currently have
>>>
>>> --
>>> @item -fomit-frame-pointer
>>> @opindex fomit-frame-pointer
>>> Don't keep the frame pointer in a register for functions that
>>> don't need one.  This avoids the instructions to save, set up and
>>> restore frame pointers; it also makes an extra register available
>>> in many functions.  @strong{It also makes debugging impossible on
>>> some machines.}
>>>
>>> On some machines, such as the VAX, this flag has no effect, because
>>> the standard calling sequence automatically handles the frame pointer
>>> and nothing is saved by pretending it doesn't exist.  The
>>> machine-description macro @code{FRAME_POINTER_REQUIRED} controls
>>> whether a target machine supports this flag.  @xref{Registers,,Register
>>> Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>>>
>>> Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>>> --
>>>
>>> It was never correct for x86 and is wrong today.
>>
>> Perhaps something like:
>>
>> Index: invoke.texi
>> ===================================================================
>> --- invoke.texi (revision 163191)
>> +++ invoke.texi (working copy)
>> @@ -5993,6 +5993,11 @@
>>  whether a target machine supports this flag.  @xref{Registers,,Register
>>  Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>>
>> +Starting from GCC version 4.6, the default setting for 32-bit x86 targets
>> +has been changed to @option{-fomit-frame-pointer}. New behavior can be
>> +reverted back to @option{-fno-omit-frame-pointer} by configuring GCC with
>> +the @option{--enable-frame-pointer} configure option.
>> +
>>  Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>>
>>  @item -foptimize-sibling-calls
>>
>
> We default to --disable-frame-pointer only for 32bit x86 Linux and
> MACHO target always has -fno-omit-frame-pointer as default.
>
>

How about this patch?
Uros Bizjak - Aug. 12, 2010, 5:12 p.m.
On Thu, Aug 12, 2010 at 7:06 PM, H.J. Lu <hjl.tools@gmail.com> wrote:

>>>>>> 2010-08-12  H.J. Lu  <hongjiu.lu@intel.com>
>>>>>>            Uros Bizjak  <ubizjak@gmail.com>
>>>>>>
>>>>>>        * config.gcc: Handle --enable-frame-pointer.
>>>>>>
>>>>>>        * configure.ac: Add --enable-frame-pointer.
>>>>>>        * configure: Regenerated.
>>>>>>
>>>>>>        * config/i386/i386.c (USE_IX86_FRAME_POINTER): Default to 0.
>>>>>>        (override_options): Enable -fomit-frame-pointer for 32bit code
>>>>>>        if compiling for TARGET_MACHO and not optimizing for size
>>>>>>        unless configured with --enable-frame-pointer.  Enable
>>>>>>        -fasynchronous-unwind-tables unless configured with
>>>>>>        --enable-frame-pointer.  Enable -maccumulate-outgoing-args
>>>>>>        by default unless configured with --enable-frame-pointer.
>>>>>>
>>>>>
>>>>> Please change the ChangeLog text to something like:
>>>>>
>>>>> If not configured with --enable-frame-pointer, enable
>>>>> -fomit-frame-pointer (but not for TARGET_MACHO or when optimizing for
>>>>> size), enable -fasynchronous-unwind-tables and
>>>>> -maccumulate-outgoing-args by default.
>>>>>
>>>>
>>>> I checked it in with updated ChangeLog.
>>>>
>>>> How should we document it? We currently have
>>>>
>>>> --
>>>> @item -fomit-frame-pointer
>>>> @opindex fomit-frame-pointer
>>>> Don't keep the frame pointer in a register for functions that
>>>> don't need one.  This avoids the instructions to save, set up and
>>>> restore frame pointers; it also makes an extra register available
>>>> in many functions.  @strong{It also makes debugging impossible on
>>>> some machines.}
>>>>
>>>> On some machines, such as the VAX, this flag has no effect, because
>>>> the standard calling sequence automatically handles the frame pointer
>>>> and nothing is saved by pretending it doesn't exist.  The
>>>> machine-description macro @code{FRAME_POINTER_REQUIRED} controls
>>>> whether a target machine supports this flag.  @xref{Registers,,Register
>>>> Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>>>>
>>>> Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>>>> --
>>>>
>>>> It was never correct for x86 and is wrong today.
>>>
>>> Perhaps something like:
>>>
>>> Index: invoke.texi
>>> ===================================================================
>>> --- invoke.texi (revision 163191)
>>> +++ invoke.texi (working copy)
>>> @@ -5993,6 +5993,11 @@
>>>  whether a target machine supports this flag.  @xref{Registers,,Register
>>>  Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>>>
>>> +Starting from GCC version 4.6, the default setting for 32-bit x86 targets
>>> +has been changed to @option{-fomit-frame-pointer}. New behavior can be
>>> +reverted back to @option{-fno-omit-frame-pointer} by configuring GCC with
>>> +the @option{--enable-frame-pointer} configure option.
>>> +
>>>  Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>>>
>>>  @item -foptimize-sibling-calls
>>>
>>
>> We default to --disable-frame-pointer only for 32bit x86 Linux and
>> MACHO target always has -fno-omit-frame-pointer as default.
>>
>>
>
> How about this patch?
>
>
> --
> H.J.
> 2010-08-12  Uros Bizjak  <ubizjak@gmail.com>
>
>        * doc/invoke.texi: Update -fomit-frame-pointer for 32-bit Linux
>        x86 targets.
>
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index edce703..dbcc212 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -5993,6 +5993,11 @@ machine-description macro
> @code{FRAME_POINTER_REQUIRED} controls
>  whether a target machine supports this flag.  @xref{Registers,,Register
>  Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>
> +Starting from GCC version 4.6, the default setting for 32-bit Linux x86
> +targets has been changed to @option{-fomit-frame-pointer}.  New behavior
> +can be reverted back to @option{-fno-omit-frame-pointer} by configuring
> +GCC with the @option{--enable-frame-pointer} configure option.
> +
>  Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>
>  @item -foptimize-sibling-calls

"... the default setting for 32-bit non-Darwin x86 targets has been
changed to @option{-fomit-frame-pointer} when not optimizing for
size." is what the source says ;)

Uros.
H.J. Lu - Aug. 12, 2010, 5:18 p.m.
On Thu, Aug 12, 2010 at 10:12 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Thu, Aug 12, 2010 at 7:06 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>
>>>>>>> 2010-08-12  H.J. Lu  <hongjiu.lu@intel.com>
>>>>>>>            Uros Bizjak  <ubizjak@gmail.com>
>>>>>>>
>>>>>>>        * config.gcc: Handle --enable-frame-pointer.
>>>>>>>
>>>>>>>        * configure.ac: Add --enable-frame-pointer.
>>>>>>>        * configure: Regenerated.
>>>>>>>
>>>>>>>        * config/i386/i386.c (USE_IX86_FRAME_POINTER): Default to 0.
>>>>>>>        (override_options): Enable -fomit-frame-pointer for 32bit code
>>>>>>>        if compiling for TARGET_MACHO and not optimizing for size
>>>>>>>        unless configured with --enable-frame-pointer.  Enable
>>>>>>>        -fasynchronous-unwind-tables unless configured with
>>>>>>>        --enable-frame-pointer.  Enable -maccumulate-outgoing-args
>>>>>>>        by default unless configured with --enable-frame-pointer.
>>>>>>>
>>>>>>
>>>>>> Please change the ChangeLog text to something like:
>>>>>>
>>>>>> If not configured with --enable-frame-pointer, enable
>>>>>> -fomit-frame-pointer (but not for TARGET_MACHO or when optimizing for
>>>>>> size), enable -fasynchronous-unwind-tables and
>>>>>> -maccumulate-outgoing-args by default.
>>>>>>
>>>>>
>>>>> I checked it in with updated ChangeLog.
>>>>>
>>>>> How should we document it? We currently have
>>>>>
>>>>> --
>>>>> @item -fomit-frame-pointer
>>>>> @opindex fomit-frame-pointer
>>>>> Don't keep the frame pointer in a register for functions that
>>>>> don't need one.  This avoids the instructions to save, set up and
>>>>> restore frame pointers; it also makes an extra register available
>>>>> in many functions.  @strong{It also makes debugging impossible on
>>>>> some machines.}
>>>>>
>>>>> On some machines, such as the VAX, this flag has no effect, because
>>>>> the standard calling sequence automatically handles the frame pointer
>>>>> and nothing is saved by pretending it doesn't exist.  The
>>>>> machine-description macro @code{FRAME_POINTER_REQUIRED} controls
>>>>> whether a target machine supports this flag.  @xref{Registers,,Register
>>>>> Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>>>>>
>>>>> Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>>>>> --
>>>>>
>>>>> It was never correct for x86 and is wrong today.
>>>>
>>>> Perhaps something like:
>>>>
>>>> Index: invoke.texi
>>>> ===================================================================
>>>> --- invoke.texi (revision 163191)
>>>> +++ invoke.texi (working copy)
>>>> @@ -5993,6 +5993,11 @@
>>>>  whether a target machine supports this flag.  @xref{Registers,,Register
>>>>  Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>>>>
>>>> +Starting from GCC version 4.6, the default setting for 32-bit x86 targets
>>>> +has been changed to @option{-fomit-frame-pointer}. New behavior can be
>>>> +reverted back to @option{-fno-omit-frame-pointer} by configuring GCC with
>>>> +the @option{--enable-frame-pointer} configure option.
>>>> +
>>>>  Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>>>>
>>>>  @item -foptimize-sibling-calls
>>>>
>>>
>>> We default to --disable-frame-pointer only for 32bit x86 Linux and
>>> MACHO target always has -fno-omit-frame-pointer as default.
>>>
>>>
>>
>> How about this patch?
>>
>>
>> --
>> H.J.
>> 2010-08-12  Uros Bizjak  <ubizjak@gmail.com>
>>
>>        * doc/invoke.texi: Update -fomit-frame-pointer for 32-bit Linux
>>        x86 targets.
>>
>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
>> index edce703..dbcc212 100644
>> --- a/gcc/doc/invoke.texi
>> +++ b/gcc/doc/invoke.texi
>> @@ -5993,6 +5993,11 @@ machine-description macro
>> @code{FRAME_POINTER_REQUIRED} controls
>>  whether a target machine supports this flag.  @xref{Registers,,Register
>>  Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>>
>> +Starting from GCC version 4.6, the default setting for 32-bit Linux x86
>> +targets has been changed to @option{-fomit-frame-pointer}.  New behavior
>> +can be reverted back to @option{-fno-omit-frame-pointer} by configuring
>> +GCC with the @option{--enable-frame-pointer} configure option.
>> +
>>  Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>>
>>  @item -foptimize-sibling-calls
>
> "... the default setting for 32-bit non-Darwin x86 targets has been
> changed to @option{-fomit-frame-pointer} when not optimizing for
> size." is what the source says ;)

As I said, it is complicated. We only changed the default setting
for 32bit Linux x86 targets.  All other x86 targets are unchanged.

Patch

diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index edce703..dbcc212 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -5993,6 +5993,11 @@  machine-description macro
@code{FRAME_POINTER_REQUIRED} controls
 whether a target machine supports this flag.  @xref{Registers,,Register
 Usage, gccint, GNU Compiler Collection (GCC) Internals}.

+Starting from GCC version 4.6, the default setting for 32-bit Linux x86
+targets has been changed to @option{-fomit-frame-pointer}.  New behavior
+can be reverted back to @option{-fno-omit-frame-pointer} by configuring
+GCC with the @option{--enable-frame-pointer} configure option.
+
 Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.