Message ID | 20170611203500.20779-1-daniel.santos@pobox.com |
---|---|
State | New |
Headers | show |
On 06/11/2017 02:35 PM, Daniel Santos wrote: > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > index c1168823af7..eec02b43a4f 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -25389,11 +25389,26 @@ using the function attributes @code{ms_abi} and @code{sysv_abi}. > @opindex mno-call-ms2sysv-xlogues > Due to differences in 64-bit ABIs, any Microsoft ABI function that calls a > System V ABI function must consider RSI, RDI and XMM6-15 as clobbered. By > -default, the code for saving and restoring these registers is emitted inline, > -resulting in fairly lengthy prologues and epilogues. Using > -@option{-mcall-ms2sysv-xlogues} emits prologues and epilogues that > -use stubs in the static portion of libgcc to perform these saves and restores, > -thus reducing function size at the cost of a few extra instructions. > +default, the instructions for saving and restoring these registers are emitted > +inline, resulting in fairly lengthy pro- and epilogues. Using > +@option{-mcall-ms2sysv-xlogues} emits pro- and epilogues that use stubs in the Please restore the "prologues and epilogues" language that was there before. > +static portion of libgcc to perform these saves and restores, thus reducing > +function size at the cost of executing a few extra instructions. This cost is > +theoretically mitigated or eliminated by reduced instruction cache utilization, > +temporal locality of the stubs, and the stubs' use of MOV instructions over > +PUSH and POP. > + > +This option is not supported with SEH, so it is completely unavailable on > +Windows. It is also silently disabled if a function: > + > +@enumerate > +@item is built with @option{-mno-sse2} or @option{-fsplit-stack}, > +@item has @code{__attribute__ ((ms_hook_prologue))}, or > +@item either throws an exception or explicitly calls @code{__builtin_eh_return}. > +@end enumerate > + > +Support for @option{-fsplit-stack} and @code{__builtin_eh_return} may be > +added at some time in the future, but has not yet been tested. It can't be tested if it's not there yet. :-S I'd prefer if you just added these things to the enumerated list of unsupported cases. I know I've removed other "maybe we will implement this later" language from the GCC manual that had been there for 10 or 20 years without anybody ever implementing those features. Saying "maybe we will implement this later" is just extra words in the manual and not helpful to users. -Sandra
On 06/11/17 22:35, Daniel Santos wrote: > I appear to have forgotten to cc gcc-patches, sorry about that. > > There are currently three cases where we issue a warning when disabling > -mcall-ms2sysv-xlogues for a function, but I never added a proper > warning, so there's no mechanism for disabling it. This is something > that I meant to address sooner. I'm thinking that it's better to just > remove the warning entirely and document these cases, rather than adding > a new warning. Any thoughts? > > These are the conditions: > > * the use of -fsplit-stack, > * the use of static call chains (not sure if we can ever have that), and > * if the function calls __buildin_eh_return. > > Some of these cases can likely be supported, but they are just on the > "not yet tested" list. > > 2017-06-11 Daniel Santos <daniel.santos@pobox.com > > * config/i386/i386.c (warn_once_call_ms2sysv_xlogues): Remove. > (ix86_compute_frame_layout): Don't call warn_once_call_ms2sysv_xlogues. > (ix86_expand_call): Likewise. > Your change log should also mention the changed doc/invoke.texi > Thanks, > Daniel > > Signed-off-by: Daniel Santos <daniel.santos@pobox.com> > --- > gcc/config/i386/i386.c | 26 +++----------------------- > gcc/doc/invoke.texi | 25 ++++++++++++++++++++----- > 2 files changed, 23 insertions(+), 28 deletions(-) > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index d5c2d46bf5e..2dc6e53c765 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -12772,18 +12772,6 @@ ix86_builtin_setjmp_frame_value (void) > return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx; > } > > -/* Emits a warning for unsupported msabi to sysv pro/epilogues. */ > -static void warn_once_call_ms2sysv_xlogues (const char *feature) > -{ > - static bool warned_once = false; > - if (!warned_once) > - { > - warning (0, "-mcall-ms2sysv-xlogues is not compatible with %s", > - feature); > - warned_once = true; > - } > -} > - > /* When using -fsplit-stack, the allocation routines set a field in > the TCB to the bottom of the stack plus this much space, measured > in bytes. */ > @@ -12814,18 +12802,10 @@ ix86_compute_frame_layout (void) > gcc_assert (TARGET_SSE); > gcc_assert (!ix86_using_red_zone ()); > > - if (crtl->calls_eh_return) > + if (crtl->calls_eh_return || ix86_static_chain_on_stack) > { > gcc_assert (!reload_completed); > m->call_ms2sysv = false; > - warn_once_call_ms2sysv_xlogues ("__builtin_eh_return"); > - } > - > - else if (ix86_static_chain_on_stack) > - { > - gcc_assert (!reload_completed); > - m->call_ms2sysv = false; > - warn_once_call_ms2sysv_xlogues ("static call chains"); > } > > /* Finally, compute which registers the stub will manage. */ > @@ -29290,9 +29270,9 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1, > else if (ix86_function_ms_hook_prologue (current_function_decl)) > ; > > - /* TODO: Cases not yet examined. */ > + /* TODO: Compatibility not yet examined. */ > else if (flag_split_stack) > - warn_once_call_ms2sysv_xlogues ("-fsplit-stack"); > + ; > > else > { > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > index c1168823af7..eec02b43a4f 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -25389,11 +25389,26 @@ using the function attributes @code{ms_abi} and @code{sysv_abi}. > @opindex mno-call-ms2sysv-xlogues > Due to differences in 64-bit ABIs, any Microsoft ABI function that calls a > System V ABI function must consider RSI, RDI and XMM6-15 as clobbered. By > -default, the code for saving and restoring these registers is emitted inline, > -resulting in fairly lengthy prologues and epilogues. Using > -@option{-mcall-ms2sysv-xlogues} emits prologues and epilogues that > -use stubs in the static portion of libgcc to perform these saves and restores, > -thus reducing function size at the cost of a few extra instructions. > +default, the instructions for saving and restoring these registers are emitted > +inline, resulting in fairly lengthy pro- and epilogues. Using > +@option{-mcall-ms2sysv-xlogues} emits pro- and epilogues that use stubs in the > +static portion of libgcc to perform these saves and restores, thus reducing > +function size at the cost of executing a few extra instructions. This cost is > +theoretically mitigated or eliminated by reduced instruction cache utilization, > +temporal locality of the stubs, and the stubs' use of MOV instructions over > +PUSH and POP. > + > +This option is not supported with SEH, so it is completely unavailable on > +Windows. It is also silently disabled if a function: > + > +@enumerate > +@item is built with @option{-mno-sse2} or @option{-fsplit-stack}, > +@item has @code{__attribute__ ((ms_hook_prologue))}, or > +@item either throws an exception or explicitly calls @code{__builtin_eh_return}. > +@end enumerate > + > +Support for @option{-fsplit-stack} and @code{__builtin_eh_return} may be > +added at some time in the future, but has not yet been tested. > > @item -mtls-dialect=@var{type} > @opindex mtls-dialect >
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d5c2d46bf5e..2dc6e53c765 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -12772,18 +12772,6 @@ ix86_builtin_setjmp_frame_value (void) return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx; } -/* Emits a warning for unsupported msabi to sysv pro/epilogues. */ -static void warn_once_call_ms2sysv_xlogues (const char *feature) -{ - static bool warned_once = false; - if (!warned_once) - { - warning (0, "-mcall-ms2sysv-xlogues is not compatible with %s", - feature); - warned_once = true; - } -} - /* When using -fsplit-stack, the allocation routines set a field in the TCB to the bottom of the stack plus this much space, measured in bytes. */ @@ -12814,18 +12802,10 @@ ix86_compute_frame_layout (void) gcc_assert (TARGET_SSE); gcc_assert (!ix86_using_red_zone ()); - if (crtl->calls_eh_return) + if (crtl->calls_eh_return || ix86_static_chain_on_stack) { gcc_assert (!reload_completed); m->call_ms2sysv = false; - warn_once_call_ms2sysv_xlogues ("__builtin_eh_return"); - } - - else if (ix86_static_chain_on_stack) - { - gcc_assert (!reload_completed); - m->call_ms2sysv = false; - warn_once_call_ms2sysv_xlogues ("static call chains"); } /* Finally, compute which registers the stub will manage. */ @@ -29290,9 +29270,9 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1, else if (ix86_function_ms_hook_prologue (current_function_decl)) ; - /* TODO: Cases not yet examined. */ + /* TODO: Compatibility not yet examined. */ else if (flag_split_stack) - warn_once_call_ms2sysv_xlogues ("-fsplit-stack"); + ; else { diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index c1168823af7..eec02b43a4f 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -25389,11 +25389,26 @@ using the function attributes @code{ms_abi} and @code{sysv_abi}. @opindex mno-call-ms2sysv-xlogues Due to differences in 64-bit ABIs, any Microsoft ABI function that calls a System V ABI function must consider RSI, RDI and XMM6-15 as clobbered. By -default, the code for saving and restoring these registers is emitted inline, -resulting in fairly lengthy prologues and epilogues. Using -@option{-mcall-ms2sysv-xlogues} emits prologues and epilogues that -use stubs in the static portion of libgcc to perform these saves and restores, -thus reducing function size at the cost of a few extra instructions. +default, the instructions for saving and restoring these registers are emitted +inline, resulting in fairly lengthy pro- and epilogues. Using +@option{-mcall-ms2sysv-xlogues} emits pro- and epilogues that use stubs in the +static portion of libgcc to perform these saves and restores, thus reducing +function size at the cost of executing a few extra instructions. This cost is +theoretically mitigated or eliminated by reduced instruction cache utilization, +temporal locality of the stubs, and the stubs' use of MOV instructions over +PUSH and POP. + +This option is not supported with SEH, so it is completely unavailable on +Windows. It is also silently disabled if a function: + +@enumerate +@item is built with @option{-mno-sse2} or @option{-fsplit-stack}, +@item has @code{__attribute__ ((ms_hook_prologue))}, or +@item either throws an exception or explicitly calls @code{__builtin_eh_return}. +@end enumerate + +Support for @option{-fsplit-stack} and @code{__builtin_eh_return} may be +added at some time in the future, but has not yet been tested. @item -mtls-dialect=@var{type} @opindex mtls-dialect
I appear to have forgotten to cc gcc-patches, sorry about that. There are currently three cases where we issue a warning when disabling -mcall-ms2sysv-xlogues for a function, but I never added a proper warning, so there's no mechanism for disabling it. This is something that I meant to address sooner. I'm thinking that it's better to just remove the warning entirely and document these cases, rather than adding a new warning. Any thoughts? These are the conditions: * the use of -fsplit-stack, * the use of static call chains (not sure if we can ever have that), and * if the function calls __buildin_eh_return. Some of these cases can likely be supported, but they are just on the "not yet tested" list. 2017-06-11 Daniel Santos <daniel.santos@pobox.com * config/i386/i386.c (warn_once_call_ms2sysv_xlogues): Remove. (ix86_compute_frame_layout): Don't call warn_once_call_ms2sysv_xlogues. (ix86_expand_call): Likewise. Thanks, Daniel Signed-off-by: Daniel Santos <daniel.santos@pobox.com> --- gcc/config/i386/i386.c | 26 +++----------------------- gcc/doc/invoke.texi | 25 ++++++++++++++++++++----- 2 files changed, 23 insertions(+), 28 deletions(-)