[gcc r17-2214] Rename SEH functions for reuse in AArch64

Evgeny Karpov via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:5816e459964b0853603775b0218301ea997ebce7

commit r17-2214-g5816e459964b0853603775b0218301ea997ebce7
Author: Evgeny Karpov <[email protected]>
Date:   Fri Nov 15 13:36:41 2024 +0100

    Rename SEH functions for reuse in AArch64
    
    This patch renames functions related to SEH functionality. These
    functions will be reused in the aarch64-w64-mingw32 target.
    
    Signed-off-by: Evgeny Karpov <[email protected]>
    
    gcc/ChangeLog:
    
            * config/i386/cygming.h (TARGET_ASM_FUNCTION_END_PROLOGUE):
            Rename.
            (TARGET_ASM_EMIT_EXCEPT_PERSONALITY): Likewise.
            (TARGET_ASM_INIT_SECTIONS): Likewise.
            (SUBTARGET_ASM_UNWIND_INIT): Likewise.
            (ASM_DECLARE_FUNCTION_SIZE): Likewise.
            (ASM_DECLARE_COLD_FUNCTION_SIZE): Likewise.
            * config/i386/i386-protos.h (i386_pe_end_function):
            Remove declarations.
            (i386_pe_end_cold_function): Likewise.
            (i386_pe_seh_init): Likewise.
            (i386_pe_seh_end_prologue): Likewise.
            (i386_pe_seh_cold_init): Likewise.
            (i386_pe_seh_emit_except_personality): Likewise.
            (i386_pe_seh_init_sections): Likewise.
            * config/mingw/winnt.cc (defined): Update.
            (struct seh_frame_state): Move to mingw/winnt.h.
            (i386_pe_seh_init): Rename into ...
            (mingw_pe_seh_init): ... this.
            (i386_pe_seh_end_prologue): Rename into ...
            (mingw_pe_seh_end_prologue): ... this.
            (i386_pe_seh_cold_init): Rename into ...
            (mingw_pe_seh_cold_init): ... this.
            (i386_pe_seh_fini): Rename into ...
            (mingw_pe_seh_fini): ... this.
            (seh_emit_stackalloc): Rename into ...
            (mingw_pe_seh_emit_stackalloc): ... this.
            (seh_cfa_adjust_cfa): Update.
            (seh_frame_related_expr): Update.
            (i386_pe_seh_emit_except_personality): Rename into ...
            (mingw_pe_seh_emit_except_personality): ... this.
            (i386_pe_seh_init_sections): Rename into ...
            (mingw_pe_seh_init_sections): ... this.
            (i386_pe_end_function): Rename into ...
            (mingw_pe_end_function): ... this.
            (i386_pe_end_cold_function): Rename into ...
            (mingw_pe_end_cold_function): ... this.
            * config/mingw/winnt.h (struct seh_frame_state):
            Move from mingw/winnt.cc.
            (mingw_pe_end_cold_function): Add declarations.
            (mingw_pe_end_function): Likewise.
            (mingw_pe_seh_init): Likewise.
            (mingw_pe_seh_init_sections): Likewise.
            (mingw_pe_seh_cold_init): Likewise.
            (mingw_pe_seh_emit_except_personality): Likewise.
            (mingw_pe_seh_end_prologue): Likewise.

Diff:
---
 gcc/config/i386/cygming.h     | 14 ++++-----
 gcc/config/i386/i386-protos.h |  7 -----
 gcc/config/mingw/winnt.cc     | 69 +++++++++++--------------------------------
 gcc/config/mingw/winnt.h      | 44 +++++++++++++++++++++++++++
 4 files changed, 68 insertions(+), 66 deletions(-)

diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
index c32f228044ee..59ee1c4c69da 100644
--- a/gcc/config/i386/cygming.h
+++ b/gcc/config/i386/cygming.h
@@ -47,12 +47,12 @@ along with GCC; see the file COPYING3.  If not see
 #undef  TARGET_ASM_UNWIND_EMIT_BEFORE_INSN
 #define TARGET_ASM_UNWIND_EMIT_BEFORE_INSN  false
 #undef  TARGET_ASM_FUNCTION_END_PROLOGUE
-#define TARGET_ASM_FUNCTION_END_PROLOGUE  i386_pe_seh_end_prologue
+#define TARGET_ASM_FUNCTION_END_PROLOGUE  mingw_pe_seh_end_prologue
 #undef  TARGET_ASM_EMIT_EXCEPT_PERSONALITY
