public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH v2 0/6] Add DLL import/export implementation to AArch64
@ 2024-06-07  9:44 Evgeny Karpov
  2024-06-07  9:46 ` [PATCH v2 1/6] Move mingw_* declarations to the mingw folder Evgeny Karpov
                   ` (8 more replies)
  0 siblings, 9 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-07  9:44 UTC (permalink / raw)
  To: gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

Hello,

Thank you for reviewing v1!
v2 addresses all comments on v1.

Changes in v2:
- Move winnt.h and winnt-dll.h to config.gcc.
- Resolve the issue with GCC GC in winnt-dll.cc.
- Add definitions for GOT_ALIAS_SET, PE_COFF_EXTERN_DECL_SHOULD_BE_LEGITIMIZED, and HAVE_64BIT_POINTERS to cygming.h.
- Replace intermediate functions for PECOFF with ifdef checks in ix86.
- Update the copyright date in winnt-dll.cc.
- Correct the style.
- Rebase from 7th June 2024

Regards,
Evgeny

Evgeny Karpov (6):
  Move mingw_* declarations to the mingw folder
  Extract ix86 dllimport implementation to mingw
  Rename functions for reuse in AArch64
  aarch64: Add selectany attribute handling
  Adjust DLL import/export implementation for AArch64
  aarch64: Add DLL import/export to AArch64 target

 gcc/config.gcc                      |  20 ++-
 gcc/config/aarch64/aarch64-protos.h |   5 -
 gcc/config/aarch64/aarch64.cc       |  42 ++++-
 gcc/config/aarch64/cygming.h        |  33 +++-
 gcc/config/i386/cygming.h           |  16 +-
 gcc/config/i386/i386-expand.cc      |   4 +-
 gcc/config/i386/i386-expand.h       |   2 -
 gcc/config/i386/i386-protos.h       |  10 --
 gcc/config/i386/i386.cc             | 205 ++----------------------
 gcc/config/i386/i386.h              |   2 +
 gcc/config/mingw/mingw32.h          |   2 +-
 gcc/config/mingw/t-cygming          |   6 +
 gcc/config/mingw/winnt-dll.cc       | 231 ++++++++++++++++++++++++++++
 gcc/config/mingw/winnt-dll.h        |  30 ++++
 gcc/config/mingw/winnt.cc           |  10 +-
 gcc/config/mingw/winnt.h            |  38 +++++
 16 files changed, 423 insertions(+), 233 deletions(-)
 create mode 100644 gcc/config/mingw/winnt-dll.cc
 create mode 100644 gcc/config/mingw/winnt-dll.h
 create mode 100644 gcc/config/mingw/winnt.h

-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/6] Move mingw_* declarations to the mingw folder
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
@ 2024-06-07  9:46 ` Evgeny Karpov
  2024-06-07  9:48 ` [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw Evgeny Karpov
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-07  9:46 UTC (permalink / raw)
  To: Evgeny Karpov, gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

This patch refactors recent changes to move mingw-related
functionality to the mingw folder. More renamings to the mingw_
prefix will be done in follow-up commits.

This is the first commit in the second patch series to add DLL
import/export implementation to AArch64.

Coauthors: Zac Walker <zacwalker@microsoft.com>,
Mark Harmstone <mark@harmstone.com>  and
Ron Riddle <ron.riddle@microsoft.com>

Refactored, prepared, and validated by
Radek Barton <radek.barton@microsoft.com> and
Evgeny Karpov <evgeny.karpov@microsoft.com>

gcc/ChangeLog:

	* config.gcc: Move mingw_* declations to mingw.
	* config/aarch64/aarch64-protos.h
	(mingw_pe_maybe_record_exported_symbol): Likewise.
	(mingw_pe_section_type_flags): Likewise.
	(mingw_pe_unique_section): Likewise.
	(mingw_pe_encode_section_info): Likewise.
	* config/aarch64/cygming.h
	(mingw_pe_asm_named_section): Likewise.
	(mingw_pe_declare_function_type): Likewise.
	* config/i386/i386-protos.h
	(mingw_pe_unique_section): Likewise.
	(mingw_pe_declare_function_type): Likewise.
	(mingw_pe_maybe_record_exported_symbol): Likewise.
	(mingw_pe_encode_section_info): Likewise.
	(mingw_pe_section_type_flags): Likewise.
	(mingw_pe_asm_named_section): Likewise.
	* config/mingw/winnt.h: New file.
---
 gcc/config.gcc                      |  4 ++++
 gcc/config/aarch64/aarch64-protos.h |  5 -----
 gcc/config/aarch64/cygming.h        |  4 ----
 gcc/config/i386/i386-protos.h       |  6 ------
 gcc/config/mingw/winnt.h            | 33 +++++++++++++++++++++++++++++
 5 files changed, 37 insertions(+), 15 deletions(-)
 create mode 100644 gcc/config/mingw/winnt.h

diff --git a/gcc/config.gcc b/gcc/config.gcc
index e500ba63e32..553a310f4bd 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1275,6 +1275,7 @@ aarch64-*-mingw*)
 	tm_file="${tm_file} aarch64/cygming.h"
 	tm_file="${tm_file} mingw/mingw32.h"
 	tm_file="${tm_file} mingw/mingw-stdint.h"
+	tm_file="${tm_file} mingw/winnt.h"
 	tmake_file="${tmake_file} aarch64/t-aarch64"
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
 	extra_options="${extra_options} mingw/cygming.opt mingw/mingw.opt"
@@ -2175,6 +2176,7 @@ i[4567]86-wrs-vxworks*|x86_64-wrs-vxworks7*)
 	;;
 i[34567]86-*-cygwin*)
 	tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygming.h i386/cygwin.h i386/cygwin-stdint.h"
+	tm_file="${tm_file} mingw/winnt.h"
 	xm_file=i386/xm-cygwin.h
 	tmake_file="${tmake_file} mingw/t-cygming t-slibgcc"
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
@@ -2193,6 +2195,7 @@ i[34567]86-*-cygwin*)
 x86_64-*-cygwin*)
 	need_64bit_isa=yes
 	tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygming.h i386/cygwin.h i386/cygwin-w64.h i386/cygwin-stdint.h"
+	tm_file="${tm_file} mingw/winnt.h"
 	xm_file=i386/xm-cygwin.h
 	tmake_file="${tmake_file} mingw/t-cygming t-slibgcc"
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
@@ -2262,6 +2265,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
 			;;
 	esac
 	tm_file="${tm_file} mingw/mingw-stdint.h"
+	tm_file="${tm_file} mingw/winnt.h"
 	tmake_file="${tmake_file} t-winnt mingw/t-cygming t-slibgcc"
         case ${target} in
                x86_64-w64-*)
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index 1d3f94c813e..42639e9efcf 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -1110,11 +1110,6 @@ extern void aarch64_output_patchable_area (unsigned int, bool);
 
 extern void aarch64_adjust_reg_alloc_order ();
 
-extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
-extern unsigned int mingw_pe_section_type_flags (tree, const char *, int);
-extern void mingw_pe_unique_section (tree, int);
-extern void mingw_pe_encode_section_info (tree, rtx, int);
-
 bool aarch64_optimize_mode_switching (aarch64_mode_entity);
 void aarch64_restore_za (rtx);
 
diff --git a/gcc/config/aarch64/cygming.h b/gcc/config/aarch64/cygming.h
index 2e7b01feb76..0d048879311 100644
--- a/gcc/config/aarch64/cygming.h
+++ b/gcc/config/aarch64/cygming.h
@@ -51,10 +51,6 @@ still needed for compilation.  */
 #include <stdio.h>
 #endif
 
-extern void mingw_pe_asm_named_section (const char *, unsigned int, tree);
-extern void mingw_pe_declare_function_type (FILE *file, const char *name,
-	int pub);
-
 #define TARGET_ASM_NAMED_SECTION  mingw_pe_asm_named_section
 
 /* Select attributes for named sections.  */
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index aa50b897b2b..65ef3d77c3a 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -301,16 +301,10 @@ extern void ix86_target_macros (void);
 extern void ix86_register_pragmas (void);
 
 /* In winnt.cc  */
-extern void mingw_pe_unique_section (tree, int);
-extern void mingw_pe_declare_function_type (FILE *, const char *, int);
 extern void i386_pe_record_external_function (tree, const char *);
-extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
-extern void mingw_pe_encode_section_info (tree, rtx, int);
 extern bool i386_pe_binds_local_p (const_tree);
 extern const char *i386_pe_strip_name_encoding_full (const char *);
 extern bool i386_pe_valid_dllimport_attribute_p (const_tree);
-extern unsigned int mingw_pe_section_type_flags (tree, const char *, int);
-extern void mingw_pe_asm_named_section (const char *, unsigned int, tree);
 extern void i386_pe_asm_output_aligned_decl_common (FILE *, tree,
 						    const char *,
 						    HOST_WIDE_INT,
diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h
new file mode 100644
index 00000000000..d6202816e8f
--- /dev/null
+++ b/gcc/config/mingw/winnt.h
@@ -0,0 +1,33 @@
+/* Subroutines for targets on Windows.
+Copyright (C) 2024 Free Software Foundation, Inc.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+http://www.gnu.org/licenses/.  */
+
+#ifndef GCC_MINGW_WINNT_H
+#define GCC_MINGW_WINNT_H
+
+#ifndef USED_FOR_TARGET
+
+extern void mingw_pe_asm_named_section (const char *, unsigned int, tree);
+extern void mingw_pe_declare_function_type (FILE *file, const char *name,
+	int pub);
+extern void mingw_pe_encode_section_info (tree, rtx, int);
+extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
+extern unsigned int mingw_pe_section_type_flags (tree, const char *, int);
+extern void mingw_pe_unique_section (tree, int);
+
+#endif /* not USED_FOR_TARGET.  */
+
+#endif /* GCC_MINGW_WINNT_H.  */
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
  2024-06-07  9:46 ` [PATCH v2 1/6] Move mingw_* declarations to the mingw folder Evgeny Karpov
@ 2024-06-07  9:48 ` Evgeny Karpov
  2024-06-07 11:11   ` Uros Bizjak
                     ` (2 more replies)
  2024-06-07  9:49 ` [PATCH v2 3/6] Rename functions for reuse in AArch64 Evgeny Karpov
                   ` (6 subsequent siblings)
  8 siblings, 3 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-07  9:48 UTC (permalink / raw)
  To: Evgeny Karpov, gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

This patch extracts the ix86 implementation for expanding a SYMBOL
into its corresponding dllimport, far-address, or refptr symbol.
It will be reused in the aarch64-w64-mingw32 target.
The implementation is copied as is from i386/i386.cc with
minor changes to follow to the code style.

Also this patch replaces the original DLL import/export
implementation in ix86 with mingw.

gcc/ChangeLog:

	* config.gcc: Add winnt-dll.o, which contains the DLL
	import/export implementation.
	* config/i386/cygming.h (SUB_TARGET_RECORD_STUB): Remove the
	old implementation. Rename the required function to MinGW.
	Use MinGW implementation for COFF and nothing otherwise.
	(GOT_ALIAS_SET): Likewise.
	* config/i386/i386-expand.cc (ix86_expand_move): Likewise.
	* config/i386/i386-expand.h (ix86_GOT_alias_set): Likewise.
	(legitimize_pe_coff_symbol): Likewise.
	* config/i386/i386-protos.h (i386_pe_record_stub): Likewise.
	* config/i386/i386.cc (is_imported_p): Likewise.
	(legitimate_pic_address_disp_p): Likewise.
	(ix86_GOT_alias_set): Likewise.
	(legitimize_pic_address): Likewise.
	(legitimize_tls_address): Likewise.
	(struct dllimport_hasher): Likewise.
	(GTY): Likewise.
	(get_dllimport_decl): Likewise.
	(legitimize_pe_coff_extern_decl): Likewise.
	(legitimize_dllimport_symbol): Likewise.
	(legitimize_pe_coff_symbol): Likewise.
	(ix86_legitimize_address): Likewise.
	* config/i386/i386.h (GOT_ALIAS_SET): Likewise.
	* config/mingw/winnt.cc (i386_pe_record_stub): Likewise.
	(mingw_pe_record_stub): Likewise.
	* config/mingw/winnt.h (mingw_pe_record_stub): Likewise.
	* config/mingw/t-cygming: Add the winnt-dll.o compilation.
	* config/mingw/winnt-dll.cc: New file.
	* config/mingw/winnt-dll.h: New file.
---
 gcc/config.gcc                 |  12 +-
 gcc/config/i386/cygming.h      |   5 +-
 gcc/config/i386/i386-expand.cc |   4 +-
 gcc/config/i386/i386-expand.h  |   2 -
 gcc/config/i386/i386-protos.h  |   1 -
 gcc/config/i386/i386.cc        | 205 ++---------------------------
 gcc/config/i386/i386.h         |   2 +
 gcc/config/mingw/t-cygming     |   6 +
 gcc/config/mingw/winnt-dll.cc  | 231 +++++++++++++++++++++++++++++++++
 gcc/config/mingw/winnt-dll.h   |  30 +++++
 gcc/config/mingw/winnt.cc      |   2 +-
 gcc/config/mingw/winnt.h       |   1 +
 12 files changed, 298 insertions(+), 203 deletions(-)
 create mode 100644 gcc/config/mingw/winnt-dll.cc
 create mode 100644 gcc/config/mingw/winnt-dll.h

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 553a310f4bd..d053b98efa8 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -2177,11 +2177,13 @@ i[4567]86-wrs-vxworks*|x86_64-wrs-vxworks7*)
 i[34567]86-*-cygwin*)
 	tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygming.h i386/cygwin.h i386/cygwin-stdint.h"
 	tm_file="${tm_file} mingw/winnt.h"
+	tm_file="${tm_file} mingw/winnt-dll.h"
 	xm_file=i386/xm-cygwin.h
 	tmake_file="${tmake_file} mingw/t-cygming t-slibgcc"
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
+	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
 	extra_options="${extra_options} mingw/cygming.opt i386/cygwin.opt"
-	extra_objs="${extra_objs} winnt.o winnt-stubs.o"
+	extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
 	c_target_objs="${c_target_objs} msformat-c.o"
 	cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
 	d_target_objs="${d_target_objs} cygwin-d.o"
@@ -2196,11 +2198,13 @@ x86_64-*-cygwin*)
 	need_64bit_isa=yes
 	tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygming.h i386/cygwin.h i386/cygwin-w64.h i386/cygwin-stdint.h"
 	tm_file="${tm_file} mingw/winnt.h"
+	tm_file="${tm_file} mingw/winnt-dll.h"
 	xm_file=i386/xm-cygwin.h
 	tmake_file="${tmake_file} mingw/t-cygming t-slibgcc"
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
+	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
 	extra_options="${extra_options} mingw/cygming.opt i386/cygwin.opt"
-	extra_objs="${extra_objs} winnt.o winnt-stubs.o"
+	extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
 	c_target_objs="${c_target_objs} msformat-c.o"
 	cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
 	d_target_objs="${d_target_objs} cygwin-d.o"
@@ -2266,6 +2270,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
 	esac
 	tm_file="${tm_file} mingw/mingw-stdint.h"
 	tm_file="${tm_file} mingw/winnt.h"
+	tm_file="${tm_file} mingw/winnt-dll.h"
 	tmake_file="${tmake_file} t-winnt mingw/t-cygming t-slibgcc"
         case ${target} in
                x86_64-w64-*)
@@ -2277,6 +2282,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
 	esac
         native_system_header_dir=/mingw/include
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
+	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
 	extra_options="${extra_options} mingw/cygming.opt mingw/mingw.opt"
 	case ${target} in
 		*-w64-*)
@@ -2285,7 +2291,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
 		*)
 			;;
 	esac
-	extra_objs="${extra_objs} winnt.o winnt-stubs.o"
+	extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
 	c_target_objs="${c_target_objs} msformat-c.o"
 	cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
 	gas=yes
diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
index 98b375538e7..56945f00c11 100644
--- a/gcc/config/i386/cygming.h
+++ b/gcc/config/i386/cygming.h
@@ -461,7 +461,7 @@ do {						\
 #define TARGET_ASM_ASSEMBLE_VISIBILITY i386_pe_assemble_visibility
 
 #undef SUB_TARGET_RECORD_STUB
-#define SUB_TARGET_RECORD_STUB i386_pe_record_stub
+#define SUB_TARGET_RECORD_STUB mingw_pe_record_stub
 
 /* Static stack checking is supported by means of probes.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
@@ -469,3 +469,6 @@ do {						\
 #ifndef HAVE_GAS_ALIGNED_COMM
 # define HAVE_GAS_ALIGNED_COMM 0
 #endif
+
+#undef GOT_ALIAS_SET
+#define GOT_ALIAS_SET mingw_GOT_alias_set ()
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index d1d396a8713..e09c97f1520 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -408,10 +408,11 @@ ix86_expand_move (machine_mode mode, rtx operands[])
 				 : UNSPEC_GOT));
 	  op1 = gen_rtx_CONST (Pmode, op1);
 	  op1 = gen_const_mem (Pmode, op1);
-	  set_mem_alias_set (op1, ix86_GOT_alias_set ());
+	  set_mem_alias_set (op1, GOT_ALIAS_SET);
 	}
       else
 	{
+#if TARGET_PECOFF
 	  tmp = legitimize_pe_coff_symbol (op1, addend != NULL_RTX);
 	  if (tmp)
 	    {
@@ -424,6 +425,7 @@ ix86_expand_move (machine_mode mode, rtx operands[])
 	      op1 = operands[1];
 	      break;
 	    }
+#endif
 	}
 
       if (addend)
diff --git a/gcc/config/i386/i386-expand.h b/gcc/config/i386/i386-expand.h
index 65cb49c921c..5e02df1706d 100644
--- a/gcc/config/i386/i386-expand.h
+++ b/gcc/config/i386/i386-expand.h
@@ -34,9 +34,7 @@ struct expand_vec_perm_d
 };
 
 rtx legitimize_tls_address (rtx x, enum tls_model model, bool for_mov);
-alias_set_type ix86_GOT_alias_set (void);
 rtx legitimize_pic_address (rtx orig, rtx reg);
-rtx legitimize_pe_coff_symbol (rtx addr, bool inreg);
 
 bool insn_defines_reg (unsigned int regno1, unsigned int regno2,
 		       rtx_insn *insn);
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 65ef3d77c3a..b2e9b9e0d3d 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -318,7 +318,6 @@ 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_record_stub (const char *);
 
 extern void i386_pe_seh_init (FILE *);
 extern void i386_pe_seh_end_prologue (FILE *);
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 4126ab24a79..cf998252340 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -11244,20 +11244,6 @@ ix86_cannot_force_const_mem (machine_mode mode, rtx x)
   return !ix86_legitimate_constant_p (mode, x);
 }
 
-/*  Nonzero if the symbol is marked as dllimport, or as stub-variable,
-    otherwise zero.  */
-
-static bool
-is_imported_p (rtx x)
-{
-  if (!TARGET_DLLIMPORT_DECL_ATTRIBUTES
-      || GET_CODE (x) != SYMBOL_REF)
-    return false;
-
-  return SYMBOL_REF_DLLIMPORT_P (x) || SYMBOL_REF_STUBVAR_P (x);
-}
-
-
 /* Nonzero if the constant value X is a legitimate general operand
    when generating PIC code.  It is given that flag_pic is on and
    that X satisfies CONSTANT_P.  */
@@ -11359,8 +11345,10 @@ legitimate_pic_address_disp_p (rtx disp)
 
 	  if (TARGET_PECOFF)
 	    {
+#if TARGET_PECOFF
 	      if (is_imported_p (op0))
 		return true;
+#endif
 
 	      if (SYMBOL_REF_FAR_ADDR_P (op0) || !SYMBOL_REF_LOCAL_P (op0))
 		break;
@@ -11836,16 +11824,6 @@ constant_address_p (rtx x)
   return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
 }
 

-/* Return a unique alias set for the GOT.  */
-
-alias_set_type
-ix86_GOT_alias_set (void)
-{
-  static alias_set_type set = -1;
-  if (set == -1)
-    set = new_alias_set ();
-  return set;
-}
 
 /* Return a legitimate reference for ORIG (an address) using the
    register REG.  If REG is 0, a new pseudo is generated.
@@ -11883,9 +11861,11 @@ legitimize_pic_address (rtx orig, rtx reg)
 
   if (TARGET_64BIT && TARGET_DLLIMPORT_DECL_ATTRIBUTES)
     {
+#if TARGET_PECOFF
       rtx tmp = legitimize_pe_coff_symbol (addr, true);
       if (tmp)
         return tmp;
+#endif
     }
 
   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
@@ -11928,9 +11908,11 @@ legitimize_pic_address (rtx orig, rtx reg)
 	      on VxWorks, see gotoff_operand.  */
 	   || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
     {
+#if TARGET_PECOFF
       rtx tmp = legitimize_pe_coff_symbol (addr, true);
       if (tmp)
         return tmp;
+#endif
 
       /* For x64 PE-COFF there is no GOT table,
 	 so we use address directly.  */
@@ -11945,7 +11927,7 @@ legitimize_pic_address (rtx orig, rtx reg)
 				    UNSPEC_GOTPCREL);
 	  new_rtx = gen_rtx_CONST (Pmode, new_rtx);
 	  new_rtx = gen_const_mem (Pmode, new_rtx);
-	  set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
+	  set_mem_alias_set (new_rtx, GOT_ALIAS_SET);
 	}
       else
 	{
@@ -11967,7 +11949,7 @@ legitimize_pic_address (rtx orig, rtx reg)
 	    new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
 
 	  new_rtx = gen_const_mem (Pmode, new_rtx);
-	  set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
+	  set_mem_alias_set (new_rtx, GOT_ALIAS_SET);
 	}
 
       new_rtx = copy_to_suggested_reg (new_rtx, reg, Pmode);
@@ -12344,7 +12326,7 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
       if (pic)
 	off = gen_rtx_PLUS (tp_mode, pic, off);
       off = gen_const_mem (tp_mode, off);
-      set_mem_alias_set (off, ix86_GOT_alias_set ());
+      set_mem_alias_set (off, GOT_ALIAS_SET);
 
       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
 	{
@@ -12503,173 +12485,6 @@ ix86_rewrite_tls_address (rtx pattern)
   return pattern;
 }
 
-/* Create or return the unique __imp_DECL dllimport symbol corresponding
-   to symbol DECL if BEIMPORT is true.  Otherwise create or return the
-   unique refptr-DECL symbol corresponding to symbol DECL.  */
-
-struct dllimport_hasher : ggc_cache_ptr_hash<tree_map>
-{
-  static inline hashval_t hash (tree_map *m) { return m->hash; }
-  static inline bool
-  equal (tree_map *a, tree_map *b)
-  {
-    return a->base.from == b->base.from;
-  }
-
-  static int
-  keep_cache_entry (tree_map *&m)
-  {
-    return ggc_marked_p (m->base.from);
-  }
-};
-
-static GTY((cache)) hash_table<dllimport_hasher> *dllimport_map;
-
-static tree
-get_dllimport_decl (tree decl, bool beimport)
-{
-  struct tree_map *h, in;
-  const char *name;
-  const char *prefix;
-  size_t namelen, prefixlen;
-  char *imp_name;
-  tree to;
-  rtx rtl;
-
-  if (!dllimport_map)
-    dllimport_map = hash_table<dllimport_hasher>::create_ggc (512);
-
-  in.hash = htab_hash_pointer (decl);
-  in.base.from = decl;
-  tree_map **loc = dllimport_map->find_slot_with_hash (&in, in.hash, INSERT);
-  h = *loc;
-  if (h)
-    return h->to;
-
-  *loc = h = ggc_alloc<tree_map> ();
-  h->hash = in.hash;
-  h->base.from = decl;
-  h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
-			   VAR_DECL, NULL, ptr_type_node);
-  DECL_ARTIFICIAL (to) = 1;
-  DECL_IGNORED_P (to) = 1;
-  DECL_EXTERNAL (to) = 1;
-  TREE_READONLY (to) = 1;
-
-  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
-  name = targetm.strip_name_encoding (name);
-  if (beimport)
-    prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
-      ? "*__imp_" : "*__imp__";
-  else
-    prefix = user_label_prefix[0] == 0 ? "*.refptr." : "*refptr.";
-  namelen = strlen (name);
-  prefixlen = strlen (prefix);
-  imp_name = (char *) alloca (namelen + prefixlen + 1);
-  memcpy (imp_name, prefix, prefixlen);
-  memcpy (imp_name + prefixlen, name, namelen + 1);
-
-  name = ggc_alloc_string (imp_name, namelen + prefixlen);
-  rtl = gen_rtx_SYMBOL_REF (Pmode, name);
-  SET_SYMBOL_REF_DECL (rtl, to);
-  SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_STUBVAR;
-  if (!beimport)
-    {
-      SYMBOL_REF_FLAGS (rtl) |= SYMBOL_FLAG_EXTERNAL;
-#ifdef SUB_TARGET_RECORD_STUB
-      SUB_TARGET_RECORD_STUB (name);
-#endif
-    }      
-
-  rtl = gen_const_mem (Pmode, rtl);
-  set_mem_alias_set (rtl, ix86_GOT_alias_set ());
-
-  SET_DECL_RTL (to, rtl);
-  SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
-
-  return to;
-}
-
-/* Expand SYMBOL into its corresponding far-address symbol.
-   WANT_REG is true if we require the result be a register.  */
-
-static rtx
-legitimize_pe_coff_extern_decl (rtx symbol, bool want_reg)
-{
-  tree imp_decl;
-  rtx x;
-
-  gcc_assert (SYMBOL_REF_DECL (symbol));
-  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), false);
-
-  x = DECL_RTL (imp_decl);
-  if (want_reg)
-    x = force_reg (Pmode, x);
-  return x;
-}
-
-/* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
-   true if we require the result be a register.  */
-
-static rtx
-legitimize_dllimport_symbol (rtx symbol, bool want_reg)
-{
-  tree imp_decl;
-  rtx x;
-
-  gcc_assert (SYMBOL_REF_DECL (symbol));
-  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), true);
-
-  x = DECL_RTL (imp_decl);
-  if (want_reg)
-    x = force_reg (Pmode, x);
-  return x;
-}
-
-/* Expand SYMBOL into its corresponding dllimport or refptr symbol.  WANT_REG 
-   is true if we require the result be a register.  */
-
-rtx
-legitimize_pe_coff_symbol (rtx addr, bool inreg)
-{
-  if (!TARGET_PECOFF)
-    return NULL_RTX;
-
-  if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
-    {
-      if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
-	return legitimize_dllimport_symbol (addr, inreg);
-      if (GET_CODE (addr) == CONST
-	  && GET_CODE (XEXP (addr, 0)) == PLUS
-	  && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
-	  && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
-	{
-	  rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), inreg);
-	  return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
-	}
-    }
-
-  if (ix86_cmodel != CM_LARGE_PIC && ix86_cmodel != CM_MEDIUM_PIC)
-    return NULL_RTX;
-  if (GET_CODE (addr) == SYMBOL_REF
-      && !is_imported_p (addr)
-      && SYMBOL_REF_EXTERNAL_P (addr)
-      && SYMBOL_REF_DECL (addr))
-    return legitimize_pe_coff_extern_decl (addr, inreg);
-
-  if (GET_CODE (addr) == CONST
-      && GET_CODE (XEXP (addr, 0)) == PLUS
-      && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
-      && !is_imported_p (XEXP (XEXP (addr, 0), 0))
-      && SYMBOL_REF_EXTERNAL_P (XEXP (XEXP (addr, 0), 0))
-      && SYMBOL_REF_DECL (XEXP (XEXP (addr, 0), 0)))
-    {
-      rtx t = legitimize_pe_coff_extern_decl (XEXP (XEXP (addr, 0), 0), inreg);
-      return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
-    }
-  return NULL_RTX;
-}
-
 /* Try machine-dependent ways of modifying an illegitimate address
    to be legitimate.  If we find one, return the new, valid address.
    This macro is used in only one place: `memory_address' in explow.cc.
@@ -12709,9 +12524,11 @@ ix86_legitimize_address (rtx x, rtx, machine_mode mode)
 
   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
     {
+#if TARGET_PECOFF
       rtx tmp = legitimize_pe_coff_symbol (x, true);
       if (tmp)
         return tmp;
+#endif
     }
 
   if (flag_pic && SYMBOLIC_CONST (x))
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 7051c6c13e4..d9f02f66518 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2262,6 +2262,8 @@ extern int const svr4_debugger_register_map[FIRST_PSEUDO_REGISTER];
 /* Which processor to tune code generation for.  These must be in sync
    with processor_cost_table in i386-options.cc.  */
 
+#define GOT_ALIAS_SET -1
+
 enum processor_type
 {
   PROCESSOR_GENERIC = 0,
diff --git a/gcc/config/mingw/t-cygming b/gcc/config/mingw/t-cygming
index f5de941c8e5..3dd9116d92b 100644
--- a/gcc/config/mingw/t-cygming
+++ b/gcc/config/mingw/t-cygming
@@ -33,6 +33,12 @@ winnt-cxx.o: $(srcdir)/config/mingw/winnt-cxx.cc $(CONFIG_H) $(SYSTEM_H) \
 	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
 	$(srcdir)/config/mingw/winnt-cxx.cc
 
+winnt-dll.o: $(srcdir)/config/mingw/winnt-dll.cc $(CONFIG_H) $(SYSTEM_H) \
+  coretypes.h \
+  $(TM_H) $(TREE_H) flags.h \
+  $(TM_P_H) $(HASH_TABLE_H) $(GGC_H)
+	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+	$(srcdir)/config/mingw/winnt-dll.cc
 
 winnt-stubs.o: $(srcdir)/config/mingw/winnt-stubs.cc $(CONFIG_H) $(SYSTEM_H) \
   coretypes.h \
diff --git a/gcc/config/mingw/winnt-dll.cc b/gcc/config/mingw/winnt-dll.cc
new file mode 100644
index 00000000000..1354402a959
--- /dev/null
+++ b/gcc/config/mingw/winnt-dll.cc
@@ -0,0 +1,231 @@
+/* Expand a SYMBOL into its corresponding dllimport, far-address,
+or refptr symbol.
+Copyright (C) 1988-2024 Free Software Foundation, Inc.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+http://www.gnu.org/licenses/.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "backend.h"
+#include "target.h"
+#include "rtl.h"
+#include "tree.h"
+#include "memmodel.h"
+#include "stringpool.h"
+#include "emit-rtl.h"
+#include "alias.h"
+#include "varasm.h"
+#include "output.h"
+#include "explow.h"
+#include "winnt.h"
+
+/* Create or return the unique __imp_DECL dllimport symbol corresponding
+   to symbol DECL if BEIMPORT is true.  Otherwise create or return the
+   unique refptr-DECL symbol corresponding to symbol DECL.  */
+
+struct dllimport_hasher : ggc_cache_ptr_hash<tree_map>
+{
+  static inline hashval_t hash (tree_map *m)
+  {
+    return m->hash;
+  }
+
+  static inline bool
+  equal (tree_map *a, tree_map *b)
+  {
+    return a->base.from == b->base.from;
+  }
+
+  static int
+  keep_cache_entry (tree_map *&m)
+  {
+    return ggc_marked_p (m->base.from);
+  }
+};
+
+static GTY ((cache)) hash_table<dllimport_hasher> *dllimport_map;
+
+/*  Nonzero if the symbol is marked as dllimport, or as stub-variable,
+    otherwise zero.  */
+
+bool
+is_imported_p (rtx x)
+{
+  if (!TARGET_DLLIMPORT_DECL_ATTRIBUTES
+      || GET_CODE (x) != SYMBOL_REF)
+    return false;
+
+  return SYMBOL_REF_DLLIMPORT_P (x) || SYMBOL_REF_STUBVAR_P (x);
+}
+
+/* Return a unique alias set for the GOT.  */
+
+alias_set_type
+mingw_GOT_alias_set (void)
+{
+  static alias_set_type set = -1;
+  if (set == -1)
+    set = new_alias_set ();
+  return set;
+}
+
+static tree
+get_dllimport_decl (tree decl, bool beimport)
+{
+  struct tree_map *h, in;
+  const char *name;
+  const char *prefix;
+  size_t namelen, prefixlen;
+  char *imp_name;
+  tree to;
+  rtx rtl;
+
+  if (!dllimport_map)
+    dllimport_map = hash_table<dllimport_hasher>::create_ggc (512);
+
+  in.hash = htab_hash_pointer (decl);
+  in.base.from = decl;
+  tree_map **loc = dllimport_map->find_slot_with_hash (&in, in.hash, INSERT);
+  h = *loc;
+  if (h)
+    return h->to;
+
+  *loc = h = ggc_alloc<tree_map> ();
+  h->hash = in.hash;
+  h->base.from = decl;
+  h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
+			   VAR_DECL, NULL, ptr_type_node);
+  DECL_ARTIFICIAL (to) = 1;
+  DECL_IGNORED_P (to) = 1;
+  DECL_EXTERNAL (to) = 1;
+  TREE_READONLY (to) = 1;
+
+  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+  name = targetm.strip_name_encoding (name);
+  if (beimport)
+    prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
+      ? "*__imp_" : "*__imp__";
+  else
+    prefix = user_label_prefix[0] == 0 ? "*.refptr." : "*refptr.";
+  namelen = strlen (name);
+  prefixlen = strlen (prefix);
+  imp_name = (char *) alloca (namelen + prefixlen + 1);
+  memcpy (imp_name, prefix, prefixlen);
+  memcpy (imp_name + prefixlen, name, namelen + 1);
+
+  name = ggc_alloc_string (imp_name, namelen + prefixlen);
+  rtl = gen_rtx_SYMBOL_REF (Pmode, name);
+  SET_SYMBOL_REF_DECL (rtl, to);
+  SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_STUBVAR;
+  if (!beimport)
+    {
+      SYMBOL_REF_FLAGS (rtl) |= SYMBOL_FLAG_EXTERNAL;
+#ifdef SUB_TARGET_RECORD_STUB
+      SUB_TARGET_RECORD_STUB (name);
+#endif
+    }
+
+  rtl = gen_const_mem (Pmode, rtl);
+  set_mem_alias_set (rtl, mingw_GOT_alias_set ());
+
+  SET_DECL_RTL (to, rtl);
+  SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
+
+  return to;
+}
+
+/* Expand SYMBOL into its corresponding far-address symbol.
+   WANT_REG is true if we require the result be a register.  */
+
+static rtx
+legitimize_pe_coff_extern_decl (rtx symbol, bool want_reg)
+{
+  tree imp_decl;
+  rtx x;
+
+  gcc_assert (SYMBOL_REF_DECL (symbol));
+  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), false);
+
+  x = DECL_RTL (imp_decl);
+  if (want_reg)
+    x = force_reg (Pmode, x);
+  return x;
+}
+
+/* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
+   true if we require the result be a register.  */
+
+static rtx
+legitimize_dllimport_symbol (rtx symbol, bool want_reg)
+{
+  tree imp_decl;
+  rtx x;
+
+  gcc_assert (SYMBOL_REF_DECL (symbol));
+  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), true);
+
+  x = DECL_RTL (imp_decl);
+  if (want_reg)
+    x = force_reg (Pmode, x);
+  return x;
+}
+
+/* Expand SYMBOL into its corresponding dllimport or refptr symbol.  WANT_REG
+   is true if we require the result be a register.  */
+
+rtx
+legitimize_pe_coff_symbol (rtx addr, bool inreg)
+{
+  if (!TARGET_PECOFF)
+    return NULL_RTX;
+
+  if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
+    {
+      if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
+	return legitimize_dllimport_symbol (addr, inreg);
+      if (GET_CODE (addr) == CONST
+	  && GET_CODE (XEXP (addr, 0)) == PLUS
+	  && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
+	  && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
+	{
+	  rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), inreg);
+	  return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
+	}
+    }
+
+  if (ix86_cmodel != CM_LARGE_PIC && ix86_cmodel != CM_MEDIUM_PIC)
+    return NULL_RTX;
+
+  if (GET_CODE (addr) == SYMBOL_REF
+      && !is_imported_p (addr)
+      && SYMBOL_REF_EXTERNAL_P (addr)
+      && SYMBOL_REF_DECL (addr))
+    return legitimize_pe_coff_extern_decl (addr, inreg);
+
+  if (GET_CODE (addr) == CONST
+      && GET_CODE (XEXP (addr, 0)) == PLUS
+      && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
+      && !is_imported_p (XEXP (XEXP (addr, 0), 0))
+      && SYMBOL_REF_EXTERNAL_P (XEXP (XEXP (addr, 0), 0))
+      && SYMBOL_REF_DECL (XEXP (XEXP (addr, 0), 0)))
+    {
+      rtx t = legitimize_pe_coff_extern_decl (XEXP (XEXP (addr, 0), 0), inreg);
+      return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
+    }
+  return NULL_RTX;
+}
+
+#include "gt-winnt-dll.h"
\ No newline at end of file
diff --git a/gcc/config/mingw/winnt-dll.h b/gcc/config/mingw/winnt-dll.h
new file mode 100644
index 00000000000..14ca743b69f
--- /dev/null
+++ b/gcc/config/mingw/winnt-dll.h
@@ -0,0 +1,30 @@
+/* Expand a SYMBOL into its corresponding dllimport, far-address,
+or refptr symbol.
+Copyright (C) 2024 Free Software Foundation, Inc.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+http://www.gnu.org/licenses/.  */
+
+#ifndef GCC_MINGW_WINNT_DLL_H
+#define GCC_MINGW_WINNT_DLL_H
+
+#ifndef USED_FOR_TARGET
+
+extern bool is_imported_p (rtx x);
+extern alias_set_type mingw_GOT_alias_set (void);
+extern rtx legitimize_pe_coff_symbol (rtx addr, bool inreg);
+
+#endif /* not USED_FOR_TARGET.  */
+
+#endif /* GCC_MINGW_WINNT_DLL_H.  */
diff --git a/gcc/config/mingw/winnt.cc b/gcc/config/mingw/winnt.cc
index 2a4fc03fc56..9901576ade0 100644
--- a/gcc/config/mingw/winnt.cc
+++ b/gcc/config/mingw/winnt.cc
@@ -672,7 +672,7 @@ mingw_pe_maybe_record_exported_symbol (tree decl, const char *name, int is_data)
 }
 
 void
