I hadn’t realised it had been so long since I posted this:

ping.

Iain Sandoe <i...@sandoe.co.uk> wrote:

> If an assembler is used that supports .cfi_xxx, then (usually) GCC's 
> configuration will detect this and try to use it to generate frame insns.
> 
> This will not work for Darwin since the default implementation for the 
> personality and LSDA indirection is not correct for Mach-O ABI. 
> 
> As of now we are currently “lucky” in that the Darwin implementation of 
> objdump (based on LLVM) does not recognise “-Wf” (and also has slightly 
> different whitespace output) which means that even tho most of the modern 
> assemblers for Darwin *do* consume .cfi_xxxx instructions, the GCC configure 
> is not detecting this and we are falling back to the old direct DWARF output 
> for CFA/FDEs.
> 
> There is no point in fixing the configure, until the codegen will produce 
> useful output.
> 
> So, this patch introduces a target hook to allow target-specific processing 
> of personality and LSDA indirections (if the hook is not populated, the 
> default implementation is used).
> 
> Once this fixed is applied it is possible to make progress towards 
> modernising the Darwin handling of the frame insns (and, hopefully, with the 
> newer dsymutil implementations to progress towards consuming DWARF4, at 
> least).
> 
> OK for trunk?
> thanks
> Iain
> 
> gcc/ChangeLog:
> 
> 2019-09-16  Iain Sandoe  <i...@sandoe.co.uk>
> 
>       * config/darwin-protos.h (darwin_make_eh_symbol_indirect): New.
>       * config/darwin.c (darwin_make_eh_symbol_indirect): New.
>       * config/darwin.h (TARGET_ASM_MAKE_EH_SYMBOL_INDIRECT): New hook.
>       * doc/tm.texi: Regenerated.
>       * doc/tm.texi.in: Declare new hook.
>       * dwarf2out.c (dwarf2out_do_cfi_startproc): Allow for target hook to 
> alter the code gen
>       for personality and LSDA indirections.
>       * target.def: Describe new hook.
> 
> 
> diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h
> index e5614b627d..bb3fe19e0d 100644
> --- a/gcc/config/darwin-protos.h
> +++ b/gcc/config/darwin-protos.h
> @@ -68,6 +68,7 @@ extern void darwin_non_lazy_pcrel (FILE *, rtx);
> 
> extern void darwin_emit_unwind_label (FILE *, tree, int, int);
> extern void darwin_emit_except_table_label (FILE *);
> +extern rtx darwin_make_eh_symbol_indirect (rtx, bool);
> 
> extern void darwin_pragma_ignore (struct cpp_reader *);
> extern void darwin_pragma_options (struct cpp_reader *);
> diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
> index e62a5c6595..7ef73cc58b 100644
> --- a/gcc/config/darwin.c
> +++ b/gcc/config/darwin.c
> @@ -2157,6 +2157,18 @@ darwin_emit_except_table_label (FILE *file)
>                              except_table_label_num++);
>   ASM_OUTPUT_LABEL (file, section_start_label);
> }
> +
> +rtx
> +darwin_make_eh_symbol_indirect (rtx orig, bool ARG_UNUSED (pubvis))
> +{
> +  if (DARWIN_PPC == 0 && TARGET_64BIT)
> +    return orig;
> +
> +  return gen_rtx_SYMBOL_REF (Pmode,
> +                          machopic_indirection_name (orig,
> +                                                     /*stub_p=*/false));
> +}
> +
> /* Generate a PC-relative reference to a Mach-O non-lazy-symbol.  */
> 
> void
> diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
> index fde191d5c4..06e6f0c3da 100644
> --- a/gcc/config/darwin.h
> +++ b/gcc/config/darwin.h
> @@ -593,6 +593,9 @@ extern GTY(()) int darwin_ms_struct;
> /* Emit a label to separate the exception table.  */
> #define TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL darwin_emit_except_table_label
> 
> +/* Make an EH (personality or LDSA) symbol indirect as needed.  */
> +#define TARGET_ASM_MAKE_EH_SYMBOL_INDIRECT darwin_make_eh_symbol_indirect
> +
> /* Our profiling scheme doesn't LP labels and counter words.  */
> 
> #define NO_PROFILE_COUNTERS   1
> diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
> index 0b5a08d490..635faa22dc 100644
> diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
> index a9200551ed..c6d457cb5e 100644
> --- a/gcc/doc/tm.texi.in
> +++ b/gcc/doc/tm.texi.in
> @@ -6445,6 +6445,8 @@ the jump-table.
> 
> @hook TARGET_ASM_UNWIND_EMIT
> 
> +@hook TARGET_ASM_MAKE_EH_SYMBOL_INDIRECT
> +
> @hook TARGET_ASM_UNWIND_EMIT_BEFORE_INSN
> 
> @node Exception Region Output
> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> index aa7fd7eb46..b6d25c109a 100644
> --- a/gcc/dwarf2out.c
> +++ b/gcc/dwarf2out.c
> @@ -988,7 +988,12 @@ dwarf2out_do_cfi_startproc (bool second)
>        in the assembler.  Further, the assembler can't handle any
>        of the weirder relocation types.  */
>       if (enc & DW_EH_PE_indirect)
> -     ref = dw2_force_const_mem (ref, true);
> +     {
> +       if (targetm.asm_out.make_eh_symbol_indirect != NULL)
> +         ref = targetm.asm_out.make_eh_symbol_indirect (ref, true);
> +       else
> +         ref = dw2_force_const_mem (ref, true);
> +     }
> 
>       fprintf (asm_out_file, "\t.cfi_personality %#x,", enc);
>       output_addr_const (asm_out_file, ref);
> @@ -1006,7 +1011,12 @@ dwarf2out_do_cfi_startproc (bool second)
>       SYMBOL_REF_FLAGS (ref) = SYMBOL_FLAG_LOCAL;
> 
>       if (enc & DW_EH_PE_indirect)
> -     ref = dw2_force_const_mem (ref, true);
> +     {
> +       if (targetm.asm_out.make_eh_symbol_indirect != NULL)
> +         ref = targetm.asm_out.make_eh_symbol_indirect (ref, true);
> +       else
> +         ref = dw2_force_const_mem (ref, true);
> +     }
> 
>       fprintf (asm_out_file, "\t.cfi_lsda %#x,", enc);
>       output_addr_const (asm_out_file, ref);
> diff --git a/gcc/target.def b/gcc/target.def
> index ca7e7ad96b..7fdf5a8845 100644
> --- a/gcc/target.def
> +++ b/gcc/target.def
> @@ -185,6 +185,16 @@ DEFHOOK
>  void, (rtx personality),
>  NULL)
> 
> +/* If necessary, modify personality and LSDA references to handle
> +   indirection.  This is used when the assembler supports CFI directives.  */
> +DEFHOOK
> +(make_eh_symbol_indirect,
> + "If necessary, modify personality and LSDA references to handle 
> indirection.\
> +  The original symbol is in @code{origsymbol} and if @code{pubvis} is true\
> +  the symbol is visible outside the TU.",
> + rtx, (rtx origsymbol, bool pubvis),
> + NULL)
> +
> /* Emit any directives required to unwind this instruction.  */
> DEFHOOK
> (unwind_emit,
> -- 
> 2.17.1


Reply via email to