-#define TARGET_ASM_EMIT_EXCEPT_PERSONALITY i386_pe_seh_emit_except_personality
+#define TARGET_ASM_EMIT_EXCEPT_PERSONALITY mingw_pe_seh_emit_except_personality
 #undef  TARGET_ASM_INIT_SECTIONS
-#define TARGET_ASM_INIT_SECTIONS  i386_pe_seh_init_sections
-#define SUBTARGET_ASM_UNWIND_INIT  i386_pe_seh_init
+#define TARGET_ASM_INIT_SECTIONS  mingw_pe_seh_init_sections
+#define SUBTARGET_ASM_UNWIND_INIT  mingw_pe_seh_init
 
 #undef DEFAULT_ABI
 #define DEFAULT_ABI (TARGET_64BIT ? MS_ABI : SYSV_ABI)
@@ -314,18 +314,18 @@ do {						\
   do								\
     {								\
       mingw_pe_declare_type (FILE, NAME, 0, 1);		\
-      i386_pe_seh_cold_init (FILE, NAME);			\
+      mingw_pe_seh_cold_init (FILE, NAME);			\
       ASM_OUTPUT_LABEL (FILE, NAME);				\
     }								\
   while (0)
 
 #undef ASM_DECLARE_FUNCTION_SIZE
 #define ASM_DECLARE_FUNCTION_SIZE(FILE,NAME,DECL) \
-  i386_pe_end_function (FILE, NAME, DECL)
+  mingw_pe_end_function (FILE, NAME, DECL)
 
 #undef ASM_DECLARE_COLD_FUNCTION_SIZE
 #define ASM_DECLARE_COLD_FUNCTION_SIZE(FILE,NAME,DECL) \
-  i386_pe_end_cold_function (FILE, NAME, DECL)
+  mingw_pe_end_cold_function (FILE, NAME, DECL)
 
 /* Add an external function to the list of functions to be declared at
    the end of the file.  */
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 9708810ea765..21994d3d498d 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -332,18 +332,11 @@ extern void i386_pe_asm_output_aligned_decl_common (FILE *, tree,
 						    HOST_WIDE_INT,
 						    HOST_WIDE_INT);
 extern void i386_pe_start_function (FILE *, const char *, tree);
-extern void i386_pe_end_function (FILE *, const char *, tree);
-extern void i386_pe_end_cold_function (FILE *, const char *, tree);
 extern void i386_pe_assemble_visibility (tree, int);
 extern tree i386_pe_mangle_decl_assembler_name (tree, tree);
 extern tree i386_pe_mangle_assembler_name (const char *);
 
-extern void i386_pe_seh_init (FILE *);
-extern void i386_pe_seh_end_prologue (FILE *);
-extern void i386_pe_seh_cold_init (FILE *, const char *);
 extern void i386_pe_seh_unwind_emit (FILE *, rtx_insn *);
-extern void i386_pe_seh_emit_except_personality (rtx);
-extern void i386_pe_seh_init_sections (void);
 
 /* In winnt-cxx.cc and winnt-stubs.cc  */
 extern void i386_pe_adjust_class_at_definition (tree);
diff --git a/gcc/config/mingw/winnt.cc b/gcc/config/mingw/winnt.cc
index c73aa15ad37e..66d7450652d2 100644
--- a/gcc/config/mingw/winnt.cc
+++ b/gcc/config/mingw/winnt.cc
@@ -169,6 +169,8 @@ mingw_pe_valid_dllimport_attribute_p (const_tree decl)
    return true;
 }
 
+#if !defined (TARGET_AARCH64_MS_ABI)
+
 /* Return string which is the function name, identified by ID, modified
    with a suffix consisting of an atsign (@) followed by the number of
    bytes of arguments.  If ID is NULL use the DECL_NAME as base. If
@@ -224,8 +226,6 @@ gen_stdcall_or_fastcall_suffix (tree decl, tree id, bool fastcall)
   return get_identifier (new_str);
 }
 
-#if !defined (TARGET_AARCH64_MS_ABI)
-
 /* Maybe decorate and get a new identifier for the DECL of a stdcall or
    fastcall function. The original identifier is supplied in ID. */
 
@@ -884,45 +884,10 @@ mingw_pe_asm_lto_end (void)
   debug_info_level = saved_debug_info_level;
 }
 