-i386_pe_record_stub (const char *name)
+mingw_pe_record_stub (const char *name)
 {
   struct stub_list *p;
 
diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h
index d6202816e8f..74e454a13c8 100644
--- a/gcc/config/mingw/winnt.h
+++ b/gcc/config/mingw/winnt.h
@@ -25,6 +25,7 @@ extern void mingw_pe_declare_function_type (FILE *file, const char *name,
 	int pub);
 extern void mingw_pe_encode_section_info (tree, rtx, int);
 extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
+extern void mingw_pe_record_stub (const char *name);
 extern unsigned int mingw_pe_section_type_flags (tree, const char *, int);
 extern void mingw_pe_unique_section (tree, int);
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 3/6] Rename functions for reuse in AArch64
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
  2024-06-07  9:46 ` [PATCH v2 1/6] Move mingw_* declarations to the mingw folder Evgeny Karpov
  2024-06-07  9:48 ` [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw Evgeny Karpov
@ 2024-06-07  9:49 ` Evgeny Karpov
  2024-06-07  9:50 ` [PATCH v2 4/6] aarch64: Add selectany attribute handling Evgeny Karpov
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-07  9:49 UTC (permalink / raw)
  To: Evgeny Karpov, gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

This patch renames functions related to dllimport/dllexport
and selectany functionality. These functions will be reused
in the aarch64-w64-mingw32 target.

gcc/ChangeLog:

	* config/i386/cygming.h (mingw_pe_record_stub):
	Rename functions in mingw folder which will be reused for
	aarch64.
	(TARGET_ASM_FILE_END): Update to new target-independent name.
	(SUBTARGET_ATTRIBUTE_TABLE): Likewise.
	(TARGET_VALID_DLLIMPORT_ATTRIBUTE_P): Likewise.
	(SUB_TARGET_RECORD_STUB): Likewise.
	* config/i386/i386-protos.h (ix86_handle_selectany_attribute): Likewise.
	(mingw_handle_selectany_attribute): Likewise.
	(i386_pe_valid_dllimport_attribute_p): Likewise.
	(mingw_pe_valid_dllimport_attribute_p): Likewise.
	(i386_pe_file_end): Likewise.
	(mingw_pe_file_end): Likewise.
	(i386_pe_record_stub): Likewise.
	(mingw_pe_record_stub): Likewise.
	* config/mingw/winnt.cc (ix86_handle_selectany_attribute): Likewise.
	(mingw_handle_selectany_attribute): Likewise.
	(i386_pe_valid_dllimport_attribute_p): Likewise.
	(mingw_pe_valid_dllimport_attribute_p): Likewise.
	(i386_pe_record_stub): Likewise.
	(mingw_pe_record_stub): Likewise.
	(i386_pe_file_end): Likewise.
	(mingw_pe_file_end): Likewise.
	* config/mingw/winnt.h (mingw_handle_selectany_attribute):
	Declate functionality that will be reused by multiple targets.
	(mingw_pe_file_end): Likewise.
	(mingw_pe_record_stub): Likewise.
	(mingw_pe_valid_dllimport_attribute_p): Likewise.
---
 gcc/config/i386/cygming.h     | 6 +++---
 gcc/config/i386/i386-protos.h | 3 ---
 gcc/config/mingw/winnt.cc     | 8 ++++----
 gcc/config/mingw/winnt.h      | 6 +++++-
 4 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
index 56945f00c11..4bb8d7f920c 100644
--- a/gcc/config/i386/cygming.h
+++ b/gcc/config/i386/cygming.h
@@ -344,7 +344,7 @@ do {						\
 
 /* Output function declarations at the end of the file.  */
 #undef TARGET_ASM_FILE_END
-#define TARGET_ASM_FILE_END i386_pe_file_end
+#define TARGET_ASM_FILE_END mingw_pe_file_end
 
 /* Kludge because of missing PE-COFF support for early LTO debug.  */
 #undef  TARGET_ASM_LTO_START
@@ -445,7 +445,7 @@ do {						\
 
 #define SUBTARGET_ATTRIBUTE_TABLE \
   { "selectany", 0, 0, true, false, false, false, \
-    ix86_handle_selectany_attribute, NULL }
+    mingw_handle_selectany_attribute, NULL }
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
        affects_type_identity, handler, exclude } */
 
@@ -453,7 +453,7 @@ do {						\
 #undef NO_PROFILE_COUNTERS
 #define NO_PROFILE_COUNTERS 1
 
-#define TARGET_VALID_DLLIMPORT_ATTRIBUTE_P i386_pe_valid_dllimport_attribute_p
+#define TARGET_VALID_DLLIMPORT_ATTRIBUTE_P mingw_pe_valid_dllimport_attribute_p
 #define TARGET_CXX_ADJUST_CLASS_AT_DEFINITION i386_pe_adjust_class_at_definition
 #define SUBTARGET_MANGLE_DECL_ASSEMBLER_NAME i386_pe_mangle_decl_assembler_name
 
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index b2e9b9e0d3d..08c69abb45f 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -264,7 +264,6 @@ extern unsigned int ix86_local_alignment (tree, machine_mode,
 extern unsigned int ix86_minimum_alignment (tree, machine_mode,
 					    unsigned int);
 extern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *);
-extern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *);
 extern int x86_field_alignment (tree, int);
 extern tree ix86_valid_target_attribute_tree (tree, tree,
 					      struct gcc_options *,
@@ -304,12 +303,10 @@ extern void ix86_register_pragmas (void);
 extern void i386_pe_record_external_function (tree, const char *);
 extern bool i386_pe_binds_local_p (const_tree);
 extern const char *i386_pe_strip_name_encoding_full (const char *);
-extern bool i386_pe_valid_dllimport_attribute_p (const_tree);
 extern void i386_pe_asm_output_aligned_decl_common (FILE *, tree,
 						    const char *,
 						    HOST_WIDE_INT,
 						    HOST_WIDE_INT);
-extern void i386_pe_file_end (void);
 extern void i386_pe_asm_lto_start (void);
 extern void i386_pe_asm_lto_end (void);
 extern void i386_pe_start_function (FILE *, const char *, tree);
diff --git a/gcc/config/mingw/winnt.cc b/gcc/config/mingw/winnt.cc
index 9901576ade0..803e5f5ec85 100644
--- a/gcc/config/mingw/winnt.cc
+++ b/gcc/config/mingw/winnt.cc
@@ -71,8 +71,8 @@ ix86_handle_shared_attribute (tree *node, tree name, tree, int,
 /* Handle a "selectany" attribute;
    arguments as in struct attribute_spec.handler.  */
 tree
-ix86_handle_selectany_attribute (tree *node, tree name, tree, int,
-				 bool *no_add_attrs)
+mingw_handle_selectany_attribute (tree *node, tree name, tree, int,
+				  bool *no_add_attrs)
 {
   tree decl = *node;
   /* The attribute applies only to objects that are initialized and have
@@ -162,7 +162,7 @@ i386_pe_determine_dllimport_p (tree decl)
 /* Handle the -mno-fun-dllimport target switch.  */
 
 bool
-i386_pe_valid_dllimport_attribute_p (const_tree decl)
+mingw_pe_valid_dllimport_attribute_p (const_tree decl)
 {
    if (TARGET_NOP_FUN_DLLIMPORT && TREE_CODE (decl) == FUNCTION_DECL)
      return false;
@@ -749,7 +749,7 @@ i386_find_on_wrapper_list (const char *target)
    output the .drectve section.  */
 
 void
-i386_pe_file_end (void)
+mingw_pe_file_end (void)
 {
   struct extern_list *p;
 
diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h
index 74e454a13c8..97fefbcebca 100644
--- a/gcc/config/mingw/winnt.h
+++ b/gcc/config/mingw/winnt.h
@@ -20,14 +20,18 @@ http://www.gnu.org/licenses/.  */
 
 #ifndef USED_FOR_TARGET
 
+extern tree mingw_handle_selectany_attribute (tree *, tree, tree, int, bool *);
+
 extern void mingw_pe_asm_named_section (const char *, unsigned int, tree);
 extern void mingw_pe_declare_function_type (FILE *file, const char *name,
 	int pub);
 extern void mingw_pe_encode_section_info (tree, rtx, int);
+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 *name);
+extern void mingw_pe_record_stub (const char *);
 extern unsigned int mingw_pe_section_type_flags (tree, const char *, int);
 extern void mingw_pe_unique_section (tree, int);
+extern bool mingw_pe_valid_dllimport_attribute_p (const_tree);
 
 #endif /* not USED_FOR_TARGET.  */
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 4/6] aarch64: Add selectany attribute handling
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
                   ` (2 preceding siblings ...)
  2024-06-07  9:49 ` [PATCH v2 3/6] Rename functions for reuse in AArch64 Evgeny Karpov
@ 2024-06-07  9:50 ` Evgeny Karpov
  2024-06-07  9:51 ` [PATCH v2 5/6] Adjust DLL import/export implementation for AArch64 Evgeny Karpov
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-07  9:50 UTC (permalink / raw)
  To: Evgeny Karpov, gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

This patch extends the aarch64 attributes list with the selectany
attribute for the aarch64-w64-mingw32 target and reuses the mingw
implementation to handle it.

	* config/aarch64/aarch64.cc:
	Extend the aarch64 attributes list.
	* config/aarch64/cygming.h (SUBTARGET_ATTRIBUTE_TABLE):
	Define the selectany attribute.
---
 gcc/config/aarch64/aarch64.cc | 5 ++++-
 gcc/config/aarch64/cygming.h  | 3 +++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 13191ec8e34..3418e57218f 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -859,7 +859,10 @@ static const attribute_spec aarch64_gnu_attributes[] =
 			  NULL },
   { "Advanced SIMD type", 1, 1, false, true,  false, true,  NULL, NULL },
   { "SVE type",		  3, 3, false, true,  false, true,  NULL, NULL },
-  { "SVE sizeless type",  0, 0, false, true,  false, true,  NULL, NULL }
+  { "SVE sizeless type",  0, 0, false, true,  false, true,  NULL, NULL },
+#ifdef SUBTARGET_ATTRIBUTE_TABLE
+  SUBTARGET_ATTRIBUTE_TABLE
+#endif
 };
 
 static const scoped_attribute_specs aarch64_gnu_attribute_table =
diff --git a/gcc/config/aarch64/cygming.h b/gcc/config/aarch64/cygming.h
index 0d048879311..76623153080 100644
--- a/gcc/config/aarch64/cygming.h
+++ b/gcc/config/aarch64/cygming.h
@@ -154,6 +154,9 @@ still needed for compilation.  */
     flag_stack_check = STATIC_BUILTIN_STACK_CHECK;	\
   } while (0)
 
+#define SUBTARGET_ATTRIBUTE_TABLE \
+  { "selectany", 0, 0, true, false, false, false, \
+    mingw_handle_selectany_attribute, NULL }
 
 #define SUPPORTS_ONE_ONLY 1
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 5/6] Adjust DLL import/export implementation for AArch64
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
                   ` (3 preceding siblings ...)
  2024-06-07  9:50 ` [PATCH v2 4/6] aarch64: Add selectany attribute handling Evgeny Karpov
@ 2024-06-07  9:51 ` Evgeny Karpov
  2024-06-07  9:52 ` [PATCH v2 6/6] aarch64: Add DLL import/export to AArch64 target Evgeny Karpov
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-07  9:51 UTC (permalink / raw)
  To: Evgeny Karpov, gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

The DLL import/export mingw implementation, originally from ix86, requires
minor adjustments to be compatible with AArch64.

gcc/ChangeLog:

	* config/i386/cygming.h (PE_COFF_EXTERN_DECL_SHOULD_BE_LEGITIMIZED):
	Declare whether an external declaration should be legitimized.
	(HAVE_64BIT_POINTERS): Define whether the target supports 64-bit
	pointers.
	* config/mingw/mingw32.h (defined): Use the correct DllMainCRTStartup
	entry function.
	* config/mingw/winnt-dll.cc (defined): Exclude ix86-related code.
---
 gcc/config/i386/cygming.h     | 5 +++++
 gcc/config/mingw/mingw32.h    | 2 +-
 gcc/config/mingw/winnt-dll.cc | 2 +-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
index 4bb8d7f920c..0493b3be875 100644
--- a/gcc/config/i386/cygming.h
+++ b/gcc/config/i386/cygming.h
@@ -472,3 +472,8 @@ do {						\
 
 #undef GOT_ALIAS_SET
 #define GOT_ALIAS_SET mingw_GOT_alias_set ()
+
+#define PE_COFF_EXTERN_DECL_SHOULD_BE_LEGITIMIZED \
+  ix86_cmodel == CM_LARGE_PIC || ix86_cmodel == CM_MEDIUM_PIC
+
+#define HAVE_64BIT_POINTERS TARGET_64BIT_DEFAULT
diff --git a/gcc/config/mingw/mingw32.h b/gcc/config/mingw/mingw32.h
index fa6e307476c..0c9d5424942 100644
--- a/gcc/config/mingw/mingw32.h
+++ b/gcc/config/mingw/mingw32.h
@@ -82,7 +82,7 @@ along with GCC; see the file COPYING3.  If not see
 #endif
 
 #undef SUB_LINK_ENTRY
-#if TARGET_64BIT_DEFAULT
+#if HAVE_64BIT_POINTERS
 #define SUB_LINK_ENTRY SUB_LINK_ENTRY64
 #else
 #define SUB_LINK_ENTRY SUB_LINK_ENTRY32
diff --git a/gcc/config/mingw/winnt-dll.cc b/gcc/config/mingw/winnt-dll.cc
index 1354402a959..66c445cba77 100644
--- a/gcc/config/mingw/winnt-dll.cc
+++ b/gcc/config/mingw/winnt-dll.cc
@@ -206,7 +206,7 @@ legitimize_pe_coff_symbol (rtx addr, bool inreg)
 	}
     }
 
