diff mbox series

Document that -fno-trampolines is for Ada only [PR100735]

Message ID 20210525202318.17690-1-eggert@cs.ucla.edu
State New
Headers show
Series Document that -fno-trampolines is for Ada only [PR100735] | expand

Commit Message

Paul Eggert May 25, 2021, 8:23 p.m. UTC
The GCC manual's documentation of -fno-trampolines was apparently
written from an Ada point of view. However, when I read it I
understandably mistook it to say that -fno-trampolines also works for
C, C++, etc. It doesn't: it is silently ignored for these languages,
and I assume for any language other than Ada.

This confusion caused me to go in the wrong direction in a Gnulib
dicussion, as I mistakenly thought that entire C apps with nested
functions could be compiled with -fno-trampolines and then use nested
C functions in stack overflow handlers where the alternate stack
is allocated via malloc. I was wrong, as this won't work on common
platforms like x86-64 where malloc yields non-executable storage.

gcc/
* doc/invoke.texi (Code Gen Options):
* doc/tm.texi.in (Trampolines):
Document that -fno-trampolines and -ftrampolines work
only with Ada.
---
 gcc/doc/invoke.texi | 5 +++++
 gcc/doc/tm.texi.in  | 4 ++++
 2 files changed, 9 insertions(+)

Comments

Jeff Law June 9, 2021, 4:23 p.m. UTC | #1
On 5/25/2021 2:23 PM, Paul Eggert wrote:
> The GCC manual's documentation of -fno-trampolines was apparently
> written from an Ada point of view. However, when I read it I
> understandably mistook it to say that -fno-trampolines also works for
> C, C++, etc. It doesn't: it is silently ignored for these languages,
> and I assume for any language other than Ada.
>
> This confusion caused me to go in the wrong direction in a Gnulib
> dicussion, as I mistakenly thought that entire C apps with nested
> functions could be compiled with -fno-trampolines and then use nested
> C functions in stack overflow handlers where the alternate stack
> is allocated via malloc. I was wrong, as this won't work on common
> platforms like x86-64 where malloc yields non-executable storage.
>
> gcc/
> * doc/invoke.texi (Code Gen Options):
> * doc/tm.texi.in (Trampolines):
> Document that -fno-trampolines and -ftrampolines work
> only with Ada.
So Martin Uecker probably has the most state on this.  IIRC when we last 
discussed -fno-trampolines the belief was that it could be easily made 
to work independent of the language, but that it was ultimately an ABI 
change.   That ultimately derailed plans to use -fno-trampolines for 
other languages in the immediate term.

The patch is fine, I just wanted to give you a bit of background on the 
state.   I'll go ahead and commit it for you.

Jeff
Thomas Rodgers June 9, 2021, 6:15 p.m. UTC | #2
On 2021-06-09 09:23, Jeff Law via Gcc-patches wrote:

> On 5/25/2021 2:23 PM, Paul Eggert wrote:
> 
>> The GCC manual's documentation of -fno-trampolines was apparently
>> written from an Ada point of view. However, when I read it I
>> understandably mistook it to say that -fno-trampolines also works for
>> C, C++, etc. It doesn't: it is silently ignored for these languages,
>> and I assume for any language other than Ada.
>> 
>> This confusion caused me to go in the wrong direction in a Gnulib
>> dicussion, as I mistakenly thought that entire C apps with nested
>> functions could be compiled with -fno-trampolines and then use nested
>> C functions in stack overflow handlers where the alternate stack
>> is allocated via malloc. I was wrong, as this won't work on common
>> platforms like x86-64 where malloc yields non-executable storage.
>> 
>> gcc/
>> * doc/invoke.texi (Code Gen Options):
>> * doc/tm.texi.in (Trampolines):
>> Document that -fno-trampolines and -ftrampolines work
>> only with Ada.
> So Martin Uecker probably has the most state on this.  IIRC when we 
> last discussed -fno-trampolines the belief was that it could be easily 
> made to work independent of the language, but that it was ultimately an 
> ABI change.   That ultimately derailed plans to use -fno-trampolines 
> for other languages in the immediate term.
> 
> The patch is fine, I just wanted to give you a bit of background on the 
> state.   I'll go ahead and commit it for you.
> 
> Jeff