-
-/* x64 Structured Exception Handling unwind info.  */
-
-struct seh_frame_state
-{
-  /* SEH records offsets relative to the lowest address of the fixed stack
-     allocation.  If there is no frame pointer, these offsets are from the
-     stack pointer; if there is a frame pointer, these offsets are from the
-     value of the stack pointer when the frame pointer was established, i.e.
-     the frame pointer minus the offset in the .seh_setframe directive.
-
-     We do not distinguish these two cases, i.e. we consider that the offsets
-     are always relative to the "current" stack pointer.  This means that we
-     need to perform the fixed stack allocation before establishing the frame
-     pointer whenever there are registers to be saved, and this is guaranteed
-     by the prologue provided that we force the frame pointer to point at or
-     below the lowest used register save area, see ix86_compute_frame_layout.
-
-     This tracks the current stack pointer offset from the CFA.  */
-  HOST_WIDE_INT sp_offset;
-
-  /* The CFA is located at CFA_REG + CFA_OFFSET.  */
-  HOST_WIDE_INT cfa_offset;
-  rtx cfa_reg;
-
-  /* The offset wrt the CFA where register N has been saved.  */
-  HOST_WIDE_INT reg_offset[FIRST_PSEUDO_REGISTER];
-
-  /* True if we are past the end of the epilogue.  */
-  bool after_prologue;
-
-  /* True if we are in the cold section.  */
-  bool in_cold_section;
-};
-
 /* Set up data structures beginning output for SEH.  */
 
 void