-  if (ix86_cmodel != CM_LARGE_PIC && ix86_cmodel != CM_MEDIUM_PIC)
+  if (!PE_COFF_EXTERN_DECL_SHOULD_BE_LEGITIMIZED)
     return NULL_RTX;
 
   if (GET_CODE (addr) == SYMBOL_REF
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 6/6] aarch64: Add DLL import/export to AArch64 target
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
                   ` (4 preceding siblings ...)
  2024-06-07  9:51 ` [PATCH v2 5/6] Adjust DLL import/export implementation for AArch64 Evgeny Karpov
@ 2024-06-07  9:52 ` Evgeny Karpov
  2024-06-08 13:01 ` [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-07  9:52 UTC (permalink / raw)
  To: Evgeny Karpov, gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

This patch reuses the MinGW implementation to enable DLL import/export
functionality for the aarch64-w64-mingw32 target. It also modifies
environment configurations for MinGW.

gcc/ChangeLog:

	* config.gcc: Add winnt-dll.o, which contains the DLL
	import/export implementation.
	* config/aarch64/aarch64.cc (aarch64_legitimize_pe_coff_symbol):
	Add a conditional function that reuses the MinGW implementation
	for COFF and does nothing otherwise.
	(aarch64_load_symref_appropriately): Add dllimport
	implementation.
	(aarch64_expand_call): Likewise.
	(aarch64_legitimize_address): Likewise.
	* config/aarch64/cygming.h (SYMBOL_FLAG_DLLIMPORT): Modify MinGW
	environment to support DLL import/export.
	(SYMBOL_FLAG_DLLEXPORT): Likewise.
	(SYMBOL_REF_DLLIMPORT_P): Likewise.
	(SYMBOL_FLAG_STUBVAR): Likewise.
	(SYMBOL_REF_STUBVAR_P): Likewise.
	(TARGET_VALID_DLLIMPORT_ATTRIBUTE_P): Likewise.
	(TARGET_ASM_FILE_END): Likewise.
	(SUB_TARGET_RECORD_STUB): Likewise.
	(GOT_ALIAS_SET): Likewise.
	(PE_COFF_EXTERN_DECL_SHOULD_BE_LEGITIMIZED): Likewise.
	(HAVE_64BIT_POINTERS): Likewise.
---
 gcc/config.gcc                |  4 +++-
 gcc/config/aarch64/aarch64.cc | 37 +++++++++++++++++++++++++++++++++++
 gcc/config/aarch64/cygming.h  | 26 ++++++++++++++++++++++--
 3 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/gcc/config.gcc b/gcc/config.gcc
index d053b98efa8..331285b7b6d 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1276,10 +1276,12 @@ aarch64-*-mingw*)
 	tm_file="${tm_file} mingw/mingw32.h"
 	tm_file="${tm_file} mingw/mingw-stdint.h"
 	tm_file="${tm_file} mingw/winnt.h"
+	tm_file="${tm_file} mingw/winnt-dll.h"
 	tmake_file="${tmake_file} aarch64/t-aarch64"
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
+	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
 	extra_options="${extra_options} mingw/cygming.opt mingw/mingw.opt"
-	extra_objs="${extra_objs} winnt.o"
+	extra_objs="${extra_objs} winnt.o winnt-dll.o"
 	c_target_objs="${c_target_objs} msformat-c.o"
 	d_target_objs="${d_target_objs} winnt-d.o"
 	tmake_file="${tmake_file} mingw/t-cygming"
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 3418e57218f..5706b9aeb6b 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -860,6 +860,10 @@ static const attribute_spec aarch64_gnu_attributes[] =
   { "Advanced SIMD type", 1, 1, false, true,  false, true,  NULL, NULL },
   { "SVE type",		  3, 3, false, true,  false, true,  NULL, NULL },
   { "SVE sizeless type",  0, 0, false, true,  false, true,  NULL, NULL },
+#if TARGET_DLLIMPORT_DECL_ATTRIBUTES
+  { "dllimport", 0, 0, false, false, false, false, handle_dll_attribute, NULL },
+  { "dllexport", 0, 0, false, false, false, false, handle_dll_attribute, NULL },
+#endif
 #ifdef SUBTARGET_ATTRIBUTE_TABLE
   SUBTARGET_ATTRIBUTE_TABLE
 #endif
@@ -2819,6 +2823,15 @@ tls_symbolic_operand_type (rtx addr)
   return tls_kind;
 }
 
