From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-x232.google.com (mail-lj1-x232.google.com [IPv6:2a00:1450:4864:20::232]) by sourceware.org (Postfix) with ESMTPS id E11B83A0D745 for ; Fri, 7 Jun 2024 11:11:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E11B83A0D745 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E11B83A0D745 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::232 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1717758709; cv=none; b=RSJl8yJ3USL2Z4nmFoOK3FvNz+p7Z9YmHG1OjX3FketBfmDTdcD+SlOKuhcP9PFG5mPHZ7DNU4nl/FYpyVt0I5bSCCyPmXSRb8Y0VXVYBX0wn0hmRx9DhUHnF3c6NMvy30K6btNVT8VJI7Ub60ZZaW27e1YGbmeFVhuqjoiA3tQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1717758709; c=relaxed/simple; bh=OQn/tUwEcgoPnI4RkdTzwop0f343+zCwQIYZE5qPpwA=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=J2rPyA+LQxGmF0jxm0Ad49/S7FYzesnqaAvONEaT6pKyNGVTuGPaxIvhy7tJq8Ojv43ZVYlV2C6kxGcgrafW1kX6+e+DaJEB1jmb6+b7XuZDPHhEDlFXVzRaxchv6c9ztO8aCmagR0AdDidZ/zApn1QrlShRIq8gQd7keBpuN9I= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-lj1-x232.google.com with SMTP id 38308e7fff4ca-2eaafda3b5cso24673571fa.3 for ; Fri, 07 Jun 2024 04:11:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1717758703; x=1718363503; darn=gcc.gnu.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=8TWCsYKeqMKHk8FxIWB1EVewGJqdHO2X8rqRjQ4buXg=; b=PzFYKvk92+4hRyM4rAcY7K47qHQ/CpuqFHvIJ7t9qRBfITEIx3lhJebPN02iZwpNdL mLHX/Qbln/UZJNqVnfITeMK4YvTaMLvsYk7sIgupuhShHrH7bPQ4xyEfgpCOKSGYaKIG 4G/fqgOUjRGKfKUKE5mAx4ahzEz8q0h4NOklS552Ww6FCsImGsBXKrXY+Vqw4A49KDjK gKGgnvWFg8lYkvqWw+yzjiRZMcPF7z2Ngqe/oLIlqNnjoFf+FEXzqZKxUmvlG11JhZCW Sxk2UweYivVpH61Oj6FFqOlecCr89Y7ztMTFQS2cmHylv68aU/Bja9X/BWSWWOfxyknI cfZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717758703; x=1718363503; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8TWCsYKeqMKHk8FxIWB1EVewGJqdHO2X8rqRjQ4buXg=; b=l3ehO0ICjITyEre1eRw5aHMUY2HzY/9aXarD+p5By3oNl5IlDrNrEAyjCgH2qyOrKd W3OfCxwa6Ig0P9WRsQ3OpiLegokR1VNFdD1CsMJ1oEI9bNLzmFROYNxtFVnDAzRyLpdZ Okbw+I7VEnaL0jBw2kt0456wLp2YgS6yiR7hIvqH6GqXCnzTF1jg2bwg5BO8wLspOyhN wdUhYF6CMMADq4JMJSzd5aJdo94M5t6/ZEC7E0qUEhULWt/PVLZALc08VFLKpzdqa5uB BTvJLfVgvOjWuM/CkU4Re6Ql9QvfpfmG5uFBBntaiLpZ0LtS+Q0Pf0dLrK4kZ3KHaKfP bNJg== X-Gm-Message-State: AOJu0Ywr8/Q3mb4lpVtfHg7d5c6L57zupbUr0DprtbNU+X8W3fbU8vr9 7aPnXJjpy0oOxPabOSnH3b5FdcOdYzeAKhG4N/mZwoURISDf4vlin5jV/vz3I2jgmUoL0FVudop /k/jrpXm1dBRGYGhMqYsyh8Pqws8OStiO X-Google-Smtp-Source: AGHT+IEvbBJxw3CJOK3hqOFGO4DozBvENFTT5WGGA78AzQsz7KgHffduDSW7R87V3Pi3hqCABQN0tc1ieG4DzsXa354= X-Received: by 2002:a05:651c:2119:b0:2ea:8163:5f39 with SMTP id 38308e7fff4ca-2eadce1e804mr18511531fa.10.1717758702719; Fri, 07 Jun 2024 04:11:42 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Uros Bizjak Date: Fri, 7 Jun 2024 13:11:31 +0200 Message-ID: Subject: Re: [PATCH v2 2/6] Extract ix86 dllimport implementation to mingw To: Evgeny Karpov Cc: "gcc-patches@gcc.gnu.org" , "richard.sandiford@arm.com" , "Richard Earnshaw (lists)" , Radek Barton , Maxim Kuvyrkov , "10walls@gmail.com" <10walls@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Fri, Jun 7, 2024 at 11:48=E2=80=AFAM Evgeny Karpov 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=3D"${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygm= ing.h i386/cygwin.h i386/cygwin-stdint.h" > tm_file=3D"${tm_file} mingw/winnt.h" > + tm_file=3D"${tm_file} mingw/winnt-dll.h" > xm_file=3Di386/xm-cygwin.h > tmake_file=3D"${tmake_file} mingw/t-cygming t-slibgcc" > target_gtfiles=3D"$target_gtfiles \$(srcdir)/config/mingw/winnt.c= c" > + target_gtfiles=3D"$target_gtfiles \$(srcdir)/config/mingw/winnt-d= ll.cc" > extra_options=3D"${extra_options} mingw/cygming.opt i386/cygwin.o= pt" > - extra_objs=3D"${extra_objs} winnt.o winnt-stubs.o" > + extra_objs=3D"${extra_objs} winnt.o winnt-stubs.o winnt-dll.o" > c_target_objs=3D"${c_target_objs} msformat-c.o" > cxx_target_objs=3D"${cxx_target_objs} winnt-cxx.o msformat-c.o" > d_target_objs=3D"${d_target_objs} cygwin-d.o" > @@ -2196,11 +2198,13 @@ x86_64-*-cygwin*) > need_64bit_isa=3Dyes > tm_file=3D"${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/cygm= ing.h i386/cygwin.h i386/cygwin-w64.h i386/cygwin-stdint.h" > tm_file=3D"${tm_file} mingw/winnt.h" > + tm_file=3D"${tm_file} mingw/winnt-dll.h" > xm_file=3Di386/xm-cygwin.h > tmake_file=3D"${tmake_file} mingw/t-cygming t-slibgcc" > target_gtfiles=3D"$target_gtfiles \$(srcdir)/config/mingw/winnt.c= c" > + target_gtfiles=3D"$target_gtfiles \$(srcdir)/config/mingw/winnt-d= ll.cc" > extra_options=3D"${extra_options} mingw/cygming.opt i386/cygwin.o= pt" > - extra_objs=3D"${extra_objs} winnt.o winnt-stubs.o" > + extra_objs=3D"${extra_objs} winnt.o winnt-stubs.o winnt-dll.o" > c_target_objs=3D"${c_target_objs} msformat-c.o" > cxx_target_objs=3D"${cxx_target_objs} winnt-cxx.o msformat-c.o" > d_target_objs=3D"${d_target_objs} cygwin-d.o" > @@ -2266,6 +2270,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) > esac > tm_file=3D"${tm_file} mingw/mingw-stdint.h" > tm_file=3D"${tm_file} mingw/winnt.h" > + tm_file=3D"${tm_file} mingw/winnt-dll.h" > tmake_file=3D"${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=3D/mingw/include > target_gtfiles=3D"$target_gtfiles \$(srcdir)/config/mingw/winnt.c= c" > + target_gtfiles=3D"$target_gtfiles \$(srcdir)/config/mingw/winnt-d= ll.cc" > extra_options=3D"${extra_options} mingw/cygming.opt mingw/mingw.o= pt" > case ${target} in > *-w64-*) > @@ -2285,7 +2291,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) > *) > ;; > esac > - extra_objs=3D"${extra_objs} winnt.o winnt-stubs.o" > + extra_objs=3D"${extra_objs} winnt.o winnt-stubs.o winnt-dll.o" > c_target_objs=3D"${c_target_objs} msformat-c.o" > cxx_target_objs=3D"${cxx_target_objs} winnt-cxx.o msformat-c.o" > gas=3Dyes > 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 =3D gen_rtx_CONST (Pmode, op1); > op1 =3D 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 =3D legitimize_pe_coff_symbol (op1, addend !=3D NULL_RTX); > if (tmp) > { > @@ -424,6 +425,7 @@ ix86_expand_move (machine_mode mode, rtx operands[]) > op1 =3D 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) !=3D 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 =3D -1; > - if (set =3D=3D -1) > - set =3D 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 =3D 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) =3D=3D LABEL_REF)) > { > +#if TARGET_PECOFF > rtx tmp =3D 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 =3D gen_rtx_CONST (Pmode, new_rtx); > new_rtx =3D 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 =3D gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rt= x); > > new_rtx =3D 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 =3D copy_to_suggested_reg (new_rtx, reg, Pmode); > @@ -12344,7 +12326,7 @@ legitimize_tls_address (rtx x, enum tls_model mod= el, bool for_mov) > if (pic) > off =3D gen_rtx_PLUS (tp_mode, pic, off); > off =3D 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 > -{ > - 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 =3D=3D b->base.from; > - } > - > - static int > - keep_cache_entry (tree_map *&m) > - { > - return ggc_marked_p (m->base.from); > - } > -}; > - > -static GTY((cache)) hash_table *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 =3D hash_table::create_ggc (512); > - > - in.hash =3D htab_hash_pointer (decl); > - in.base.from =3D decl; > - tree_map **loc =3D dllimport_map->find_slot_with_hash (&in, in.hash, I= NSERT); > - h =3D *loc; > - if (h) > - return h->to; > - > - *loc =3D h =3D ggc_alloc (); > - h->hash =3D in.hash; > - h->base.from =3D decl; > - h->to =3D to =3D build_decl (DECL_SOURCE_LOCATION (decl), > - VAR_DECL, NULL, ptr_type_node); > - DECL_ARTIFICIAL (to) =3D 1; > - DECL_IGNORED_P (to) =3D 1; > - DECL_EXTERNAL (to) =3D 1; > - TREE_READONLY (to) =3D 1; > - > - name =3D IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); > - name =3D targetm.strip_name_encoding (name); > - if (beimport) > - prefix =3D name[0] =3D=3D FASTCALL_PREFIX || user_label_prefix[0] = =3D=3D 0 > - ? "*__imp_" : "*__imp__"; > - else > - prefix =3D user_label_prefix[0] =3D=3D 0 ? "*.refptr." : "*refptr."; > - namelen =3D strlen (name); > - prefixlen =3D strlen (prefix); > - imp_name =3D (char *) alloca (namelen + prefixlen + 1); > - memcpy (imp_name, prefix, prefixlen); > - memcpy (imp_name + prefixlen, name, namelen + 1); > - > - name =3D ggc_alloc_string (imp_name, namelen + prefixlen); > - rtl =3D gen_rtx_SYMBOL_REF (Pmode, name); > - SET_SYMBOL_REF_DECL (rtl, to); > - SYMBOL_REF_FLAGS (rtl) =3D SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_STUBVAR; > - if (!beimport) > - { > - SYMBOL_REF_FLAGS (rtl) |=3D SYMBOL_FLAG_EXTERNAL; > -#ifdef SUB_TARGET_RECORD_STUB > - SUB_TARGET_RECORD_STUB (name); > -#endif > - } > - > - rtl =3D 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 =3D get_dllimport_decl (SYMBOL_REF_DECL (symbol), false); > - > - x =3D DECL_RTL (imp_decl); > - if (want_reg) > - x =3D 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 =3D get_dllimport_decl (SYMBOL_REF_DECL (symbol), true); > - > - x =3D DECL_RTL (imp_decl); > - if (want_reg) > - x =3D force_reg (Pmode, x); > - return x; > -} > - > -/* Expand SYMBOL into its corresponding dllimport or refptr symbol. WAN= T_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) =3D=3D SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (a= ddr)) > - return legitimize_dllimport_symbol (addr, inreg); > - if (GET_CODE (addr) =3D=3D CONST > - && GET_CODE (XEXP (addr, 0)) =3D=3D PLUS > - && GET_CODE (XEXP (XEXP (addr, 0), 0)) =3D=3D SYMBOL_REF > - && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0))) > - { > - rtx t =3D legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0)= , inreg); > - return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1)); > - } > - } > - > - if (ix86_cmodel !=3D CM_LARGE_PIC && ix86_cmodel !=3D CM_MEDIUM_PIC) > - return NULL_RTX; > - if (GET_CODE (addr) =3D=3D 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) =3D=3D CONST > - && GET_CODE (XEXP (addr, 0)) =3D=3D PLUS > - && GET_CODE (XEXP (XEXP (addr, 0), 0)) =3D=3D 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 =3D 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_mod= e mode) > > if (TARGET_DLLIMPORT_DECL_ATTRIBUTES) > { > +#if TARGET_PECOFF > rtx tmp =3D 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_P= SEUDO_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 =3D 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 $(CON= FIG_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) $(SYSTE= M_H) \ > coretypes.h \ > diff --git a/gcc/config/mingw/winnt-dll.cc b/gcc/config/mingw/winnt-dll.c= c > 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 > +{ > + 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 =3D=3D b->base.from; > + } > + > + static int > + keep_cache_entry (tree_map *&m) > + { > + return ggc_marked_p (m->base.from); > + } > +}; > + > +static GTY ((cache)) hash_table *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) !=3D 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 =3D -1; > + if (set =3D=3D -1) > + set =3D 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 =3D hash_table::create_ggc (512); > + > + in.hash =3D htab_hash_pointer (decl); > + in.base.from =3D decl; > + tree_map **loc =3D dllimport_map->find_slot_with_hash (&in, in.hash, I= NSERT); > + h =3D *loc; > + if (h) > + return h->to; > + > + *loc =3D h =3D ggc_alloc (); > + h->hash =3D in.hash; > + h->base.from =3D decl; > + h->to =3D to =3D build_decl (DECL_SOURCE_LOCATION (decl), > + VAR_DECL, NULL, ptr_type_node); > + DECL_ARTIFICIAL (to) =3D 1; > + DECL_IGNORED_P (to) =3D 1; > + DECL_EXTERNAL (to) =3D 1; > + TREE_READONLY (to) =3D 1; > + > + name =3D IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); > + name =3D targetm.strip_name_encoding (name); > + if (beimport) > + prefix =3D name[0] =3D=3D FASTCALL_PREFIX || user_label_prefix[0] = =3D=3D 0 > + ? "*__imp_" : "*__imp__"; > + else > + prefix =3D user_label_prefix[0] =3D=3D 0 ? "*.refptr." : "*refptr."; > + namelen =3D strlen (name); > + prefixlen =3D strlen (prefix); > + imp_name =3D (char *) alloca (namelen + prefixlen + 1); > + memcpy (imp_name, prefix, prefixlen); > + memcpy (imp_name + prefixlen, name, namelen + 1); > + > + name =3D ggc_alloc_string (imp_name, namelen + prefixlen); > + rtl =3D gen_rtx_SYMBOL_REF (Pmode, name); > + SET_SYMBOL_REF_DECL (rtl, to); > + SYMBOL_REF_FLAGS (rtl) =3D SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_STUBVAR; > + if (!beimport) > + { > + SYMBOL_REF_FLAGS (rtl) |=3D SYMBOL_FLAG_EXTERNAL; > +#ifdef SUB_TARGET_RECORD_STUB > + SUB_TARGET_RECORD_STUB (name); > +#endif > + } > + > + rtl =3D 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 =3D get_dllimport_decl (SYMBOL_REF_DECL (symbol), false); > + > + x =3D DECL_RTL (imp_decl); > + if (want_reg) > + x =3D 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 =3D get_dllimport_decl (SYMBOL_REF_DECL (symbol), true); > + > + x =3D DECL_RTL (imp_decl); > + if (want_reg) > + x =3D force_reg (Pmode, x); > + return x; > +} > + > +/* Expand SYMBOL into its corresponding dllimport or refptr symbol. WAN= T_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) =3D=3D SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (a= ddr)) > + return legitimize_dllimport_symbol (addr, inreg); > + if (GET_CODE (addr) =3D=3D CONST > + && GET_CODE (XEXP (addr, 0)) =3D=3D PLUS > + && GET_CODE (XEXP (XEXP (addr, 0), 0)) =3D=3D SYMBOL_REF > + && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0))) > + { > + rtx t =3D legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0)= , inreg); > + return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1)); > + } > + } > + > + if (ix86_cmodel !=3D CM_LARGE_PIC && ix86_cmodel !=3D CM_MEDIUM_PIC) > + return NULL_RTX; > + > + if (GET_CODE (addr) =3D=3D 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) =3D=3D CONST > + && GET_CODE (XEXP (addr, 0)) =3D=3D PLUS > + && GET_CODE (XEXP (XEXP (addr, 0), 0)) =3D=3D 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 =3D 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, con= st 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 *, i= nt); > +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 >