Monday, June 10, 2024 7:03 PM Richard Sandiford <richard.sandif...@arm.com> wrote:
> Thanks for the update. Parts 1-5 look good to me. Some minor comments > below about part 6: > > If the TARGET_DLLIMPORT_DECL_ATTRIBUTES condition can be dropped, the > series is OK from my POV with that change and with the changes above. > Please get sign-off from an x86 maintainer too though. Thank you for the review and suggestions. Here is the updated version of patch 6, based on the comments. The x86 and mingw maintainers have already approved the series. Regards, Evgeny 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_expand_call): Add dllimport implementation. (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 | 26 ++++++++++++++++++++++++++ gcc/config/aarch64/cygming.h | 26 ++++++++++++++++++++++++-- 3 files changed, 53 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..32e31e08449 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 @@ -2865,6 +2869,15 @@ static void aarch64_load_symref_appropriately (rtx dest, rtx imm, enum aarch64_symbol_type type) { +#if TARGET_PECOFF + rtx tmp = legitimize_pe_coff_symbol (imm, true); + if (tmp) + { + emit_insn (gen_rtx_SET (dest, tmp)); + return; + } +#endif + switch (type) { case SYMBOL_SMALL_ABSOLUTE: @@ -11233,6 +11246,13 @@ aarch64_expand_call (rtx result, rtx mem, rtx cookie, bool sibcall) gcc_assert (MEM_P (mem)); callee = XEXP (mem, 0); + +#if TARGET_PECOFF + tmp = legitimize_pe_coff_symbol (callee, false); + if (tmp) + callee = tmp; +#endif + mode = GET_MODE (callee); gcc_assert (mode == Pmode); @@ -12709,6 +12729,12 @@ 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_PECOFF + rtx tmp = legitimize_pe_coff_symbol (x, true); + if (tmp) + return tmp; +#endif + /* 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