+rtx aarch64_legitimize_pe_coff_symbol (rtx addr, bool inreg)
+{
+#if TARGET_PECOFF
+  return legitimize_pe_coff_symbol (addr, inreg);
+#else
+  return NULL_RTX;
+#endif
+}
+
 /* We'll allow lo_sum's in addresses in our legitimate addresses
    so that combine would take care of combining addresses where
    necessary, but for generation purposes, we'll generate the address
@@ -2865,6 +2878,17 @@ static void
 aarch64_load_symref_appropriately (rtx dest, rtx imm,
 				   enum aarch64_symbol_type type)
 {
+  /* If legitimize returns a value
+     copy it directly to the destination and return.  */
+
+  rtx tmp = aarch64_legitimize_pe_coff_symbol (imm, true);
+
+  if (tmp)
+    {
+       emit_insn (gen_rtx_SET (dest, tmp));
+       return;
+    }
+
   switch (type)
     {
     case SYMBOL_SMALL_ABSOLUTE:
@@ -11233,6 +11257,12 @@ aarch64_expand_call (rtx result, rtx mem, rtx cookie, bool sibcall)
 
   gcc_assert (MEM_P (mem));
   callee = XEXP (mem, 0);
+
+  tmp = aarch64_legitimize_pe_coff_symbol (callee, false);
+
+  if (tmp)
+    callee = tmp;
+
   mode = GET_MODE (callee);
   gcc_assert (mode == Pmode);
 
@@ -12709,6 +12739,13 @@ aarch64_anchor_offset (HOST_WIDE_INT offset, HOST_WIDE_INT size,
 static rtx
 aarch64_legitimize_address (rtx x, rtx /* orig_x  */, machine_mode mode)
 {
+  if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
+    {
+      rtx tmp = aarch64_legitimize_pe_coff_symbol (x, true);
+      if (tmp)
+	return tmp;
+    }
+
   /* Try to split X+CONST into Y=X+(CONST & ~mask), Y+(CONST&mask),
      where mask is selected by alignment and size of the offset.
      We try to pick as large a range for the offset as possible to
diff --git a/gcc/config/aarch64/cygming.h b/gcc/config/aarch64/cygming.h
index 76623153080..e26488735db 100644
--- a/gcc/config/aarch64/cygming.h
+++ b/gcc/config/aarch64/cygming.h
@@ -28,12 +28,18 @@ along with GCC; see the file COPYING3.  If not see
 
 #define print_reg(rtx, code, file) (gcc_unreachable ())
 
-#define SYMBOL_FLAG_DLLIMPORT 0
-#define SYMBOL_FLAG_DLLEXPORT 0
+#define SYMBOL_FLAG_DLLIMPORT		(SYMBOL_FLAG_MACH_DEP << 0)
+#define SYMBOL_REF_DLLIMPORT_P(X) \
+	((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_DLLIMPORT) != 0)
 
+#define SYMBOL_FLAG_DLLEXPORT		(SYMBOL_FLAG_MACH_DEP << 1)
 #define SYMBOL_REF_DLLEXPORT_P(X) \
 	((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_DLLEXPORT) != 0)
 
+#define SYMBOL_FLAG_STUBVAR	(SYMBOL_FLAG_MACH_DEP << 2)
+#define SYMBOL_REF_STUBVAR_P(X) \
+	((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_STUBVAR) != 0)
+
 /* Disable SEH and declare the required SEH-related macros that are
 still needed for compilation.  */
 #undef TARGET_SEH
@@ -59,6 +65,12 @@ still needed for compilation.  */
 #define TARGET_ASM_UNIQUE_SECTION mingw_pe_unique_section
 #define TARGET_ENCODE_SECTION_INFO  mingw_pe_encode_section_info
 
+#define TARGET_VALID_DLLIMPORT_ATTRIBUTE_P mingw_pe_valid_dllimport_attribute_p
+
+/* Output function declarations at the end of the file.  */
+#undef TARGET_ASM_FILE_END
+#define TARGET_ASM_FILE_END mingw_pe_file_end
+
 /* Declare the type properly for any external libcall.  */
 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
   mingw_pe_declare_function_type (FILE, XSTR (FUN, 0), 1)
@@ -158,6 +170,9 @@ still needed for compilation.  */
   { "selectany", 0, 0, true, false, false, false, \
     mingw_handle_selectany_attribute, NULL }
 
+#undef SUB_TARGET_RECORD_STUB
+#define SUB_TARGET_RECORD_STUB mingw_pe_record_stub
+
 #define SUPPORTS_ONE_ONLY 1
 
 /* Define this to be nonzero if static stack checking is supported.  */
@@ -168,4 +183,11 @@ still needed for compilation.  */
 #undef MAX_OFILE_ALIGNMENT
 #define MAX_OFILE_ALIGNMENT (8192 * 8)
 
+#undef GOT_ALIAS_SET
+#define GOT_ALIAS_SET mingw_GOT_alias_set ()
+
+#define PE_COFF_EXTERN_DECL_SHOULD_BE_LEGITIMIZED 1
+
+#define HAVE_64BIT_POINTERS 1
+
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw
  2024-06-07  9:48 ` [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw Evgeny Karpov
@ 2024-06-07 11:11   ` Uros Bizjak
  2024-06-08 12:37   ` Evgeny Karpov
  2024-06-25 10:02   ` x86_64-gnu-linux bootstrap fail (was: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw) Tobias Burnus
  2 siblings, 0 replies; 15+ messages in thread
From: Uros Bizjak @ 2024-06-07 11:11 UTC (permalink / raw)
  To: Evgeny Karpov
  Cc: gcc-patches, richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, 10walls

On Fri, Jun 7, 2024 at 11:48 AM Evgeny Karpov
<Evgeny.Karpov@microsoft.com> wrote:
>
> This patch extracts the ix86 implementation for expanding a SYMBOL
> into its corresponding dllimport, far-address, or refptr symbol.
> It will be reused in the aarch64-w64-mingw32 target.
> The implementation is copied as is from i386/i386.cc with
> minor changes to follow to the code style.
>
> Also this patch replaces the original DLL import/export
> implementation in ix86 with mingw.
>
> gcc/ChangeLog:
>
>         * config.gcc: Add winnt-dll.o, which contains the DLL
>         import/export implementation.
>         * config/i386/cygming.h (SUB_TARGET_RECORD_STUB): Remove the
>         old implementation. Rename the required function to MinGW.
>         Use MinGW implementation for COFF and nothing otherwise.
>         (GOT_ALIAS_SET): Likewise.
>         * config/i386/i386-expand.cc (ix86_expand_move): Likewise.
>         * config/i386/i386-expand.h (ix86_GOT_alias_set): Likewise.
>         (legitimize_pe_coff_symbol): Likewise.
>         * config/i386/i386-protos.h (i386_pe_record_stub): Likewise.
>         * config/i386/i386.cc (is_imported_p): Likewise.
>         (legitimate_pic_address_disp_p): Likewise.
>         (ix86_GOT_alias_set): Likewise.
>         (legitimize_pic_address): Likewise.
>         (legitimize_tls_address): Likewise.
>         (struct dllimport_hasher): Likewise.
>         (GTY): Likewise.
>         (get_dllimport_decl): Likewise.
>         (legitimize_pe_coff_extern_decl): Likewise.
>         (legitimize_dllimport_symbol): Likewise.
>         (legitimize_pe_coff_symbol): Likewise.
>         (ix86_legitimize_address): Likewise.
>         * config/i386/i386.h (GOT_ALIAS_SET): Likewise.
>         * config/mingw/winnt.cc (i386_pe_record_stub): Likewise.
>         (mingw_pe_record_stub): Likewise.
>         * config/mingw/winnt.h (mingw_pe_record_stub): Likewise.
>         * config/mingw/t-cygming: Add the winnt-dll.o compilation.
>         * config/mingw/winnt-dll.cc: New file.
>         * config/mingw/winnt-dll.h: New file.

LGTM for generic x86 changes.

Thanks,
Uros.

> ---
>  gcc/config.gcc                 |  12 +-
>  gcc/config/i386/cygming.h      |   5 +-
>  gcc/config/i386/i386-expand.cc |   4 +-
>  gcc/config/i386/i386-expand.h  |   2 -
>  gcc/config/i386/i386-protos.h  |   1 -
>  gcc/config/i386/i386.cc        | 205 ++---------------------------
>  gcc/config/i386/i386.h         |   2 +
>  gcc/config/mingw/t-cygming     |   6 +
>  gcc/config/mingw/winnt-dll.cc  | 231 +++++++++++++++++++++++++++++++++
>  gcc/config/mingw/winnt-dll.h   |  30 +++++
>  gcc/config/mingw/winnt.cc      |   2 +-
>  gcc/config/mingw/winnt.h       |   1 +
>  12 files changed, 298 insertions(+), 203 deletions(-)
>  create mode 100644 gcc/config/mingw/winnt-dll.cc
>  create mode 100644 gcc/config/mingw/winnt-dll.h
>
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 553a310f4bd..d053b98efa8 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -2177,11 +2177,13 @@ i[4567]86-wrs-vxworks*|x86_64-wrs-vxworks7*)
>  i[34567]86-*-cygwin*)
>         tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygming.h i386/cygwin.h i386/cygwin-stdint.h"
>         tm_file="${tm_file} mingw/winnt.h"
> +       tm_file="${tm_file} mingw/winnt-dll.h"
>         xm_file=i386/xm-cygwin.h
>         tmake_file="${tmake_file} mingw/t-cygming t-slibgcc"
>         target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
> +       target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
>         extra_options="${extra_options} mingw/cygming.opt i386/cygwin.opt"
> -       extra_objs="${extra_objs} winnt.o winnt-stubs.o"
> +       extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
>         c_target_objs="${c_target_objs} msformat-c.o"
>         cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
>         d_target_objs="${d_target_objs} cygwin-d.o"
> @@ -2196,11 +2198,13 @@ x86_64-*-cygwin*)
>         need_64bit_isa=yes
>         tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygming.h i386/cygwin.h i386/cygwin-w64.h i386/cygwin-stdint.h"
>         tm_file="${tm_file} mingw/winnt.h"
> +       tm_file="${tm_file} mingw/winnt-dll.h"
>         xm_file=i386/xm-cygwin.h
>         tmake_file="${tmake_file} mingw/t-cygming t-slibgcc"
>         target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
> +       target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
>         extra_options="${extra_options} mingw/cygming.opt i386/cygwin.opt"
> -       extra_objs="${extra_objs} winnt.o winnt-stubs.o"
> +       extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
>         c_target_objs="${c_target_objs} msformat-c.o"
>         cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
>         d_target_objs="${d_target_objs} cygwin-d.o"
> @@ -2266,6 +2270,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
>         esac
>         tm_file="${tm_file} mingw/mingw-stdint.h"
>         tm_file="${tm_file} mingw/winnt.h"
> +       tm_file="${tm_file} mingw/winnt-dll.h"
>         tmake_file="${tmake_file} t-winnt mingw/t-cygming t-slibgcc"
>          case ${target} in
>                 x86_64-w64-*)
> @@ -2277,6 +2282,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
>         esac
>          native_system_header_dir=/mingw/include
>         target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
> +       target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
>         extra_options="${extra_options} mingw/cygming.opt mingw/mingw.opt"
>         case ${target} in
>                 *-w64-*)
> @@ -2285,7 +2291,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
>                 *)
>                         ;;
>         esac
> -       extra_objs="${extra_objs} winnt.o winnt-stubs.o"
> +       extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
>         c_target_objs="${c_target_objs} msformat-c.o"
>         cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
>         gas=yes
> diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
> index 98b375538e7..56945f00c11 100644
> --- a/gcc/config/i386/cygming.h
> +++ b/gcc/config/i386/cygming.h
> @@ -461,7 +461,7 @@ do {                                                \
>  #define TARGET_ASM_ASSEMBLE_VISIBILITY i386_pe_assemble_visibility
>
>  #undef SUB_TARGET_RECORD_STUB
> -#define SUB_TARGET_RECORD_STUB i386_pe_record_stub
> +#define SUB_TARGET_RECORD_STUB mingw_pe_record_stub
>
>  /* Static stack checking is supported by means of probes.  */
>  #define STACK_CHECK_STATIC_BUILTIN 1
> @@ -469,3 +469,6 @@ do {                                                \
>  #ifndef HAVE_GAS_ALIGNED_COMM
>  # define HAVE_GAS_ALIGNED_COMM 0
>  #endif
> +
> +#undef GOT_ALIAS_SET
> +#define GOT_ALIAS_SET mingw_GOT_alias_set ()
> diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
> index d1d396a8713..e09c97f1520 100644
> --- a/gcc/config/i386/i386-expand.cc
> +++ b/gcc/config/i386/i386-expand.cc
> @@ -408,10 +408,11 @@ ix86_expand_move (machine_mode mode, rtx operands[])
>                                  : UNSPEC_GOT));
>           op1 = gen_rtx_CONST (Pmode, op1);
>           op1 = gen_const_mem (Pmode, op1);
> -         set_mem_alias_set (op1, ix86_GOT_alias_set ());
> +         set_mem_alias_set (op1, GOT_ALIAS_SET);
>         }
>        else
>         {
> +#if TARGET_PECOFF
>           tmp = legitimize_pe_coff_symbol (op1, addend != NULL_RTX);
>           if (tmp)
>             {
> @@ -424,6 +425,7 @@ ix86_expand_move (machine_mode mode, rtx operands[])
>               op1 = operands[1];
>               break;
>             }
> +#endif
>         }
>
>        if (addend)
> diff --git a/gcc/config/i386/i386-expand.h b/gcc/config/i386/i386-expand.h
> index 65cb49c921c..5e02df1706d 100644
> --- a/gcc/config/i386/i386-expand.h
> +++ b/gcc/config/i386/i386-expand.h
> @@ -34,9 +34,7 @@ struct expand_vec_perm_d
>  };
>
>  rtx legitimize_tls_address (rtx x, enum tls_model model, bool for_mov);
> -alias_set_type ix86_GOT_alias_set (void);
>  rtx legitimize_pic_address (rtx orig, rtx reg);
> -rtx legitimize_pe_coff_symbol (rtx addr, bool inreg);
>
>  bool insn_defines_reg (unsigned int regno1, unsigned int regno2,
>                        rtx_insn *insn);
> diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
> index 65ef3d77c3a..b2e9b9e0d3d 100644
> --- a/gcc/config/i386/i386-protos.h
> +++ b/gcc/config/i386/i386-protos.h
> @@ -318,7 +318,6 @@ 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_record_stub (const char *);
>
>  extern void i386_pe_seh_init (FILE *);
>  extern void i386_pe_seh_end_prologue (FILE *);
> diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> index 4126ab24a79..cf998252340 100644
> --- a/gcc/config/i386/i386.cc
> +++ b/gcc/config/i386/i386.cc
> @@ -11244,20 +11244,6 @@ ix86_cannot_force_const_mem (machine_mode mode, rtx x)
>    return !ix86_legitimate_constant_p (mode, x);
>  }
>
> -/*  Nonzero if the symbol is marked as dllimport, or as stub-variable,
> -    otherwise zero.  */
> -
> -static bool
> -is_imported_p (rtx x)
> -{
> -  if (!TARGET_DLLIMPORT_DECL_ATTRIBUTES
> -      || GET_CODE (x) != SYMBOL_REF)
> -    return false;
> -
> -  return SYMBOL_REF_DLLIMPORT_P (x) || SYMBOL_REF_STUBVAR_P (x);
> -}
> -
> -
>  /* Nonzero if the constant value X is a legitimate general operand
>     when generating PIC code.  It is given that flag_pic is on and
>     that X satisfies CONSTANT_P.  */
> @@ -11359,8 +11345,10 @@ legitimate_pic_address_disp_p (rtx disp)
>
>           if (TARGET_PECOFF)
>             {
> +#if TARGET_PECOFF
>               if (is_imported_p (op0))
>                 return true;
> +#endif
>
>               if (SYMBOL_REF_FAR_ADDR_P (op0) || !SYMBOL_REF_LOCAL_P (op0))
>                 break;
> @@ -11836,16 +11824,6 @@ constant_address_p (rtx x)
>    return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
>  }
>
>
> -/* Return a unique alias set for the GOT.  */
> -
> -alias_set_type
> -ix86_GOT_alias_set (void)
> -{
> -  static alias_set_type set = -1;
> -  if (set == -1)
> -    set = new_alias_set ();
> -  return set;
> -}
>
>  /* Return a legitimate reference for ORIG (an address) using the
>     register REG.  If REG is 0, a new pseudo is generated.
> @@ -11883,9 +11861,11 @@ legitimize_pic_address (rtx orig, rtx reg)
>
>    if (TARGET_64BIT && TARGET_DLLIMPORT_DECL_ATTRIBUTES)
>      {
> +#if TARGET_PECOFF
>        rtx tmp = legitimize_pe_coff_symbol (addr, true);
>        if (tmp)
>          return tmp;
> +#endif
>      }
>
>    if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
> @@ -11928,9 +11908,11 @@ legitimize_pic_address (rtx orig, rtx reg)
>               on VxWorks, see gotoff_operand.  */
>            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
>      {
> +#if TARGET_PECOFF
>        rtx tmp = legitimize_pe_coff_symbol (addr, true);
>        if (tmp)
>          return tmp;
> +#endif
>
>        /* For x64 PE-COFF there is no GOT table,
>          so we use address directly.  */
> @@ -11945,7 +11927,7 @@ legitimize_pic_address (rtx orig, rtx reg)
>                                     UNSPEC_GOTPCREL);
>           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
>           new_rtx = gen_const_mem (Pmode, new_rtx);
> -         set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
> +         set_mem_alias_set (new_rtx, GOT_ALIAS_SET);
>         }
>        else
>         {
> @@ -11967,7 +11949,7 @@ legitimize_pic_address (rtx orig, rtx reg)
>             new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
>
>           new_rtx = gen_const_mem (Pmode, new_rtx);
> -         set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
> +         set_mem_alias_set (new_rtx, GOT_ALIAS_SET);
>         }
>
>        new_rtx = copy_to_suggested_reg (new_rtx, reg, Pmode);
> @@ -12344,7 +12326,7 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
>        if (pic)
>         off = gen_rtx_PLUS (tp_mode, pic, off);
>        off = gen_const_mem (tp_mode, off);
> -      set_mem_alias_set (off, ix86_GOT_alias_set ());
> +      set_mem_alias_set (off, GOT_ALIAS_SET);
>
>        if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
>         {
> @@ -12503,173 +12485,6 @@ ix86_rewrite_tls_address (rtx pattern)
>    return pattern;
>  }
>
> -/* Create or return the unique __imp_DECL dllimport symbol corresponding
> -   to symbol DECL if BEIMPORT is true.  Otherwise create or return the
> -   unique refptr-DECL symbol corresponding to symbol DECL.  */
> -
> -struct dllimport_hasher : ggc_cache_ptr_hash<tree_map>
> -{
> -  static inline hashval_t hash (tree_map *m) { return m->hash; }
> -  static inline bool
> -  equal (tree_map *a, tree_map *b)
> -  {
> -    return a->base.from == b->base.from;
> -  }
> -
> -  static int
> -  keep_cache_entry (tree_map *&m)
> -  {
> -    return ggc_marked_p (m->base.from);
> -  }
> -};
> -
> -static GTY((cache)) hash_table<dllimport_hasher> *dllimport_map;
> -
> -static tree
> -get_dllimport_decl (tree decl, bool beimport)
> -{
> -  struct tree_map *h, in;
> -  const char *name;
> -  const char *prefix;
> -  size_t namelen, prefixlen;
> -  char *imp_name;
> -  tree to;
> -  rtx rtl;
> -
> -  if (!dllimport_map)
> -    dllimport_map = hash_table<dllimport_hasher>::create_ggc (512);
> -
> -  in.hash = htab_hash_pointer (decl);
> -  in.base.from = decl;
> -  tree_map **loc = dllimport_map->find_slot_with_hash (&in, in.hash, INSERT);
> -  h = *loc;
> -  if (h)
> -    return h->to;
> -
> -  *loc = h = ggc_alloc<tree_map> ();
> -  h->hash = in.hash;
> -  h->base.from = decl;
> -  h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
> -                          VAR_DECL, NULL, ptr_type_node);
> -  DECL_ARTIFICIAL (to) = 1;
> -  DECL_IGNORED_P (to) = 1;
> -  DECL_EXTERNAL (to) = 1;
> -  TREE_READONLY (to) = 1;
> -
> -  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
> -  name = targetm.strip_name_encoding (name);
> -  if (beimport)
> -    prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
> -      ? "*__imp_" : "*__imp__";
> -  else
> -    prefix = user_label_prefix[0] == 0 ? "*.refptr." : "*refptr.";
> -  namelen = strlen (name);
> -  prefixlen = strlen (prefix);
> -  imp_name = (char *) alloca (namelen + prefixlen + 1);
> -  memcpy (imp_name, prefix, prefixlen);
> -  memcpy (imp_name + prefixlen, name, namelen + 1);
> -
> -  name = ggc_alloc_string (imp_name, namelen + prefixlen);
> -  rtl = gen_rtx_SYMBOL_REF (Pmode, name);
> -  SET_SYMBOL_REF_DECL (rtl, to);
> -  SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_STUBVAR;
> -  if (!beimport)
> -    {
> -      SYMBOL_REF_FLAGS (rtl) |= SYMBOL_FLAG_EXTERNAL;
> -#ifdef SUB_TARGET_RECORD_STUB
> -      SUB_TARGET_RECORD_STUB (name);
> -#endif
> -    }
> -
> -  rtl = gen_const_mem (Pmode, rtl);
> -  set_mem_alias_set (rtl, ix86_GOT_alias_set ());
> -
> -  SET_DECL_RTL (to, rtl);
> -  SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
> -
> -  return to;
> -}
> -
> -/* Expand SYMBOL into its corresponding far-address symbol.
> -   WANT_REG is true if we require the result be a register.  */
> -
> -static rtx
> -legitimize_pe_coff_extern_decl (rtx symbol, bool want_reg)
> -{
> -  tree imp_decl;
> -  rtx x;
> -
> -  gcc_assert (SYMBOL_REF_DECL (symbol));
> -  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), false);
> -
> -  x = DECL_RTL (imp_decl);
> -  if (want_reg)
> -    x = force_reg (Pmode, x);
> -  return x;
> -}
> -
> -/* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
> -   true if we require the result be a register.  */
> -
> -static rtx
> -legitimize_dllimport_symbol (rtx symbol, bool want_reg)
> -{
> -  tree imp_decl;
> -  rtx x;
> -
> -  gcc_assert (SYMBOL_REF_DECL (symbol));
> -  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), true);
> -
> -  x = DECL_RTL (imp_decl);
> -  if (want_reg)
> -    x = force_reg (Pmode, x);
> -  return x;
> -}
> -
> -/* Expand SYMBOL into its corresponding dllimport or refptr symbol.  WANT_REG
> -   is true if we require the result be a register.  */
> -
> -rtx
> -legitimize_pe_coff_symbol (rtx addr, bool inreg)
> -{
> -  if (!TARGET_PECOFF)
> -    return NULL_RTX;
> -
> -  if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
> -    {
> -      if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
> -       return legitimize_dllimport_symbol (addr, inreg);
> -      if (GET_CODE (addr) == CONST
> -         && GET_CODE (XEXP (addr, 0)) == PLUS
> -         && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
> -         && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
> -       {
> -         rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), inreg);
> -         return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
> -       }
> -    }
> -
> -  if (ix86_cmodel != CM_LARGE_PIC && ix86_cmodel != CM_MEDIUM_PIC)
> -    return NULL_RTX;
> -  if (GET_CODE (addr) == SYMBOL_REF
> -      && !is_imported_p (addr)
> -      && SYMBOL_REF_EXTERNAL_P (addr)
> -      && SYMBOL_REF_DECL (addr))
> -    return legitimize_pe_coff_extern_decl (addr, inreg);
> -
> -  if (GET_CODE (addr) == CONST
> -      && GET_CODE (XEXP (addr, 0)) == PLUS
> -      && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
> -      && !is_imported_p (XEXP (XEXP (addr, 0), 0))
> -      && SYMBOL_REF_EXTERNAL_P (XEXP (XEXP (addr, 0), 0))
> -      && SYMBOL_REF_DECL (XEXP (XEXP (addr, 0), 0)))
> -    {
> -      rtx t = legitimize_pe_coff_extern_decl (XEXP (XEXP (addr, 0), 0), inreg);
> -      return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
> -    }
> -  return NULL_RTX;
> -}
> -
>  /* Try machine-dependent ways of modifying an illegitimate address
>     to be legitimate.  If we find one, return the new, valid address.
>     This macro is used in only one place: `memory_address' in explow.cc.
> @@ -12709,9 +12524,11 @@ ix86_legitimize_address (rtx x, rtx, machine_mode mode)
>
>    if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
>      {
> +#if TARGET_PECOFF
>        rtx tmp = legitimize_pe_coff_symbol (x, true);
>        if (tmp)
>          return tmp;
> +#endif
>      }
>
>    if (flag_pic && SYMBOLIC_CONST (x))
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index 7051c6c13e4..d9f02f66518 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -2262,6 +2262,8 @@ extern int const svr4_debugger_register_map[FIRST_PSEUDO_REGISTER];
>  /* Which processor to tune code generation for.  These must be in sync
>     with processor_cost_table in i386-options.cc.  */
>
> +#define GOT_ALIAS_SET -1
> +
>  enum processor_type
>  {
>    PROCESSOR_GENERIC = 0,
> diff --git a/gcc/config/mingw/t-cygming b/gcc/config/mingw/t-cygming
> index f5de941c8e5..3dd9116d92b 100644
> --- a/gcc/config/mingw/t-cygming
> +++ b/gcc/config/mingw/t-cygming
> @@ -33,6 +33,12 @@ winnt-cxx.o: $(srcdir)/config/mingw/winnt-cxx.cc $(CONFIG_H) $(SYSTEM_H) \
>         $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
>         $(srcdir)/config/mingw/winnt-cxx.cc
>
> +winnt-dll.o: $(srcdir)/config/mingw/winnt-dll.cc $(CONFIG_H) $(SYSTEM_H) \
> +  coretypes.h \
> +  $(TM_H) $(TREE_H) flags.h \
> +  $(TM_P_H) $(HASH_TABLE_H) $(GGC_H)
> +       $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
> +       $(srcdir)/config/mingw/winnt-dll.cc
>
>  winnt-stubs.o: $(srcdir)/config/mingw/winnt-stubs.cc $(CONFIG_H) $(SYSTEM_H) \
>    coretypes.h \
> diff --git a/gcc/config/mingw/winnt-dll.cc b/gcc/config/mingw/winnt-dll.cc
> new file mode 100644
> index 00000000000..1354402a959
> --- /dev/null
> +++ b/gcc/config/mingw/winnt-dll.cc
> @@ -0,0 +1,231 @@
> +/* Expand a SYMBOL into its corresponding dllimport, far-address,
> +or refptr symbol.
> +Copyright (C) 1988-2024 Free Software Foundation, Inc.
> +
> +GCC is free software; you can redistribute it and/or modify it under
> +the terms of the GNU General Public License as published by the Free
> +Software Foundation; either version 3, or (at your option) any later
> +version.
> +
> +GCC is distributed in the hope that it will be useful, but WITHOUT ANY
> +WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> +for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with GCC; see the file COPYING3.  If not see
> +http://www.gnu.org/licenses/.  */
> +
> +#include "config.h"
> +#include "system.h"
> +#include "coretypes.h"
> +#include "backend.h"
> +#include "target.h"
> +#include "rtl.h"
> +#include "tree.h"
> +#include "memmodel.h"
> +#include "stringpool.h"
> +#include "emit-rtl.h"
> +#include "alias.h"
> +#include "varasm.h"
> +#include "output.h"
> +#include "explow.h"
> +#include "winnt.h"
> +
> +/* Create or return the unique __imp_DECL dllimport symbol corresponding
> +   to symbol DECL if BEIMPORT is true.  Otherwise create or return the
> +   unique refptr-DECL symbol corresponding to symbol DECL.  */
> +
> +struct dllimport_hasher : ggc_cache_ptr_hash<tree_map>
> +{
> +  static inline hashval_t hash (tree_map *m)
> +  {
> +    return m->hash;
> +  }
> +
> +  static inline bool
> +  equal (tree_map *a, tree_map *b)
> +  {
> +    return a->base.from == b->base.from;
> +  }
> +
> +  static int
> +  keep_cache_entry (tree_map *&m)
> +  {
> +    return ggc_marked_p (m->base.from);
> +  }
> +};
> +
> +static GTY ((cache)) hash_table<dllimport_hasher> *dllimport_map;
> +
> +/*  Nonzero if the symbol is marked as dllimport, or as stub-variable,
> +    otherwise zero.  */
> +
> +bool
> +is_imported_p (rtx x)
> +{
> +  if (!TARGET_DLLIMPORT_DECL_ATTRIBUTES
> +      || GET_CODE (x) != SYMBOL_REF)
> +    return false;
> +
> +  return SYMBOL_REF_DLLIMPORT_P (x) || SYMBOL_REF_STUBVAR_P (x);
> +}
> +
> +/* Return a unique alias set for the GOT.  */
> +
> +alias_set_type
> +mingw_GOT_alias_set (void)
> +{
> +  static alias_set_type set = -1;
> +  if (set == -1)
> +    set = new_alias_set ();
> +  return set;
> +}
> +
> +static tree
> +get_dllimport_decl (tree decl, bool beimport)
> +{
> +  struct tree_map *h, in;
> +  const char *name;
> +  const char *prefix;
> +  size_t namelen, prefixlen;
> +  char *imp_name;
> +  tree to;
> +  rtx rtl;
> +
> +  if (!dllimport_map)
> +    dllimport_map = hash_table<dllimport_hasher>::create_ggc (512);
> +
> +  in.hash = htab_hash_pointer (decl);
> +  in.base.from = decl;
> +  tree_map **loc = dllimport_map->find_slot_with_hash (&in, in.hash, INSERT);
> +  h = *loc;
> +  if (h)
> +    return h->to;
> +
> +  *loc = h = ggc_alloc<tree_map> ();
> +  h->hash = in.hash;
> +  h->base.from = decl;
> +  h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
> +                          VAR_DECL, NULL, ptr_type_node);
> +  DECL_ARTIFICIAL (to) = 1;
> +  DECL_IGNORED_P (to) = 1;
> +  DECL_EXTERNAL (to) = 1;
> +  TREE_READONLY (to) = 1;
> +
> +  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
> +  name = targetm.strip_name_encoding (name);
> +  if (beimport)
> +    prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
> +      ? "*__imp_" : "*__imp__";
> +  else
> +    prefix = user_label_prefix[0] == 0 ? "*.refptr." : "*refptr.";
> +  namelen = strlen (name);
> +  prefixlen = strlen (prefix);
> +  imp_name = (char *) alloca (namelen + prefixlen + 1);
> +  memcpy (imp_name, prefix, prefixlen);
> +  memcpy (imp_name + prefixlen, name, namelen + 1);
> +
> +  name = ggc_alloc_string (imp_name, namelen + prefixlen);
> +  rtl = gen_rtx_SYMBOL_REF (Pmode, name);
> +  SET_SYMBOL_REF_DECL (rtl, to);
> +  SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_STUBVAR;
> +  if (!beimport)
> +    {
> +      SYMBOL_REF_FLAGS (rtl) |= SYMBOL_FLAG_EXTERNAL;
> +#ifdef SUB_TARGET_RECORD_STUB
> +      SUB_TARGET_RECORD_STUB (name);
> +#endif
> +    }
> +
> +  rtl = gen_const_mem (Pmode, rtl);
> +  set_mem_alias_set (rtl, mingw_GOT_alias_set ());
> +
> +  SET_DECL_RTL (to, rtl);
> +  SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
> +
> +  return to;
> +}
> +
> +/* Expand SYMBOL into its corresponding far-address symbol.
> +   WANT_REG is true if we require the result be a register.  */
> +
> +static rtx
> +legitimize_pe_coff_extern_decl (rtx symbol, bool want_reg)
> +{
> +  tree imp_decl;
> +  rtx x;
> +
> +  gcc_assert (SYMBOL_REF_DECL (symbol));
> +  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), false);
> +
> +  x = DECL_RTL (imp_decl);
> +  if (want_reg)
> +    x = force_reg (Pmode, x);
> +  return x;
> +}
> +
> +/* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
> +   true if we require the result be a register.  */
> +
> +static rtx
> +legitimize_dllimport_symbol (rtx symbol, bool want_reg)
> +{
> +  tree imp_decl;
> +  rtx x;
> +
> +  gcc_assert (SYMBOL_REF_DECL (symbol));
> +  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), true);
> +
> +  x = DECL_RTL (imp_decl);
> +  if (want_reg)
> +    x = force_reg (Pmode, x);
> +  return x;
> +}
> +
> +/* Expand SYMBOL into its corresponding dllimport or refptr symbol.  WANT_REG
> +   is true if we require the result be a register.  */
> +
> +rtx
> +legitimize_pe_coff_symbol (rtx addr, bool inreg)
> +{
> +  if (!TARGET_PECOFF)
> +    return NULL_RTX;
> +
> +  if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
> +    {
> +      if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
> +       return legitimize_dllimport_symbol (addr, inreg);
> +      if (GET_CODE (addr) == CONST
> +         && GET_CODE (XEXP (addr, 0)) == PLUS
> +         && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
> +         && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
> +       {
> +         rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), inreg);
> +         return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
> +       }
> +    }
> +
> +  if (ix86_cmodel != CM_LARGE_PIC && ix86_cmodel != CM_MEDIUM_PIC)
> +    return NULL_RTX;
> +
> +  if (GET_CODE (addr) == SYMBOL_REF
> +      && !is_imported_p (addr)
> +      && SYMBOL_REF_EXTERNAL_P (addr)
> +      && SYMBOL_REF_DECL (addr))
> +    return legitimize_pe_coff_extern_decl (addr, inreg);
> +
> +  if (GET_CODE (addr) == CONST
> +      && GET_CODE (XEXP (addr, 0)) == PLUS
> +      && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
> +      && !is_imported_p (XEXP (XEXP (addr, 0), 0))
> +      && SYMBOL_REF_EXTERNAL_P (XEXP (XEXP (addr, 0), 0))
> +      && SYMBOL_REF_DECL (XEXP (XEXP (addr, 0), 0)))
> +    {
> +      rtx t = legitimize_pe_coff_extern_decl (XEXP (XEXP (addr, 0), 0), inreg);
> +      return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
> +    }
> +  return NULL_RTX;
> +}
> +
> +#include "gt-winnt-dll.h"
> \ No newline at end of file
> diff --git a/gcc/config/mingw/winnt-dll.h b/gcc/config/mingw/winnt-dll.h
> new file mode 100644
> index 00000000000..14ca743b69f
> --- /dev/null
> +++ b/gcc/config/mingw/winnt-dll.h
> @@ -0,0 +1,30 @@
> +/* Expand a SYMBOL into its corresponding dllimport, far-address,
> +or refptr symbol.
> +Copyright (C) 2024 Free Software Foundation, Inc.
> +
> +GCC is free software; you can redistribute it and/or modify it under
> +the terms of the GNU General Public License as published by the Free
> +Software Foundation; either version 3, or (at your option) any later
> +version.
> +
> +GCC is distributed in the hope that it will be useful, but WITHOUT ANY
> +WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> +for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with GCC; see the file COPYING3.  If not see
> +http://www.gnu.org/licenses/.  */
> +
> +#ifndef GCC_MINGW_WINNT_DLL_H
> +#define GCC_MINGW_WINNT_DLL_H
> +
> +#ifndef USED_FOR_TARGET
> +
> +extern bool is_imported_p (rtx x);
> +extern alias_set_type mingw_GOT_alias_set (void);
> +extern rtx legitimize_pe_coff_symbol (rtx addr, bool inreg);
> +
> +#endif /* not USED_FOR_TARGET.  */
> +
> +#endif /* GCC_MINGW_WINNT_DLL_H.  */
> diff --git a/gcc/config/mingw/winnt.cc b/gcc/config/mingw/winnt.cc
> index 2a4fc03fc56..9901576ade0 100644
> --- a/gcc/config/mingw/winnt.cc
> +++ b/gcc/config/mingw/winnt.cc
> @@ -672,7 +672,7 @@ mingw_pe_maybe_record_exported_symbol (tree decl, const char *name, int is_data)
>  }
>
>  void
> -i386_pe_record_stub (const char *name)
> +mingw_pe_record_stub (const char *name)
>  {
>    struct stub_list *p;
>
> diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h
> index d6202816e8f..74e454a13c8 100644
> --- a/gcc/config/mingw/winnt.h
> +++ b/gcc/config/mingw/winnt.h
> @@ -25,6 +25,7 @@ extern void mingw_pe_declare_function_type (FILE *file, const char *name,
>         int pub);
>  extern void mingw_pe_encode_section_info (tree, rtx, int);
>  extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
> +extern void mingw_pe_record_stub (const char *name);
>  extern unsigned int mingw_pe_section_type_flags (tree, const char *, int);
>  extern void mingw_pe_unique_section (tree, int);
>
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw
  2024-06-07  9:48 ` [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw Evgeny Karpov
  2024-06-07 11:11   ` Uros Bizjak
@ 2024-06-08 12:37   ` Evgeny Karpov
  2024-06-25 10:02   ` x86_64-gnu-linux bootstrap fail (was: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw) Tobias Burnus
  2 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-08 12:37 UTC (permalink / raw)
  To: gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

[-- Attachment #1: Type: text/plain, Size: 242 bytes --]

This patch makes changes to the i386.cc file, which contains the ASCII 0x0C character. However, this character was replaced by the mail client, and the patchwork could not validate the series. I am resubmitting the patch as an attachment.


[-- Attachment #2: v2-0002-Extract-ix86-dllimport-implementation-to-mingw.patch --]
[-- Type: application/octet-stream, Size: 26869 bytes --]

From 9f0d69368b97841e567bedcf798a9208f84cb726 Mon Sep 17 00:00:00 2001
From: Evgeny Karpov <eukarpov@gmail.com>
Date: Thu, 6 Jun 2024 22:38:35 +0200
Subject: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw

This patch extracts the ix86 implementation for expanding a SYMBOL
into its corresponding dllimport, far-address, or refptr symbol.
It will be reused in the aarch64-w64-mingw32 target.
The implementation is copied as is from i386/i386.cc with
minor changes to follow to the code style.

Also this patch replaces the original DLL import/export
implementation in ix86 with mingw.

gcc/ChangeLog:

	* config.gcc: Add winnt-dll.o, which contains the DLL
	import/export implementation.
	* config/i386/cygming.h (SUB_TARGET_RECORD_STUB): Remove the
	old implementation. Rename the required function to MinGW.
	Use MinGW implementation for COFF and nothing otherwise.
	(GOT_ALIAS_SET): Likewise.
	* config/i386/i386-expand.cc (ix86_expand_move): Likewise.
	* config/i386/i386-expand.h (ix86_GOT_alias_set): Likewise.
	(legitimize_pe_coff_symbol): Likewise.
	* config/i386/i386-protos.h (i386_pe_record_stub): Likewise.
	* config/i386/i386.cc (is_imported_p): Likewise.
	(legitimate_pic_address_disp_p): Likewise.
	(ix86_GOT_alias_set): Likewise.
	(legitimize_pic_address): Likewise.
	(legitimize_tls_address): Likewise.
	(struct dllimport_hasher): Likewise.
	(GTY): Likewise.
	(get_dllimport_decl): Likewise.
	(legitimize_pe_coff_extern_decl): Likewise.
	(legitimize_dllimport_symbol): Likewise.
	(legitimize_pe_coff_symbol): Likewise.
	(ix86_legitimize_address): Likewise.
	* config/i386/i386.h (GOT_ALIAS_SET): Likewise.
	* config/mingw/winnt.cc (i386_pe_record_stub): Likewise.
	(mingw_pe_record_stub): Likewise.
	* config/mingw/winnt.h (mingw_pe_record_stub): Likewise.
	* config/mingw/t-cygming: Add the winnt-dll.o compilation.
	* config/mingw/winnt-dll.cc: New file.
	* config/mingw/winnt-dll.h: New file.
---
 gcc/config.gcc                 |  12 +-
 gcc/config/i386/cygming.h      |   5 +-
 gcc/config/i386/i386-expand.cc |   4 +-
 gcc/config/i386/i386-expand.h  |   2 -
 gcc/config/i386/i386-protos.h  |   1 -
 gcc/config/i386/i386.cc        | 205 ++---------------------------
 gcc/config/i386/i386.h         |   2 +
 gcc/config/mingw/t-cygming     |   6 +
 gcc/config/mingw/winnt-dll.cc  | 231 +++++++++++++++++++++++++++++++++
 gcc/config/mingw/winnt-dll.h   |  30 +++++
 gcc/config/mingw/winnt.cc      |   2 +-
 gcc/config/mingw/winnt.h       |   1 +
 12 files changed, 298 insertions(+), 203 deletions(-)
 create mode 100644 gcc/config/mingw/winnt-dll.cc
 create mode 100644 gcc/config/mingw/winnt-dll.h

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 553a310f4bd..d053b98efa8 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -2177,11 +2177,13 @@ i[4567]86-wrs-vxworks*|x86_64-wrs-vxworks7*)
 i[34567]86-*-cygwin*)
 	tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygming.h i386/cygwin.h i386/cygwin-stdint.h"
 	tm_file="${tm_file} mingw/winnt.h"
+	tm_file="${tm_file} mingw/winnt-dll.h"
 	xm_file=i386/xm-cygwin.h
 	tmake_file="${tmake_file} mingw/t-cygming t-slibgcc"
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
+	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
 	extra_options="${extra_options} mingw/cygming.opt i386/cygwin.opt"
-	extra_objs="${extra_objs} winnt.o winnt-stubs.o"
+	extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
 	c_target_objs="${c_target_objs} msformat-c.o"
 	cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
 	d_target_objs="${d_target_objs} cygwin-d.o"
@@ -2196,11 +2198,13 @@ x86_64-*-cygwin*)
 	need_64bit_isa=yes
 	tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygming.h i386/cygwin.h i386/cygwin-w64.h i386/cygwin-stdint.h"
 	tm_file="${tm_file} mingw/winnt.h"
