Hi,

I’d like to ping this patch at least for opinion on whether the approach is
reasonable (as noted below it could be put behind a target hook if necessary)
thanks
Iain

> On 17 Nov 2021, at 17:17, Iain Sandoe via Gcc-patches 
> <gcc-patches@gcc.gnu.org> wrote:
> 
> At present, for several reasons, it is not possible to switch
> Darwin to use .cfi instructions for frame output.
> 
> When GCC uses .cfi_ instructions, the behaviour w.r.t frame
> sections (for a target with unwind frames by defaults):
> 
> (no options ) .eh_frame
> (-g ) .eh_frame
> (-g -fno-unwind-tables -fno-asynchronous-unwind-tables) .debug_frame
> (   -fno-unwind-tables -fno-asynchronous-unwind-tables) ---
> 
> However, for a target which outputs the FDEs "manually" (using
> output_call_frame_info()) we have:
> 
> (no options ) __eh_frame
> (-g ) __eh_frame *and* __debug_frame
> (-g -fno-unwind-tables -fno-asynchronous-unwind-tables) __debug_frame
> (   -fno-unwind-tables -fno-asynchronous-unwind-tables) ---
> 
> The first two cases are, of course, the most common and the extra
> frame table is (a) a waste of space and (b) actually triggers a bug
> when used with the LLVM assembler [with assertions enabled] for
> Mach-O when we have hot/cold partitioning on, since that emits
> Letext{.cold}0 labels *after* the __DWARF,__debug_frame and the
> assembler is set up reject switches to non-debug sections after the
> first __DWARF debug one has been seen.
> 
> The following patch makes the manual output of frame data follow the
> same pattern as the .cfi instructions.
> 
> (a) From testing on Darwin which uses the 'manual frame output' I see
> around 200Mb saving on gcc/ for master (5%).
> (b) Since Darwin defaults to unwind frames for all languages, we see
> only eh_frame sections before the "real debug" is emitted, so that
> the LLVM constraint is avoided.
> 
> On testing on x86_64 and powerpc64le Linux, I see only a single test
> that would need amendment (it counts the number of references to the
> start/end local labels).
> 
> Since the majority of targets are using .cfi instructions, it is hard
> to get wider testing.
> 
> It would be possible, of course, to wrap the change in a target hook
> but it's not clear that we need to.
> 
> Is there some case that I've missed?
> or - OK for master (the testcase amendments are not attached here)
> but are simple.
> 
> thanks,
> Iain
> 
> Signed-off-by: Iain Sandoe <i...@sandoe.co.uk>
> 
> gcc/ChangeLog:
> 
>       * dwarf2out.c (output_call_frame_info): Output the FDEs when
>       either EH or debug support is needed.
>       (dwarf2out_frame_finish): When either EH or debug support is
>       needed, call output_call_frame_info().
> ---
> gcc/dwarf2out.c | 15 ++++++---------
> 1 file changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> index e1d6a79ecd7..96307d6747a 100644
> --- a/gcc/dwarf2out.c
> +++ b/gcc/dwarf2out.c
> @@ -283,7 +283,7 @@ static GTY(()) dw_die_ref decltype_auto_die;
> 
> /* Forward declarations for functions defined in this file.  */
> 
> -static void output_call_frame_info (int);
> +static void output_call_frame_info (bool, bool);
> 
> /* Personality decl of current unit.  Used only when assembler does not 
> support
>    personality CFI.  */
> @@ -750,7 +750,7 @@ fde_needed_for_eh_p (dw_fde_ref fde)
>    location of saved registers.  */
> 
> static void
> -output_call_frame_info (int for_eh)
> +output_call_frame_info (bool for_eh, bool for_debug)
> {
>   unsigned int i;
>   dw_fde_ref fde;
> @@ -795,7 +795,7 @@ output_call_frame_info (int for_eh)
>           targetm.asm_out.emit_unwind_label (asm_out_file, fde->decl, 1, 1);
>       }
> 
> -      if (!any_eh_needed)
> +      if (!any_eh_needed && !for_debug)
>       return;
>     }
> 
> @@ -1271,12 +1271,9 @@ void
> dwarf2out_frame_finish (void)
> {
>   /* Output call frame information.  */
> -  if (targetm.debug_unwind_info () == UI_DWARF2)
> -    output_call_frame_info (0);
> -
> -  /* Output another copy for the unwinder.  */
> -  if (do_eh_frame)
> -    output_call_frame_info (1);
> +  if (targetm.debug_unwind_info () == UI_DWARF2 || do_eh_frame)
> +    output_call_frame_info (do_eh_frame,
> +                         targetm.debug_unwind_info () == UI_DWARF2);
> }
> 
> static void var_location_switch_text_section (void);
> -- 
> 2.24.3 (Apple Git-128)
> 

Reply via email to