-i386_pe_seh_init (FILE *f)
+mingw_pe_seh_init (FILE *f)
 {
   struct seh_frame_state *seh;
 
@@ -950,7 +915,7 @@ i386_pe_seh_init (FILE *f)
 /* Emit an assembler directive for the end of the prologue.  */
 
 void
-i386_pe_seh_end_prologue (FILE *f)
+mingw_pe_seh_end_prologue (FILE *f)
 {
   if (!TARGET_SEH)
     return;
@@ -963,7 +928,7 @@ i386_pe_seh_end_prologue (FILE *f)
 /* Emit assembler directives to reconstruct the SEH state.  */
 
 void
-i386_pe_seh_cold_init (FILE *f, const char *name)
+mingw_pe_seh_cold_init (FILE *f, const char *name)
 {
   struct seh_frame_state *seh;
   HOST_WIDE_INT alloc_offset, offset;
@@ -1046,7 +1011,7 @@ i386_pe_seh_cold_init (FILE *f, const char *name)
 /* Emit an assembler directive for the end of the function.  */
 
 static void
-i386_pe_seh_fini (FILE *f, bool cold)
+mingw_pe_seh_fini (FILE *f, bool cold)
 {
   struct seh_frame_state *seh;
 
@@ -1106,8 +1071,8 @@ seh_emit_save (FILE *f, struct seh_frame_state *seh,
 
 /* Emit an assembler directive to adjust RSP by OFFSET.  */
 
-static void
-seh_emit_stackalloc (FILE *f, struct seh_frame_state *seh,
+void
+mingw_pe_seh_emit_stackalloc (FILE *f, struct seh_frame_state *seh,
 		     HOST_WIDE_INT offset)
 {
   /* We're only concerned with prologue stack allocations, which all
@@ -1152,7 +1117,7 @@ seh_cfa_adjust_cfa (FILE *f, struct seh_frame_state *seh, rtx pat)
   dest_regno = REGNO (dest);
 
   if (dest_regno == STACK_POINTER_REGNUM)
-    seh_emit_stackalloc (f, seh, reg_offset);
+    mingw_pe_seh_emit_stackalloc (f, seh, reg_offset);
   else if (dest_regno == HARD_FRAME_POINTER_REGNUM)
     {
       HOST_WIDE_INT offset;
@@ -1258,7 +1223,7 @@ seh_frame_related_expr (FILE *f, struct seh_frame_state *seh, rtx pat)
 	  else if (dest == stack_pointer_rtx)
 	    {
 	      gcc_assert (src == stack_pointer_rtx);
-	      seh_emit_stackalloc (f, seh, addend);
+	      mingw_pe_seh_emit_stackalloc (f, seh, addend);
 	    }
 	  else
 	    gcc_unreachable ();
@@ -1370,7 +1335,7 @@ i386_pe_seh_unwind_emit (FILE *out_file, rtx_insn *insn)
 }
 
 void
-i386_pe_seh_emit_except_personality (rtx personality)
+mingw_pe_seh_emit_except_personality (rtx personality)
 {
   int flags = 0;
 
@@ -1404,7 +1369,7 @@ i386_pe_seh_emit_except_personality (rtx personality)
 }
 
 void
-i386_pe_seh_init_sections (void)
+mingw_pe_seh_init_sections (void)
 {
   if (TARGET_SEH)
     exception_section = get_unnamed_section (0, output_section_asm_op,
@@ -1423,15 +1388,15 @@ i386_pe_start_function (FILE *f, const char *name, tree decl)
 }
 
 void
-i386_pe_end_function (FILE *f, const char *, tree)
+mingw_pe_end_function (FILE *f, const char *, tree)
 {
-  i386_pe_seh_fini (f, false);
+  mingw_pe_seh_fini (f, false);
 }
-
+
 void
-i386_pe_end_cold_function (FILE *f, const char *, tree)
+mingw_pe_end_cold_function (FILE *f, const char *, tree)
 {
-  i386_pe_seh_fini (f, true);
+  mingw_pe_seh_fini (f, true);
 }
 
 #include "gt-winnt.h"
diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h
index 68bdbff7f8b4..cc7490939d55 100644
--- a/gcc/config/mingw/winnt.h
+++ b/gcc/config/mingw/winnt.h
@@ -20,6 +20,40 @@ http://www.gnu.org/licenses/.  */
 
 #ifndef USED_FOR_TARGET
 
+/* Structured Exception Handling unwind info.  */
+
+struct seh_frame_state
+{
+  /* SEH records offsets relative to the lowest address of the fixed stack
+     allocation.  If there is no frame pointer, these offsets are from the
+     stack pointer; if there is a frame pointer, these offsets are from the
+     value of the stack pointer when the frame pointer was established, i.e.
+     the frame pointer minus the offset in the .seh_setframe directive.
+
+     We do not distinguish these two cases, i.e. we consider that the offsets
+     are always relative to the "current" stack pointer.  This means that we
+     need to perform the fixed stack allocation before establishing the frame
+     pointer whenever there are registers to be saved, and this is guaranteed
+     by the prologue provided that we force the frame pointer to point at or
+     below the lowest used register save area, see ix86_compute_frame_layout.
+
+     This tracks the current stack pointer offset from the CFA.  */
+  HOST_WIDE_INT sp_offset;
+
+  /* The CFA is located at CFA_REG + CFA_OFFSET.  */
+  HOST_WIDE_INT cfa_offset;
+  rtx cfa_reg;
+
+  /* The offset wrt the CFA where register N has been saved.  */
+  HOST_WIDE_INT reg_offset[FIRST_PSEUDO_REGISTER];
+
+  /* True if we are past the end of the epilogue.  */
+  bool after_prologue;
+
+  /* True if we are in the cold section.  */
+  bool in_cold_section;
+};
+
 extern tree aarch64_handle_ms_abi_attribute (tree *, tree, tree, int, bool *);
 extern tree mingw_handle_selectany_attribute (tree *, tree, tree, int, bool *);
 
@@ -28,6 +62,8 @@ extern void mingw_pe_asm_lto_start (void);
 extern void mingw_pe_asm_lto_end (void);
 extern void mingw_pe_declare_type (FILE *, const char *, bool, bool);
 extern void mingw_pe_encode_section_info (tree, rtx, int);
+extern void mingw_pe_end_cold_function (FILE *, const char *, tree);
+extern void mingw_pe_end_function (FILE *, const char *, tree);
 extern void mingw_pe_file_end (void);
 extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
 extern void mingw_pe_record_stub (const char *, bool);
@@ -36,6 +72,14 @@ extern section *mingw_pe_select_section (tree, int, unsigned HOST_WIDE_INT);
 extern void mingw_pe_unique_section (tree, int);
 extern bool mingw_pe_valid_dllimport_attribute_p (const_tree);
 
+extern void mingw_pe_seh_init (FILE *);
+extern void mingw_pe_seh_init_sections (void);
+extern void mingw_pe_seh_cold_init (FILE *, const char *);
+extern void mingw_pe_seh_emit_except_personality (rtx);
+extern void mingw_pe_seh_emit_stackalloc (FILE *, struct seh_frame_state *,
+					  HOST_WIDE_INT);
+extern void mingw_pe_seh_end_prologue (FILE *);
+
 #endif /* not USED_FOR_TARGET.  */
 
 #endif /* GCC_MINGW_WINNT_H.  */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.