+	tm_file="${tm_file} mingw/winnt-dll.h"
 	xm_file=i386/xm-cygwin.h
 	tmake_file="${tmake_file} mingw/t-cygming t-slibgcc"
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
+	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
 	extra_options="${extra_options} mingw/cygming.opt i386/cygwin.opt"
-	extra_objs="${extra_objs} winnt.o winnt-stubs.o"
+	extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
 	c_target_objs="${c_target_objs} msformat-c.o"
 	cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
 	d_target_objs="${d_target_objs} cygwin-d.o"
@@ -2266,6 +2270,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
 	esac
 	tm_file="${tm_file} mingw/mingw-stdint.h"
 	tm_file="${tm_file} mingw/winnt.h"
+	tm_file="${tm_file} mingw/winnt-dll.h"
 	tmake_file="${tmake_file} t-winnt mingw/t-cygming t-slibgcc"
         case ${target} in
                x86_64-w64-*)
@@ -2277,6 +2282,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
 	esac
         native_system_header_dir=/mingw/include
 	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt.cc"
+	target_gtfiles="$target_gtfiles \$(srcdir)/config/mingw/winnt-dll.cc"
 	extra_options="${extra_options} mingw/cygming.opt mingw/mingw.opt"
 	case ${target} in
 		*-w64-*)
@@ -2285,7 +2291,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
 		*)
 			;;
 	esac
-	extra_objs="${extra_objs} winnt.o winnt-stubs.o"
+	extra_objs="${extra_objs} winnt.o winnt-stubs.o winnt-dll.o"
 	c_target_objs="${c_target_objs} msformat-c.o"
 	cxx_target_objs="${cxx_target_objs} winnt-cxx.o msformat-c.o"
 	gas=yes
diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
index 98b375538e7..56945f00c11 100644
--- a/gcc/config/i386/cygming.h
+++ b/gcc/config/i386/cygming.h
@@ -461,7 +461,7 @@ do {						\
 #define TARGET_ASM_ASSEMBLE_VISIBILITY i386_pe_assemble_visibility
 
 #undef SUB_TARGET_RECORD_STUB
-#define SUB_TARGET_RECORD_STUB i386_pe_record_stub
+#define SUB_TARGET_RECORD_STUB mingw_pe_record_stub
 
 /* Static stack checking is supported by means of probes.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
@@ -469,3 +469,6 @@ do {						\
 #ifndef HAVE_GAS_ALIGNED_COMM
 # define HAVE_GAS_ALIGNED_COMM 0
 #endif
+
+#undef GOT_ALIAS_SET
+#define GOT_ALIAS_SET mingw_GOT_alias_set ()
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index d1d396a8713..e09c97f1520 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -408,10 +408,11 @@ ix86_expand_move (machine_mode mode, rtx operands[])
 				 : UNSPEC_GOT));
 	  op1 = gen_rtx_CONST (Pmode, op1);
 	  op1 = gen_const_mem (Pmode, op1);
-	  set_mem_alias_set (op1, ix86_GOT_alias_set ());
+	  set_mem_alias_set (op1, GOT_ALIAS_SET);
 	}
       else
 	{
+#if TARGET_PECOFF
 	  tmp = legitimize_pe_coff_symbol (op1, addend != NULL_RTX);
 	  if (tmp)
 	    {
@@ -424,6 +425,7 @@ ix86_expand_move (machine_mode mode, rtx operands[])
 	      op1 = operands[1];
 	      break;
 	    }
+#endif
 	}
 
       if (addend)
diff --git a/gcc/config/i386/i386-expand.h b/gcc/config/i386/i386-expand.h
index 65cb49c921c..5e02df1706d 100644
--- a/gcc/config/i386/i386-expand.h
+++ b/gcc/config/i386/i386-expand.h
@@ -34,9 +34,7 @@ struct expand_vec_perm_d
 };
 
 rtx legitimize_tls_address (rtx x, enum tls_model model, bool for_mov);
-alias_set_type ix86_GOT_alias_set (void);
 rtx legitimize_pic_address (rtx orig, rtx reg);
-rtx legitimize_pe_coff_symbol (rtx addr, bool inreg);
 
 bool insn_defines_reg (unsigned int regno1, unsigned int regno2,
 		       rtx_insn *insn);
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 65ef3d77c3a..b2e9b9e0d3d 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -318,7 +318,6 @@ 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_record_stub (const char *);
 
 extern void i386_pe_seh_init (FILE *);
 extern void i386_pe_seh_end_prologue (FILE *);
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 4126ab24a79..cf998252340 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -11244,20 +11244,6 @@ ix86_cannot_force_const_mem (machine_mode mode, rtx x)
   return !ix86_legitimate_constant_p (mode, x);
 }
 
-/*  Nonzero if the symbol is marked as dllimport, or as stub-variable,
-    otherwise zero.  */
-
-static bool
-is_imported_p (rtx x)
-{
-  if (!TARGET_DLLIMPORT_DECL_ATTRIBUTES
-      || GET_CODE (x) != SYMBOL_REF)
-    return false;
-
-  return SYMBOL_REF_DLLIMPORT_P (x) || SYMBOL_REF_STUBVAR_P (x);
-}
-
-
 /* Nonzero if the constant value X is a legitimate general operand
    when generating PIC code.  It is given that flag_pic is on and
    that X satisfies CONSTANT_P.  */
@@ -11359,8 +11345,10 @@ legitimate_pic_address_disp_p (rtx disp)
 
 	  if (TARGET_PECOFF)
 	    {
+#if TARGET_PECOFF
 	      if (is_imported_p (op0))
 		return true;
+#endif
 
 	      if (SYMBOL_REF_FAR_ADDR_P (op0) || !SYMBOL_REF_LOCAL_P (op0))
 		break;
@@ -11836,16 +11824,6 @@ constant_address_p (rtx x)
   return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
 }
 \f
-/* Return a unique alias set for the GOT.  */
-
-alias_set_type
-ix86_GOT_alias_set (void)
-{
-  static alias_set_type set = -1;
-  if (set == -1)
-    set = new_alias_set ();
-  return set;
-}
 
 /* Return a legitimate reference for ORIG (an address) using the
    register REG.  If REG is 0, a new pseudo is generated.
@@ -11883,9 +11861,11 @@ legitimize_pic_address (rtx orig, rtx reg)
 
   if (TARGET_64BIT && TARGET_DLLIMPORT_DECL_ATTRIBUTES)
     {
+#if TARGET_PECOFF
       rtx tmp = legitimize_pe_coff_symbol (addr, true);
       if (tmp)
         return tmp;
+#endif
     }
 
   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
@@ -11928,9 +11908,11 @@ legitimize_pic_address (rtx orig, rtx reg)
 	      on VxWorks, see gotoff_operand.  */
 	   || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
     {
+#if TARGET_PECOFF
       rtx tmp = legitimize_pe_coff_symbol (addr, true);
       if (tmp)
         return tmp;
+#endif
 
       /* For x64 PE-COFF there is no GOT table,
 	 so we use address directly.  */
@@ -11945,7 +11927,7 @@ legitimize_pic_address (rtx orig, rtx reg)
 				    UNSPEC_GOTPCREL);
 	  new_rtx = gen_rtx_CONST (Pmode, new_rtx);
 	  new_rtx = gen_const_mem (Pmode, new_rtx);
-	  set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
+	  set_mem_alias_set (new_rtx, GOT_ALIAS_SET);
 	}
       else
 	{
@@ -11967,7 +11949,7 @@ legitimize_pic_address (rtx orig, rtx reg)
 	    new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
 
 	  new_rtx = gen_const_mem (Pmode, new_rtx);
-	  set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
+	  set_mem_alias_set (new_rtx, GOT_ALIAS_SET);
 	}
 
       new_rtx = copy_to_suggested_reg (new_rtx, reg, Pmode);