This patch (commit 4a0c4eaea32) is currently breaking the compilation 
with "Verify that you have permission to grant a GFDL license for all". 
It appears that tm.texi and tm.texi.in are out of sync.
Iain Sandoe June 9, 2021, 6:38 p.m. UTC | #3
Jeff et. al.

> On 9 Jun 2021, at 17:23, Jeff Law via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
> On 5/25/2021 2:23 PM, Paul Eggert wrote:
>> The GCC manual's documentation of -fno-trampolines was apparently
>> written from an Ada point of view. However, when I read it I
>> understandably mistook it to say that -fno-trampolines also works for
>> C, C++, etc. It doesn't: it is silently ignored for these languages,
>> and I assume for any language other than Ada.
>> 
>> This confusion caused me to go in the wrong direction in a Gnulib
>> dicussion, as I mistakenly thought that entire C apps with nested
>> functions could be compiled with -fno-trampolines and then use nested
>> C functions in stack overflow handlers where the alternate stack
>> is allocated via malloc. I was wrong, as this won't work on common
>> platforms like x86-64 where malloc yields non-executable storage.
>> 
>> gcc/
>> * doc/invoke.texi (Code Gen Options):
>> * doc/tm.texi.in (Trampolines):
>> Document that -fno-trampolines and -ftrampolines work
>> only with Ada.
> So Martin Uecker probably has the most state on this.  IIRC when we last discussed -fno-trampolines the belief was that it could be easily made to work independent of the language, but that it was ultimately an ABI change.   That ultimately derailed plans to use -fno-trampolines for other languages in the immediate term.

This is correct, it’s not technically too hard to make it work for another language (I have a hack in my arm64-darwin branch that does this for gfortran).  As noted for most ports it is an ABI break and thus not usable outside a such a work-around.

For the record (for the arm64-darwin port in the first instance), together with some of my friends at embecosm we plan to implement a solution to the trampoline that does not require executable stack and does not require an ABI break.  Perhaps such a solution will be of interest to other ports that do not want executable stack.

We’re not quite ready to post the design yet - but will do so in the next few weeks (all being well).

cheers
Iain
H.J. Lu June 9, 2021, 6:55 p.m. UTC | #4
On Wed, Jun 9, 2021 at 11:15 AM Thomas Rodgers
<rodgert@appliantology.com> wrote:
>
> On 2021-06-09 09:23, Jeff Law via Gcc-patches wrote:
>
> > On 5/25/2021 2:23 PM, Paul Eggert wrote:
> >
> >> The GCC manual's documentation of -fno-trampolines was apparently
> >> written from an Ada point of view. However, when I read it I
> >> understandably mistook it to say that -fno-trampolines also works for
> >> C, C++, etc. It doesn't: it is silently ignored for these languages,
> >> and I assume for any language other than Ada.
> >>
> >> This confusion caused me to go in the wrong direction in a Gnulib
> >> dicussion, as I mistakenly thought that entire C apps with nested
> >> functions could be compiled with -fno-trampolines and then use nested
> >> C functions in stack overflow handlers where the alternate stack
> >> is allocated via malloc. I was wrong, as this won't work on common
> >> platforms like x86-64 where malloc yields non-executable storage.
> >>
> >> gcc/
> >> * doc/invoke.texi (Code Gen Options):
> >> * doc/tm.texi.in (Trampolines):
> >> Document that -fno-trampolines and -ftrampolines work
> >> only with Ada.
> > So Martin Uecker probably has the most state on this.  IIRC when we
> > last discussed -fno-trampolines the belief was that it could be easily
> > made to work independent of the language, but that it was ultimately an
> > ABI change.   That ultimately derailed plans to use -fno-trampolines
> > for other languages in the immediate term.
> >
> > The patch is fine, I just wanted to give you a bit of background on the
> > state.   I'll go ahead and commit it for you.
> >
> > Jeff
>
> This patch (commit 4a0c4eaea32) is currently breaking the compilation
> with "Verify that you have permission to grant a GFDL license for all".
> It appears that tm.texi and tm.texi.in are out of sync.

