CFI-handling : Add a hook to allow target-specific Personality and LSDA indirections.
authorIain Sandoe <iain@sandoe.co.uk>
Mon, 16 Sep 2019 14:11:00 +0000 (15:11 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Wed, 11 Nov 2020 20:44:02 +0000 (20:44 +0000)
At present, the output of .cfi_personality and .cfi_lsda assumes
ELF semantics for indirections.  This isn't suitable for all targets
and is one blocker to moving Darwin to use .cfi_xxxx.

The patch adds a target hook that allows non-ELF targets to use
indirections appropriate to their needs.

gcc/ChangeLog:

* config/darwin-protos.h (darwin_make_eh_symbol_indirect): New.
* config/darwin.c (darwin_make_eh_symbol_indirect): New. Use
Mach-O semantics for personality and ldsa indirections.
* config/darwin.h (TARGET_ASM_MAKE_EH_SYMBOL_INDIRECT): New.
* doc/tm.texi: Regenerate.
* doc/tm.texi.in: Add TARGET_ASM_MAKE_EH_SYMBOL_INDIRECT hook.
* dwarf2out.c (dwarf2out_do_cfi_startproc): If the target defines
a hook for indirecting personality and ldsa references, use that
otherwise default to ELF semantics.
* target.def (make_eh_symbol_indirect): New target hook.

gcc/config/darwin-protos.h
gcc/config/darwin.c
gcc/config/darwin.h
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/dwarf2out.c
gcc/target.def

index 49c540fe08e4a6e632349e547afafc847e386ea4..3f222c3bbdc4923d6fb05672d25a3ee56caea57f 100644 (file)
@@ -69,6 +69,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 *);
index dd4857f9e34d83f98aceef82478748b7d25deabd..3265e3e6cb70772d7a8ee29740024bbd54a7df10 100644 (file)
@@ -2225,6 +2225,17 @@ darwin_emit_except_table_label (FILE *file)
   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));
+}
+
 /* Return, and mark as used, the name of the stub for the mcount function.
    Currently, this is only called by X86 code in the expansion of the
    FUNCTION_PROFILER macro, when stubs are enabled.  */
index f9d4fec30a030db60694f351b98a7cb6e4f8f167..5a766319cb016c98679e93d0f482cbc9a0e80d2b 100644 (file)
@@ -591,6 +591,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
index 833320ba7bfbea332d41cd38641c19ed9593366d..a783a21f6cf7d4cd07495fc3a2b3bd58295a44c1 100644 (file)
@@ -9560,6 +9560,10 @@ given instruction.  This is only used when @code{TARGET_EXCEPT_UNWIND_INFO}
 returns @code{UI_TARGET}.
 @end deftypefn
 
+@deftypefn {Target Hook} rtx TARGET_ASM_MAKE_EH_SYMBOL_INDIRECT (rtx @var{origsymbol}, bool @var{pubvis})
+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.
+@end deftypefn
+
 @deftypevr {Target Hook} bool TARGET_ASM_UNWIND_EMIT_BEFORE_INSN
 True if the @code{TARGET_ASM_UNWIND_EMIT} hook should be called before the assembly for @var{insn} has been emitted, false if the hook should be called afterward.
 @end deftypevr
index 58109be36932d89085240557da7be5664605946a..897f28962669031f21779847b7c63dab377ed7e2 100644 (file)
@@ -6456,6 +6456,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
index bc32a17efcd9a64551a6557fb9f7be6a64e9c623..bea02f9fbce54a0c5b05dde0148549e312440f1a 100644 (file)
@@ -991,7 +991,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);
@@ -1009,7 +1014,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);
index b916635be1816ee05327736e3ac4631a1214fba9..71411d8555960b09053253c7527fe11d98bd73ba 100644 (file)
@@ -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,