@@ -12344,7 +12326,7 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
       if (pic)
 	off = gen_rtx_PLUS (tp_mode, pic, off);
       off = gen_const_mem (tp_mode, off);
-      set_mem_alias_set (off, ix86_GOT_alias_set ());
+      set_mem_alias_set (off, GOT_ALIAS_SET);
 
       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
 	{
@@ -12503,173 +12485,6 @@ ix86_rewrite_tls_address (rtx pattern)
   return pattern;
 }
 
-/* Create or return the unique __imp_DECL dllimport symbol corresponding
-   to symbol DECL if BEIMPORT is true.  Otherwise create or return the
-   unique refptr-DECL symbol corresponding to symbol DECL.  */
-
-struct dllimport_hasher : ggc_cache_ptr_hash<tree_map>
-{
-  static inline hashval_t hash (tree_map *m) { return m->hash; }
-  static inline bool
-  equal (tree_map *a, tree_map *b)
-  {
-    return a->base.from == b->base.from;
-  }
-
-  static int
-  keep_cache_entry (tree_map *&m)
-  {
-    return ggc_marked_p (m->base.from);
-  }
-};
-
-static GTY((cache)) hash_table<dllimport_hasher> *dllimport_map;
-
-static tree
-get_dllimport_decl (tree decl, bool beimport)
-{
-  struct tree_map *h, in;
-  const char *name;
-  const char *prefix;
-  size_t namelen, prefixlen;
-  char *imp_name;
-  tree to;
-  rtx rtl;
-
-  if (!dllimport_map)
-    dllimport_map = hash_table<dllimport_hasher>::create_ggc (512);
-
-  in.hash = htab_hash_pointer (decl);
-  in.base.from = decl;
-  tree_map **loc = dllimport_map->find_slot_with_hash (&in, in.hash, INSERT);
-  h = *loc;
-  if (h)
-    return h->to;
-
-  *loc = h = ggc_alloc<tree_map> ();
-  h->hash = in.hash;
-  h->base.from = decl;
-  h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
-			   VAR_DECL, NULL, ptr_type_node);
-  DECL_ARTIFICIAL (to) = 1;
-  DECL_IGNORED_P (to) = 1;
-  DECL_EXTERNAL (to) = 1;
-  TREE_READONLY (to) = 1;
-
-  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
-  name = targetm.strip_name_encoding (name);
-  if (beimport)
-    prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
-      ? "*__imp_" : "*__imp__";
-  else
-    prefix = user_label_prefix[0] == 0 ? "*.refptr." : "*refptr.";
-  namelen = strlen (name);
-  prefixlen = strlen (prefix);
-  imp_name = (char *) alloca (namelen + prefixlen + 1);
-  memcpy (imp_name, prefix, prefixlen);
-  memcpy (imp_name + prefixlen, name, namelen + 1);
-
-  name = ggc_alloc_string (imp_name, namelen + prefixlen);
-  rtl = gen_rtx_SYMBOL_REF (Pmode, name);
-  SET_SYMBOL_REF_DECL (rtl, to);
-  SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_STUBVAR;
-  if (!beimport)
-    {
-      SYMBOL_REF_FLAGS (rtl) |= SYMBOL_FLAG_EXTERNAL;
-#ifdef SUB_TARGET_RECORD_STUB
-      SUB_TARGET_RECORD_STUB (name);
-#endif
-    }      
-
-  rtl = gen_const_mem (Pmode, rtl);
-  set_mem_alias_set (rtl, ix86_GOT_alias_set ());
-
-  SET_DECL_RTL (to, rtl);
-  SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
-
-  return to;
-}
-
-/* Expand SYMBOL into its corresponding far-address symbol.
-   WANT_REG is true if we require the result be a register.  */
-
-static rtx
-legitimize_pe_coff_extern_decl (rtx symbol, bool want_reg)
-{
-  tree imp_decl;
-  rtx x;
-
-  gcc_assert (SYMBOL_REF_DECL (symbol));
-  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), false);
-
-  x = DECL_RTL (imp_decl);
-  if (want_reg)
-    x = force_reg (Pmode, x);
-  return x;
-}
-
-/* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
-   true if we require the result be a register.  */
-
-static rtx
-legitimize_dllimport_symbol (rtx symbol, bool want_reg)
-{
-  tree imp_decl;
-  rtx x;
-
-  gcc_assert (SYMBOL_REF_DECL (symbol));
-  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), true);
-
-  x = DECL_RTL (imp_decl);
-  if (want_reg)
-    x = force_reg (Pmode, x);
-  return x;
-}
-
-/* Expand SYMBOL into its corresponding dllimport or refptr symbol.  WANT_REG 
-   is true if we require the result be a register.  */
-
-rtx
-legitimize_pe_coff_symbol (rtx addr, bool inreg)
-{
-  if (!TARGET_PECOFF)
-    return NULL_RTX;
-
-  if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
-    {
-      if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
-	return legitimize_dllimport_symbol (addr, inreg);
-      if (GET_CODE (addr) == CONST
-	  && GET_CODE (XEXP (addr, 0)) == PLUS
-	  && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
-	  && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
-	{
-	  rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), inreg);
-	  return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
-	}
-    }
-
-  if (ix86_cmodel != CM_LARGE_PIC && ix86_cmodel != CM_MEDIUM_PIC)
-    return NULL_RTX;
-  if (GET_CODE (addr) == SYMBOL_REF
-      && !is_imported_p (addr)
-      && SYMBOL_REF_EXTERNAL_P (addr)
-      && SYMBOL_REF_DECL (addr))
-    return legitimize_pe_coff_extern_decl (addr, inreg);
-
-  if (GET_CODE (addr) == CONST
-      && GET_CODE (XEXP (addr, 0)) == PLUS
-      && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
-      && !is_imported_p (XEXP (XEXP (addr, 0), 0))
-      && SYMBOL_REF_EXTERNAL_P (XEXP (XEXP (addr, 0), 0))
-      && SYMBOL_REF_DECL (XEXP (XEXP (addr, 0), 0)))
-    {
-      rtx t = legitimize_pe_coff_extern_decl (XEXP (XEXP (addr, 0), 0), inreg);
-      return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
-    }
-  return NULL_RTX;
-}
-
 /* Try machine-dependent ways of modifying an illegitimate address
    to be legitimate.  If we find one, return the new, valid address.
    This macro is used in only one place: `memory_address' in explow.cc.
@@ -12709,9 +12524,11 @@ ix86_legitimize_address (rtx x, rtx, machine_mode mode)
 
   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
     {
+#if TARGET_PECOFF
       rtx tmp = legitimize_pe_coff_symbol (x, true);
       if (tmp)
         return tmp;
+#endif
     }
 
   if (flag_pic && SYMBOLIC_CONST (x))
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 7051c6c13e4..d9f02f66518 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2262,6 +2262,8 @@ extern int const svr4_debugger_register_map[FIRST_PSEUDO_REGISTER];
 /* Which processor to tune code generation for.  These must be in sync
    with processor_cost_table in i386-options.cc.  */
 
+#define GOT_ALIAS_SET -1
+
 enum processor_type
 {
   PROCESSOR_GENERIC = 0,
diff --git a/gcc/config/mingw/t-cygming b/gcc/config/mingw/t-cygming
index f5de941c8e5..3dd9116d92b 100644
--- a/gcc/config/mingw/t-cygming
+++ b/gcc/config/mingw/t-cygming
@@ -33,6 +33,12 @@ winnt-cxx.o: $(srcdir)/config/mingw/winnt-cxx.cc $(CONFIG_H) $(SYSTEM_H) \
 	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
 	$(srcdir)/config/mingw/winnt-cxx.cc
 
+winnt-dll.o: $(srcdir)/config/mingw/winnt-dll.cc $(CONFIG_H) $(SYSTEM_H) \
+  coretypes.h \
+  $(TM_H) $(TREE_H) flags.h \
+  $(TM_P_H) $(HASH_TABLE_H) $(GGC_H)
+	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+	$(srcdir)/config/mingw/winnt-dll.cc
 
 winnt-stubs.o: $(srcdir)/config/mingw/winnt-stubs.cc $(CONFIG_H) $(SYSTEM_H) \
   coretypes.h \
diff --git a/gcc/config/mingw/winnt-dll.cc b/gcc/config/mingw/winnt-dll.cc
new file mode 100644
index 00000000000..1354402a959
--- /dev/null
+++ b/gcc/config/mingw/winnt-dll.cc
@@ -0,0 +1,231 @@
+/* Expand a SYMBOL into its corresponding dllimport, far-address,
+or refptr symbol.
+Copyright (C) 1988-2024 Free Software Foundation, Inc.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+http://www.gnu.org/licenses/.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "backend.h"
+#include "target.h"
+#include "rtl.h"
+#include "tree.h"
+#include "memmodel.h"
+#include "stringpool.h"
+#include "emit-rtl.h"
+#include "alias.h"
+#include "varasm.h"
+#include "output.h"
+#include "explow.h"
+#include "winnt.h"
+
+/* Create or return the unique __imp_DECL dllimport symbol corresponding
+   to symbol DECL if BEIMPORT is true.  Otherwise create or return the
+   unique refptr-DECL symbol corresponding to symbol DECL.  */
+
+struct dllimport_hasher : ggc_cache_ptr_hash<tree_map>
+{
+  static inline hashval_t hash (tree_map *m)
+  {
+    return m->hash;
+  }
+
+  static inline bool
+  equal (tree_map *a, tree_map *b)
+  {
+    return a->base.from == b->base.from;
+  }
+
+  static int
+  keep_cache_entry (tree_map *&m)
+  {
+    return ggc_marked_p (m->base.from);
+  }
+};
+
+static GTY ((cache)) hash_table<dllimport_hasher> *dllimport_map;
+
+/*  Nonzero if the symbol is marked as dllimport, or as stub-variable,
+    otherwise zero.  */
+
+bool
+is_imported_p (rtx x)
+{
+  if (!TARGET_DLLIMPORT_DECL_ATTRIBUTES
+      || GET_CODE (x) != SYMBOL_REF)
+    return false;
+
+  return SYMBOL_REF_DLLIMPORT_P (x) || SYMBOL_REF_STUBVAR_P (x);
+}
+
+/* Return a unique alias set for the GOT.  */
+
+alias_set_type
+mingw_GOT_alias_set (void)
+{
+  static alias_set_type set = -1;
+  if (set == -1)
+    set = new_alias_set ();
+  return set;
+}
+
+static tree
+get_dllimport_decl (tree decl, bool beimport)
+{
+  struct tree_map *h, in;
+  const char *name;
+  const char *prefix;
+  size_t namelen, prefixlen;
+  char *imp_name;
+  tree to;
+  rtx rtl;
+
+  if (!dllimport_map)
+    dllimport_map = hash_table<dllimport_hasher>::create_ggc (512);
+
+  in.hash = htab_hash_pointer (decl);
+  in.base.from = decl;
+  tree_map **loc = dllimport_map->find_slot_with_hash (&in, in.hash, INSERT);
+  h = *loc;
+  if (h)
+    return h->to;
+
+  *loc = h = ggc_alloc<tree_map> ();
+  h->hash = in.hash;
+  h->base.from = decl;
+  h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
+			   VAR_DECL, NULL, ptr_type_node);
+  DECL_ARTIFICIAL (to) = 1;
+  DECL_IGNORED_P (to) = 1;
+  DECL_EXTERNAL (to) = 1;
+  TREE_READONLY (to) = 1;
+
+  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+  name = targetm.strip_name_encoding (name);
+  if (beimport)
+    prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
+      ? "*__imp_" : "*__imp__";
+  else
+    prefix = user_label_prefix[0] == 0 ? "*.refptr." : "*refptr.";
+  namelen = strlen (name);
+  prefixlen = strlen (prefix);
+  imp_name = (char *) alloca (namelen + prefixlen + 1);
+  memcpy (imp_name, prefix, prefixlen);
+  memcpy (imp_name + prefixlen, name, namelen + 1);
+
+  name = ggc_alloc_string (imp_name, namelen + prefixlen);
+  rtl = gen_rtx_SYMBOL_REF (Pmode, name);
+  SET_SYMBOL_REF_DECL (rtl, to);
+  SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_STUBVAR;
+  if (!beimport)
+    {
+      SYMBOL_REF_FLAGS (rtl) |= SYMBOL_FLAG_EXTERNAL;
+#ifdef SUB_TARGET_RECORD_STUB
+      SUB_TARGET_RECORD_STUB (name);
+#endif
+    }
+
+  rtl = gen_const_mem (Pmode, rtl);
+  set_mem_alias_set (rtl, mingw_GOT_alias_set ());
+
+  SET_DECL_RTL (to, rtl);
+  SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
+
+  return to;
+}
+
+/* Expand SYMBOL into its corresponding far-address symbol.
+   WANT_REG is true if we require the result be a register.  */
+
+static rtx
+legitimize_pe_coff_extern_decl (rtx symbol, bool want_reg)
+{
+  tree imp_decl;
+  rtx x;
+
+  gcc_assert (SYMBOL_REF_DECL (symbol));
+  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), false);
+
+  x = DECL_RTL (imp_decl);
+  if (want_reg)
+    x = force_reg (Pmode, x);
+  return x;
+}
+
+/* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
+   true if we require the result be a register.  */
+
+static rtx
+legitimize_dllimport_symbol (rtx symbol, bool want_reg)
+{
+  tree imp_decl;
+  rtx x;
+
+  gcc_assert (SYMBOL_REF_DECL (symbol));
+  imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol), true);
+
+  x = DECL_RTL (imp_decl);
+  if (want_reg)
+    x = force_reg (Pmode, x);
+  return x;
+}
+
+/* Expand SYMBOL into its corresponding dllimport or refptr symbol.  WANT_REG
+   is true if we require the result be a register.  */
+
+rtx
+legitimize_pe_coff_symbol (rtx addr, bool inreg)
+{
+  if (!TARGET_PECOFF)
+    return NULL_RTX;
+
+  if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
+    {
+      if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
+	return legitimize_dllimport_symbol (addr, inreg);
+      if (GET_CODE (addr) == CONST
+	  && GET_CODE (XEXP (addr, 0)) == PLUS
+	  && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
+	  && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
+	{
+	  rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), inreg);
+	  return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
+	}
+    }
+
+  if (ix86_cmodel != CM_LARGE_PIC && ix86_cmodel != CM_MEDIUM_PIC)
+    return NULL_RTX;
+
+  if (GET_CODE (addr) == SYMBOL_REF
+      && !is_imported_p (addr)
+      && SYMBOL_REF_EXTERNAL_P (addr)
+      && SYMBOL_REF_DECL (addr))
+    return legitimize_pe_coff_extern_decl (addr, inreg);
+
+  if (GET_CODE (addr) == CONST
+      && GET_CODE (XEXP (addr, 0)) == PLUS
+      && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
+      && !is_imported_p (XEXP (XEXP (addr, 0), 0))
+      && SYMBOL_REF_EXTERNAL_P (XEXP (XEXP (addr, 0), 0))
+      && SYMBOL_REF_DECL (XEXP (XEXP (addr, 0), 0)))
+    {
+      rtx t = legitimize_pe_coff_extern_decl (XEXP (XEXP (addr, 0), 0), inreg);
+      return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
+    }
+  return NULL_RTX;
+}
+
+#include "gt-winnt-dll.h"
\ No newline at end of file
diff --git a/gcc/config/mingw/winnt-dll.h b/gcc/config/mingw/winnt-dll.h
new file mode 100644
index 00000000000..14ca743b69f
--- /dev/null
+++ b/gcc/config/mingw/winnt-dll.h
@@ -0,0 +1,30 @@
+/* Expand a SYMBOL into its corresponding dllimport, far-address,
+or refptr symbol.
+Copyright (C) 2024 Free Software Foundation, Inc.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+http://www.gnu.org/licenses/.  */
+
+#ifndef GCC_MINGW_WINNT_DLL_H
+#define GCC_MINGW_WINNT_DLL_H
+
+#ifndef USED_FOR_TARGET
+
+extern bool is_imported_p (rtx x);
+extern alias_set_type mingw_GOT_alias_set (void);
+extern rtx legitimize_pe_coff_symbol (rtx addr, bool inreg);
+
+#endif /* not USED_FOR_TARGET.  */
+
+#endif /* GCC_MINGW_WINNT_DLL_H.  */
diff --git a/gcc/config/mingw/winnt.cc b/gcc/config/mingw/winnt.cc
index 2a4fc03fc56..9901576ade0 100644
--- a/gcc/config/mingw/winnt.cc
+++ b/gcc/config/mingw/winnt.cc
@@ -672,7 +672,7 @@ mingw_pe_maybe_record_exported_symbol (tree decl, const char *name, int is_data)
 }
 
 void