I am checking in this to unbreak it:

diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 20501607716..33532f092b6 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -3828,6 +3828,7 @@ addresses.  Since GCC's generic function descriptors are
 not ABI-compliant, this option is typically used only on a
 per-language basis (notably by Ada) or when it can otherwise be
 applied to the whole program.
+
 For languages other than Ada, the @code{-ftrampolines} and
 @code{-fno-trampolines} options currently have no effect, and
 trampolines are always generated on platforms that need them
Jeff Law June 9, 2021, 7:10 p.m. UTC | #5
On 6/9/2021 12:15 PM, Thomas Rodgers wrote:
>
> On 2021-06-09 09:23, Jeff Law via Gcc-patches wrote:
>
>>
>>
>> On 5/25/2021 2:23 PM, Paul Eggert wrote:
>>> The GCC manual's documentation of -fno-trampolines was apparently
>>> written from an Ada point of view. However, when I read it I
>>> understandably mistook it to say that -fno-trampolines also works for
>>> C, C++, etc. It doesn't: it is silently ignored for these languages,
>>> and I assume for any language other than Ada.
>>>
>>> This confusion caused me to go in the wrong direction in a Gnulib
>>> dicussion, as I mistakenly thought that entire C apps with nested
>>> functions could be compiled with -fno-trampolines and then use nested
>>> C functions in stack overflow handlers where the alternate stack
>>> is allocated via malloc. I was wrong, as this won't work on common
>>> platforms like x86-64 where malloc yields non-executable storage.
>>>
>>> gcc/
>>> * doc/invoke.texi (Code Gen Options):
>>> * doc/tm.texi.in (Trampolines):
>>> Document that -fno-trampolines and -ftrampolines work
>>> only with Ada.
>> So Martin Uecker probably has the most state on this.  IIRC when we 
>> last discussed -fno-trampolines the belief was that it could be 
>> easily made to work independent of the language, but that it was 
>> ultimately an ABI change.   That ultimately derailed plans to use 
>> -fno-trampolines for other languages in the immediate term.
>>
>> The patch is fine, I just wanted to give you a bit of background on 
>> the state.   I'll go ahead and commit it for you.
>>
>> Jeff
>>
> This patch (commit 4a0c4eaea32) is currently breaking the compilation 
> with "Verify that you have permission to grant a GFDL license for 
> all". It appears that tm.texi and tm.texi.in are out of sync.
>
My fault.  I applied the change to tm.texi by hand and mucked up a 
newline.    HJ fixed it for me, then I mucked up  again, then fixed it 
again...   I'll refrain for complaining about GDFL for everyone's sanity...

jeff
diff mbox series

Patch

diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 5cd4e2d993c..b55bbf3e424 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -16646,6 +16646,11 @@  Moreover, code compiled with @option{-ftrampolines} and code compiled with
 present.  This option must therefore be used on a program-wide basis and be
 manipulated with extreme care.
 
+For languages other than Ada, the @code{-ftrampolines} and
+@code{-fno-trampolines} options currently have no effect, and
+trampolines are always generated on platforms that need them
+for nested functions.
+
 @item -fvisibility=@r{[}default@r{|}internal@r{|}hidden@r{|}protected@r{]}
 @opindex fvisibility
 Set the default ELF image symbol visibility to the specified option---all
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index d9fbbe20e6f..20501607716 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -3828,6 +3828,10 @@  addresses.  Since GCC's generic function descriptors are
 not ABI-compliant, this option is typically used only on a
 per-language basis (notably by Ada) or when it can otherwise be
 applied to the whole program.
+For languages other than Ada, the @code{-ftrampolines} and
+@code{-fno-trampolines} options currently have no effect, and
+trampolines are always generated on platforms that need them
+for nested functions.
 
 Define the following hook if your backend either implements ABI-specified
 descriptor support, or can use GCC's generic descriptor implementation