-i386_pe_record_stub (const char *name)
+mingw_pe_record_stub (const char *name)
 {
   struct stub_list *p;
 
diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h
index d6202816e8f..74e454a13c8 100644
--- a/gcc/config/mingw/winnt.h
+++ b/gcc/config/mingw/winnt.h
@@ -25,6 +25,7 @@ extern void mingw_pe_declare_function_type (FILE *file, const char *name,
 	int pub);
 extern void mingw_pe_encode_section_info (tree, rtx, int);
 extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
+extern void mingw_pe_record_stub (const char *name);
 extern unsigned int mingw_pe_section_type_flags (tree, const char *, int);
 extern void mingw_pe_unique_section (tree, int);
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 0/6] Add DLL import/export implementation to AArch64
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
                   ` (5 preceding siblings ...)
  2024-06-07  9:52 ` [PATCH v2 6/6] aarch64: Add DLL import/export to AArch64 target Evgeny Karpov
@ 2024-06-08 13:01 ` Evgeny Karpov
  2024-06-10  9:22 ` Evgeny Karpov
  2024-06-26 15:55 ` Andrew Pinski
  8 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-08 13:01 UTC (permalink / raw)
  To: gcc-patches

I am resubmitting the patch series without changes to the patchwork due to an issue with the mail client in the previous submission.
https://gcc.gnu.org/pipermail/gcc-patches/2024-June/653894.html
https://gcc.gnu.org/pipermail/gcc-patches/2024-June/653952.html

Regards,
Evgeny

Evgeny Karpov (6):
  Move mingw_* declarations to the mingw folder
  Extract ix86 dllimport implementation to mingw
  Rename functions for reuse in AArch64
  aarch64: Add selectany attribute handling
  Adjust DLL import/export implementation for AArch64
  aarch64: Add DLL import/export to AArch64 target

 gcc/config.gcc                      |  20 ++-
 gcc/config/aarch64/aarch64-protos.h |   5 -
 gcc/config/aarch64/aarch64.cc       |  42 ++++-
 gcc/config/aarch64/cygming.h        |  33 +++-
 gcc/config/i386/cygming.h           |  16 +-
 gcc/config/i386/i386-expand.cc      |   4 +-
 gcc/config/i386/i386-expand.h       |   2 -
 gcc/config/i386/i386-protos.h       |  10 --
 gcc/config/i386/i386.cc             | 205 ++----------------------
 gcc/config/i386/i386.h              |   2 +
 gcc/config/mingw/mingw32.h          |   2 +-
 gcc/config/mingw/t-cygming          |   6 +
 gcc/config/mingw/winnt-dll.cc       | 231 ++++++++++++++++++++++++++++
 gcc/config/mingw/winnt-dll.h        |  30 ++++
 gcc/config/mingw/winnt.cc           |  10 +-
 gcc/config/mingw/winnt.h            |  38 +++++
 16 files changed, 423 insertions(+), 233 deletions(-)
 create mode 100644 gcc/config/mingw/winnt-dll.cc
 create mode 100644 gcc/config/mingw/winnt-dll.h
 create mode 100644 gcc/config/mingw/winnt.h

-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 0/6] Add DLL import/export implementation to AArch64
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
                   ` (6 preceding siblings ...)
  2024-06-08 13:01 ` [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
@ 2024-06-10  9:22 ` Evgeny Karpov
  2024-06-26 15:55 ` Andrew Pinski
  8 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-10  9:22 UTC (permalink / raw)
  To: Evgeny Karpov, gcc-patches, richard.sandiford
  Cc: Richard Earnshaw (lists), Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

The patch series has been successfully verified by patchwork,
after resolving the issue with the mailing client.
https://patchwork.sourceware.org/project/gcc/list/?series=34865

The x86_64-w64-mingw32 build has been tested, and no regressions 
have been detected after applying the patch series.
https://github.com/Windows-on-ARM-Experiments/mingw-woarm64-build/actions/runs/9417869213

The patch series has been approved by the x64 and mingw maintainers. 

Richard, could we proceed with merging the patch series? Thanks.

Regards,
Evgeny

^ permalink raw reply	[flat|nested] 15+ messages in thread

* x86_64-gnu-linux bootstrap fail (was: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw)
  2024-06-07  9:48 ` [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw Evgeny Karpov
  2024-06-07 11:11   ` Uros Bizjak
  2024-06-08 12:37   ` Evgeny Karpov
@ 2024-06-25 10:02   ` Tobias Burnus
  2024-06-25 10:49     ` Evgeny Karpov
  2 siblings, 1 reply; 15+ messages in thread
From: Tobias Burnus @ 2024-06-25 10:02 UTC (permalink / raw)
  To: Evgeny Karpov, gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

Hi Evgeny,

I am not sure whether I have chosen the right email in the thread but:
a x86-64 GNU Linux build currently fails as follows.

At a glance, it seems to be sufficient to remove the prototype 
declaration in i386.cc.

Namely:

gcc/config/i386/i386.cc:107:12: error: 'rtx_def* 
legitimize_dllimport_symbol(rtx, bool)' declared 'static' but never 
defined [-Werror=unused-function]
   107 | static rtx legitimize_dllimport_symbol (rtx, bool);
       |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~

gcc/gcc/config/i386/i386.cc:108:12: error: 'rtx_def* 
legitimize_pe_coff_extern_decl(rtx, bool)' declared 'static' but never 
defined [-Werror=unused-function]
   108 | static rtx legitimize_pe_coff_extern_decl (rtx, bool);
       |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
^Cmake[3]: *** [Makefile:2556: i386.o] Interrupt

There is:

config/i386/i386.cc:static rtx legitimize_dllimport_symbol (rtx, bool);
config/mingw/winnt-dll.cc:legitimize_dllimport_symbol (rtx symbol, bool 
want_reg)
config/mingw/winnt-dll.cc:      return legitimize_dllimport_symbol 
(addr, inreg);
config/mingw/winnt-dll.cc:        rtx t = legitimize_dllimport_symbol 
(XEXP (XEXP (addr, 0), 0), inreg);


And:

config/i386/i386.cc:static rtx legitimize_pe_coff_extern_decl (rtx, bool);
config/mingw/winnt-dll.cc:legitimize_pe_coff_extern_decl (rtx symbol, 
bool want_reg)
config/mingw/winnt-dll.cc:    return legitimize_pe_coff_extern_decl 
(addr, inreg);
config/mingw/winnt-dll.cc:      rtx t = legitimize_pe_coff_extern_decl 
(XEXP (XEXP (addr, 0), 0), inreg);

Tobias

^ permalink raw reply	[flat|nested] 15+ messages in thread

* x86_64-gnu-linux bootstrap fail (was: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw)
  2024-06-25 10:02   ` x86_64-gnu-linux bootstrap fail (was: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw) Tobias Burnus
@ 2024-06-25 10:49     ` Evgeny Karpov
  0 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-25 10:49 UTC (permalink / raw)
  To: Tobias Burnus, gcc-patches
  Cc: richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

Tuesday, June 25, 2024 12:03 PM
Tobias Burnus <tburnus@baylibre.com> wrote:
> 
> Hi Evgeny,
> 
> I am not sure whether I have chosen the right email in the thread but:
> a x86-64 GNU Linux build currently fails as follows.
> 
> At a glance, it seems to be sufficient to remove the prototype
> declaration in i386.cc.
> 
> Namely:
> 
> gcc/config/i386/i386.cc:107:12: error: 'rtx_def*
> legitimize_dllimport_symbol(rtx, bool)' declared 'static' but never
> defined [-Werror=unused-function]
>    107 | static rtx legitimize_dllimport_symbol (rtx, bool);
>        |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> gcc/gcc/config/i386/i386.cc:108:12: error: 'rtx_def*
> legitimize_pe_coff_extern_decl(rtx, bool)' declared 'static' but never
> defined [-Werror=unused-function]
>    108 | static rtx legitimize_pe_coff_extern_decl (rtx, bool);
>        |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ^Cmake[3]: *** [Makefile:2556: i386.o] Interrupt
> 
> There is:
> 
> config/i386/i386.cc:static rtx legitimize_dllimport_symbol (rtx, bool);
> config/mingw/winnt-dll.cc:legitimize_dllimport_symbol (rtx symbol, bool
> want_reg)
> config/mingw/winnt-dll.cc:      return legitimize_dllimport_symbol
> (addr, inreg);
> config/mingw/winnt-dll.cc:        rtx t = legitimize_dllimport_symbol
> (XEXP (XEXP (addr, 0), 0), inreg);
> 
> 
> And:
> 
> config/i386/i386.cc:static rtx legitimize_pe_coff_extern_decl (rtx, bool);
> config/mingw/winnt-dll.cc:legitimize_pe_coff_extern_decl (rtx symbol,
> bool want_reg)
> config/mingw/winnt-dll.cc:    return legitimize_pe_coff_extern_decl
> (addr, inreg);
> config/mingw/winnt-dll.cc:      rtx t = legitimize_pe_coff_extern_decl
> (XEXP (XEXP (addr, 0), 0), inreg);
> 
> Tobias

Thank you, Tobias, for reporting the problem.

x86_64-gnu-linux build has been built however it looks like it is missing a check for unused functions.
The fix will be prepared, tested and submitted to the mailing list today.

Regards,
Evgeny

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 0/6] Add DLL import/export implementation to AArch64
  2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
                   ` (7 preceding siblings ...)
  2024-06-10  9:22 ` Evgeny Karpov
@ 2024-06-26 15:55 ` Andrew Pinski
  2024-06-26 18:41   ` [EXTERNAL] " Evgeny Karpov
  8 siblings, 1 reply; 15+ messages in thread
From: Andrew Pinski @ 2024-06-26 15:55 UTC (permalink / raw)
  To: Evgeny Karpov
  Cc: gcc-patches, richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

On Fri, Jun 7, 2024 at 2:45 AM Evgeny Karpov
<Evgeny.Karpov@microsoft.com> wrote:
>
> Hello,
>
> Thank you for reviewing v1!
> v2 addresses all comments on v1.
>
> Changes in v2:
> - Move winnt.h and winnt-dll.h to config.gcc.
> - Resolve the issue with GCC GC in winnt-dll.cc.
> - Add definitions for GOT_ALIAS_SET, PE_COFF_EXTERN_DECL_SHOULD_BE_LEGITIMIZED, and HAVE_64BIT_POINTERS to cygming.h.
> - Replace intermediate functions for PECOFF with ifdef checks in ix86.
> - Update the copyright date in winnt-dll.cc.
> - Correct the style.
> - Rebase from 7th June 2024

I think this caused profilebootstrap failure on x86_64-linux-gnu.
I notice the definition of GOT_ALIAS_SET for all non mingw targets is
now just -1. That seems very wrong to me.
It was originally:
```
alias_set_type
x86_GOT_alias_set (void)
{
  static alias_set_type set = -1;
  if (set == -1)
    set = new_alias_set ();
  return set;
}
```
And GOT_ALIAS_SET is used in more than COFF areas. Can you please fix
this definition?

Thanks,
Andrew Pinski


>
> Regards,
> Evgeny
>
> Evgeny Karpov (6):
>   Move mingw_* declarations to the mingw folder
>   Extract ix86 dllimport implementation to mingw
>   Rename functions for reuse in AArch64
>   aarch64: Add selectany attribute handling
>   Adjust DLL import/export implementation for AArch64
>   aarch64: Add DLL import/export to AArch64 target
>
>  gcc/config.gcc                      |  20 ++-
>  gcc/config/aarch64/aarch64-protos.h |   5 -
>  gcc/config/aarch64/aarch64.cc       |  42 ++++-
>  gcc/config/aarch64/cygming.h        |  33 +++-
>  gcc/config/i386/cygming.h           |  16 +-
>  gcc/config/i386/i386-expand.cc      |   4 +-
>  gcc/config/i386/i386-expand.h       |   2 -
>  gcc/config/i386/i386-protos.h       |  10 --
>  gcc/config/i386/i386.cc             | 205 ++----------------------
>  gcc/config/i386/i386.h              |   2 +
>  gcc/config/mingw/mingw32.h          |   2 +-
>  gcc/config/mingw/t-cygming          |   6 +
>  gcc/config/mingw/winnt-dll.cc       | 231 ++++++++++++++++++++++++++++
>  gcc/config/mingw/winnt-dll.h        |  30 ++++
>  gcc/config/mingw/winnt.cc           |  10 +-
>  gcc/config/mingw/winnt.h            |  38 +++++
>  16 files changed, 423 insertions(+), 233 deletions(-)
>  create mode 100644 gcc/config/mingw/winnt-dll.cc
>  create mode 100644 gcc/config/mingw/winnt-dll.h
>  create mode 100644 gcc/config/mingw/winnt.h
>
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [EXTERNAL] Re: [PATCH v2 0/6] Add DLL import/export implementation to AArch64
  2024-06-26 15:55 ` Andrew Pinski
@ 2024-06-26 18:41   ` Evgeny Karpov
  0 siblings, 0 replies; 15+ messages in thread
From: Evgeny Karpov @ 2024-06-26 18:41 UTC (permalink / raw)
  To: Andrew Pinski
  Cc: gcc-patches, richard.sandiford, Richard Earnshaw (lists),
	Radek Barton, Maxim Kuvyrkov, ubizjak, 10walls

Wednesday, June 26, 2024 5:56 PM
Andrew Pinski <pinskia@gmail.com> wrote:
> 
> I think this caused profilebootstrap failure on x86_64-linux-gnu.
> I notice the definition of GOT_ALIAS_SET for all non mingw targets is
> now just -1. That seems very wrong to me.
> It was originally:
> ```
> alias_set_type
> x86_GOT_alias_set (void)
> {
>   static alias_set_type set = -1;
>   if (set == -1)
>     set = new_alias_set ();
>   return set;
> }
> ```
> And GOT_ALIAS_SET is used in more than COFF areas. Can you please fix
> this definition?
> 
> Thanks,
> Andrew Pinski
> 

I am working on the fix and will try to validate and submit it today.

Regards,
Evgeny

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2024-06-26 18:41 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-07  9:44 [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
2024-06-07  9:46 ` [PATCH v2 1/6] Move mingw_* declarations to the mingw folder Evgeny Karpov
2024-06-07  9:48 ` [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw Evgeny Karpov
2024-06-07 11:11   ` Uros Bizjak
2024-06-08 12:37   ` Evgeny Karpov
2024-06-25 10:02   ` x86_64-gnu-linux bootstrap fail (was: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw) Tobias Burnus
2024-06-25 10:49     ` Evgeny Karpov
2024-06-07  9:49 ` [PATCH v2 3/6] Rename functions for reuse in AArch64 Evgeny Karpov
2024-06-07  9:50 ` [PATCH v2 4/6] aarch64: Add selectany attribute handling Evgeny Karpov
2024-06-07  9:51 ` [PATCH v2 5/6] Adjust DLL import/export implementation for AArch64 Evgeny Karpov
2024-06-07  9:52 ` [PATCH v2 6/6] aarch64: Add DLL import/export to AArch64 target Evgeny Karpov
2024-06-08 13:01 ` [PATCH v2 0/6] Add DLL import/export implementation to AArch64 Evgeny Karpov
2024-06-10  9:22 ` Evgeny Karpov
2024-06-26 15:55 ` Andrew Pinski
2024-06-26 18:41   ` [EXTERNAL] " Evgeny Karpov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).