Hi gcc-patches mailing list, Saurabh Jha <[email protected]> has requested that the following forgejo pull request be published on the mailing list.
Created on: 2025-10-28 12:52:52+00:00 Latest update: 2025-11-14 12:17:32+00:00 Changes: 14 changed files, 694 additions, 31 deletions Head revision: saurabh.jha/gcc-TEST ref mingw-data-types-abi commit 7ea34c526e7982c84f8b424dc1db8dbe0449ac1d Base revision: gcc/gcc-TEST ref trunk commit 55a77666c9126fe8c189aff82059003ad513b22f r16-5273-g55a77666c9126f Merge base: 55a77666c9126fe8c189aff82059003ad513b22f Full diff url: https://forge.sourceware.org/gcc/gcc-TEST/pulls/118.diff Discussion: https://forge.sourceware.org/gcc/gcc-TEST/pulls/118 Requested Reviewers: pinskia Hey, In v4, addressed comments around removing #if from here: https://forge.sourceware.org/gcc/gcc-TEST/pulls/118#issuecomment-3963 No other changes. Thanks, Saurabh Saurabh Jha (3): aarch64: mingw: emit seh_endproc as comment aarch64: mingw: Make long double 64 bit aarch64: mingw: Implement support for variadic ABI gcc/config/aarch64/aarch64-builtins.cc | 33 ++ gcc/config/aarch64/aarch64-coff.h | 19 +- gcc/config/aarch64/aarch64-protos.h | 1 + gcc/config/aarch64/aarch64.cc | 341 ++++++++++++++++-- gcc/config/aarch64/aarch64.h | 16 + gcc/config/aarch64/cygming.h | 13 +- gcc/config/mingw/winnt.cc | 22 ++ gcc/config/mingw/winnt.h | 1 + .../aarch64/mingw/long_double_size.c | 23 ++ .../gcc.target/aarch64/mingw/mingw.exp | 41 +++ .../gcc.target/aarch64/mingw/variadic_hfa.c | 71 ++++ .../gcc.target/aarch64/mingw/variadic_hva.c | 89 +++++ .../gcc.target/aarch64/mingw/variadic_int.c | 41 +++ gcc/testsuite/lib/scanasm.exp | 12 +- 14 files changed, 693 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/long_double_size.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/mingw.exp create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/variadic_hfa.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/variadic_hva.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/variadic_int.c Changed files: - A: gcc/testsuite/gcc.target/aarch64/mingw/long_double_size.c - A: gcc/testsuite/gcc.target/aarch64/mingw/mingw.exp - A: gcc/testsuite/gcc.target/aarch64/mingw/variadic_hfa.c - A: gcc/testsuite/gcc.target/aarch64/mingw/variadic_hva.c - A: gcc/testsuite/gcc.target/aarch64/mingw/variadic_int.c - M: gcc/config/aarch64/aarch64-builtins.cc - M: gcc/config/aarch64/aarch64-coff.h - M: gcc/config/aarch64/aarch64-protos.h - M: gcc/config/aarch64/aarch64.cc - M: gcc/config/aarch64/aarch64.h - M: gcc/config/aarch64/cygming.h - M: gcc/config/mingw/winnt.cc - M: gcc/config/mingw/winnt.h - M: gcc/testsuite/lib/scanasm.exp Saurabh Jha (3): aarch64: mingw: emit seh_endproc as comment aarch64: mingw: Make long double 64 bit aarch64: mingw: Implement support for variadic ABI gcc/config/aarch64/aarch64-builtins.cc | 33 ++ gcc/config/aarch64/aarch64-coff.h | 19 +- gcc/config/aarch64/aarch64-protos.h | 1 + gcc/config/aarch64/aarch64.cc | 341 ++++++++++++++++-- gcc/config/aarch64/aarch64.h | 16 + gcc/config/aarch64/cygming.h | 13 +- gcc/config/mingw/winnt.cc | 22 ++ gcc/config/mingw/winnt.h | 1 + .../aarch64/mingw/long_double_size.c | 23 ++ .../gcc.target/aarch64/mingw/mingw.exp | 41 +++ .../gcc.target/aarch64/mingw/variadic_hfa.c | 71 ++++ .../gcc.target/aarch64/mingw/variadic_hva.c | 89 +++++ .../gcc.target/aarch64/mingw/variadic_int.c | 41 +++ gcc/testsuite/lib/scanasm.exp | 12 +- 14 files changed, 693 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/long_double_size.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/mingw.exp create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/variadic_hfa.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/variadic_hva.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mingw/variadic_int.c Range-diff against v3: 1: 8c1ceed2a17 = 1: 02b91e42c20 aarch64: mingw: emit seh_endproc as comment 2: 712de699693 = 2: e4cd37d2dbd aarch64: mingw: Make long double 64 bit 3: f2ca5054c7d ! 3: 7ea34c526e7 aarch64: mingw: Implement support for variadic ABI @@ Commit message (aarch64_setup_incoming_varargs): Implement TARGET_SETUP_INCOMING_VARARGS. (aarch64_mangle_type): Implement TARGET_MANGLE_TYPE. - (aarch64_ms_variadic_abi_strict_argument_naming): Implement + (aarch64_variadic_abi_strict_argument_naming): Implement TARGET_STRICT_ARGUMENT_NAMING. * config/aarch64/aarch64.h (aarch64_frame): Add new field @@ gcc/config/aarch64/aarch64.cc: get_pcs_arg_reg (enum arm_pcs pcs, int num) + return ROUND_UP (size, UNITS_PER_WORD); +} + -+/* Layout a function argument according to the AAPCS64 rules. The rule -+ numbers refer to the rule numbers in the AAPCS64. -+ -+ The Windows Arm64 variadic function call ABI uses only C.12-C15 rules. ++/* The Windows Arm64 variadic function call ABI uses only C.12-C15 rules. + See: https://learn.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions#addendum-variadic-functions. */ + +static void @@ gcc/config/aarch64/aarch64.cc: aarch64_layout_arg (cumulative_args_t pcum_v, con allocate_ncrn = (type) ? !(FLOAT_TYPE_P (type)) : !FLOAT_MODE_P (mode); allocate_nvrn = aarch64_vfp_is_call_candidate (pcum_v, mode, -@@ gcc/config/aarch64/aarch64.cc: aarch64_finish_sme_mode_switch_args (CUMULATIVE_ARGS *pcum) - return gen_rtx_PARALLEL (VOIDmode, argvec); - } - -+/* Implement TARGET_ARG_PARTIAL_BYTES. */ -+ -+#if TARGET_AARCH64_MS_ABI == 1 -+static int -+aarch64_arg_partial_bytes (cumulative_args_t pcum_v, -+ const function_arg_info &arg ATTRIBUTE_UNUSED) -+{ -+ CUMULATIVE_ARGS *pcum = get_cumulative_args (pcum_v); -+ -+ if (pcum->pcs_variant != ARM_PCS_MS_VARIADIC) -+ return 0; -+ -+ /* Handle the case when argument is split between the last registers and -+ the stack. */ -+ if ((pcum->aapcs_reg != NULL_RTX) && (pcum->aapcs_stack_words != 0)) -+ return pcum->aapcs_stack_words * UNITS_PER_WORD; -+ -+ return 0; -+} -+#endif -+ - /* Implement TARGET_FUNCTION_ARG. */ - - static rtx @@ gcc/config/aarch64/aarch64.cc: aarch64_function_arg (cumulative_args_t pcum_v, const function_arg_info &arg) gcc_assert (pcum->pcs_variant == ARM_PCS_AAPCS64 || pcum->pcs_variant == ARM_PCS_SIMD @@ gcc/config/aarch64/aarch64.cc: aarch64_function_arg_regno_p (unsigned regno) case ARM_PCS_UNKNOWN: return ((GP_REGNUM_P (regno) && regno < R0_REGNUM + NUM_ARG_REGS) || (FP_REGNUM_P (regno) && regno < V0_REGNUM + NUM_FP_ARG_REGS) -@@ gcc/config/aarch64/aarch64.cc: static GTY(()) tree va_list_type; - int __vr_offs; - }; */ - -+#if TARGET_AARCH64_MS_ABI == 0 - static tree - aarch64_build_builtin_va_list (void) - { -@@ gcc/config/aarch64/aarch64.cc: aarch64_build_builtin_va_list (void) - - return va_list_type; +@@ gcc/config/aarch64/aarch64.cc: aarch64_load_tp (rtx target) + return target; } -+#endif -+ + +/* Windows Arm64 variadic function call ABI specific va_list type node. */ +tree ms_va_list_type_node; + -+/* Implement TARGET_BUILD_BUILTIN_VA_LIST. -+ -+ Setup the builtin va_list data type and for 64-bit the additional ++/* Setup the builtin va_list data type and for 64-bit the additional + calling convention specific va_list data types. */ + -+#if TARGET_AARCH64_MS_ABI == 1 +static tree +aarch64_ms_variadic_abi_build_builtin_va_list (void) +{ @@ gcc/config/aarch64/aarch64.cc: aarch64_build_builtin_va_list (void) + + return ms_va_list_type_node; +} -+#endif ++ + /* On AAPCS systems, this is the "struct __va_list". */ + static GTY(()) tree va_list_type; - /* Implement TARGET_EXPAND_BUILTIN_VA_START. */ +@@ gcc/config/aarch64/aarch64.cc: static GTY(()) tree va_list_type; + void *__vr_top; + int __gr_offs; + int __vr_offs; +- }; */ ++ }; + -+#if TARGET_AARCH64_MS_ABI == 0 - static void - aarch64_expand_builtin_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) ++ Windows ABI is handled using ++ aarch64_ms_variadic_abi_build_builtin_va_list (void). */ + + static tree + aarch64_build_builtin_va_list (void) { -@@ gcc/config/aarch64/aarch64.cc: aarch64_expand_builtin_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) - build_int_cst (TREE_TYPE (vroff), -vr_save_area_size)); - expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); - } -+#endif ++ if (TARGET_AARCH64_MS_ABI) ++ return aarch64_ms_variadic_abi_build_builtin_va_list (); + -+/* Implement TARGET_EXPAND_BUILTIN_VA_START. */ -+ -+#if TARGET_AARCH64_MS_ABI == 1 + tree va_list_name; + tree f_stack, f_grtop, f_vrtop, f_groff, f_vroff; + +@@ gcc/config/aarch64/aarch64.cc: aarch64_build_builtin_va_list (void) + return va_list_type; + } + +static void +aarch64_ms_variadic_abi_expand_builtin_va_start (tree valist, rtx nextarg) +{ @@ gcc/config/aarch64/aarch64.cc: aarch64_expand_builtin_va_start (tree valist, rtx + + convert_move (va_r, nextarg, 0); +} -+#endif ++ + /* Implement TARGET_EXPAND_BUILTIN_VA_START. */ ++ + static void +-aarch64_expand_builtin_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) ++aarch64_expand_builtin_va_start (tree valist, rtx nextarg) + { ++ if (TARGET_AARCH64_MS_ABI) ++ return aarch64_ms_variadic_abi_expand_builtin_va_start (valist, nextarg); ++ + const CUMULATIVE_ARGS *cum; + tree f_stack, f_grtop, f_vrtop, f_groff, f_vroff; + tree stack, grtop, vrtop, groff, vroff; +@@ gcc/config/aarch64/aarch64.cc: aarch64_expand_builtin_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) + expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); + } + ++#if TARGET_AARCH64_MS_ABI == 1 + +/* Iterate through the target-specific builtin types for va_list. + IDX denotes the iterator, *PTREE is set to the result type of @@ gcc/config/aarch64/aarch64.cc: aarch64_expand_builtin_va_start (tree valist, rtx + Note, do not iterate a base builtin's name like __builtin_va_list. + Used from c_common_nodes_and_builtins. */ + -+#if TARGET_AARCH64_MS_ABI == 1 +static int +aarch64_ms_variadic_abi_enum_va_list (int idx, const char **pname, tree *ptree) +{ @@ gcc/config/aarch64/aarch64.cc: aarch64_expand_builtin_va_start (tree valist, rtx + + return 0; +} -+#endif + +/* This function returns the calling abi specific va_list type node. + It returns the FNDECL specific va_list type. */ + -+#if TARGET_AARCH64_MS_ABI == 1 +static tree +aarch64_ms_variadic_abi_fn_abi_va_list (tree fndecl) +{ @@ gcc/config/aarch64/aarch64.cc: aarch64_expand_builtin_va_start (tree valist, rtx + + return std_fn_abi_va_list (fndecl); +} -+#endif + +/* Returns the canonical va_list type specified by TYPE. + If there is no valid TYPE provided, it return NULL_TREE. */ + -+#if TARGET_AARCH64_MS_ABI == 1 +static tree +aarch64_ms_variadic_abi_canonical_va_list_type (tree type) +{ @@ gcc/config/aarch64/aarch64.cc: aarch64_expand_builtin_va_start (tree valist, rtx + + return NULL_TREE; +} ++ ++/* Implement TARGET_ARG_PARTIAL_BYTES. */ ++ ++static int ++aarch64_arg_partial_bytes (cumulative_args_t pcum_v, ++ const function_arg_info &arg ATTRIBUTE_UNUSED) ++{ ++ CUMULATIVE_ARGS *pcum = get_cumulative_args (pcum_v); ++ ++ if (pcum->pcs_variant != ARM_PCS_MS_VARIADIC) ++ return 0; ++ ++ /* Handle the case when argument is split between the last registers and ++ the stack. */ ++ if ((pcum->aapcs_reg != NULL_RTX) && (pcum->aapcs_stack_words != 0)) ++ return pcum->aapcs_stack_words * UNITS_PER_WORD; ++ ++ return 0; ++} ++ +#endif - ++ /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR. */ +#if TARGET_AARCH64_MS_ABI == 0 @@ gcc/config/aarch64/aarch64.cc: aarch64_post_cfi_startproc (FILE *f, tree ignored + For Windows ABI of variadic function calls, treat the named arguments as + unnamed as they are handled the same way as variadic arguments. */ + -+#if TARGET_AARCH64_MS_ABI == 1 +static bool -+aarch64_ms_variadic_abi_strict_argument_naming (cumulative_args_t pcum_v) ++aarch64_variadic_abi_strict_argument_naming (cumulative_args_t pcum_v) +{ ++ if (!TARGET_AARCH64_MS_ABI) ++ return hook_bool_CUMULATIVE_ARGS_true (pcum_v); ++ + CUMULATIVE_ARGS *pcum = get_cumulative_args (pcum_v); + + if (pcum->pcs_variant == ARM_PCS_MS_VARIADIC) @@ gcc/config/aarch64/aarch64.cc: aarch64_post_cfi_startproc (FILE *f, tree ignored + + return hook_bool_CUMULATIVE_ARGS_true (pcum_v); +} -+#endif + /* Implements TARGET_ASM_FILE_START. Output the assembly header. */ static void @@ gcc/config/aarch64/aarch64.cc: aarch64_run_selftests (void) - #undef TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY - #define TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY aarch64_print_patchable_function_entry - -+#if TARGET_AARCH64_MS_ABI == 1 -+#undef TARGET_BUILD_BUILTIN_VA_LIST -+#define TARGET_BUILD_BUILTIN_VA_LIST \ -+ aarch64_ms_variadic_abi_build_builtin_va_list -+#else - #undef TARGET_BUILD_BUILTIN_VA_LIST - #define TARGET_BUILD_BUILTIN_VA_LIST aarch64_build_builtin_va_list -+#endif - - #undef TARGET_CALLEE_COPIES - #define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_false -@@ gcc/config/aarch64/aarch64.cc: aarch64_run_selftests (void) - #undef TARGET_EXPAND_BUILTIN - #define TARGET_EXPAND_BUILTIN aarch64_expand_builtin + #undef TARGET_EXPAND_BUILTIN_VA_START + #define TARGET_EXPAND_BUILTIN_VA_START aarch64_expand_builtin_va_start +#if TARGET_AARCH64_MS_ABI == 1 +#undef TARGET_ENUM_VA_LIST_P @@ gcc/config/aarch64/aarch64.cc: aarch64_run_selftests (void) +#define TARGET_CANONICAL_VA_LIST_TYPE \ + aarch64_ms_variadic_abi_canonical_va_list_type + -+#undef TARGET_EXPAND_BUILTIN_VA_START -+#define TARGET_EXPAND_BUILTIN_VA_START \ -+ aarch64_ms_variadic_abi_expand_builtin_va_start -+#else - #undef TARGET_EXPAND_BUILTIN_VA_START - #define TARGET_EXPAND_BUILTIN_VA_START aarch64_expand_builtin_va_start -+#endif - - #undef TARGET_FOLD_BUILTIN - #define TARGET_FOLD_BUILTIN aarch64_fold_builtin - -+#if TARGET_AARCH64_MS_ABI == 1 +#undef TARGET_ARG_PARTIAL_BYTES +#define TARGET_ARG_PARTIAL_BYTES aarch64_arg_partial_bytes +#endif + - #undef TARGET_FUNCTION_ARG - #define TARGET_FUNCTION_ARG aarch64_function_arg + #undef TARGET_FOLD_BUILTIN + #define TARGET_FOLD_BUILTIN aarch64_fold_builtin @@ gcc/config/aarch64/aarch64.cc: aarch64_run_selftests (void) #undef TARGET_GIMPLE_FOLD_BUILTIN @@ gcc/config/aarch64/aarch64.cc: aarch64_run_selftests (void) #undef TARGET_INIT_BUILTINS #define TARGET_INIT_BUILTINS aarch64_init_builtins @@ gcc/config/aarch64/aarch64.cc: aarch64_libgcc_floating_mode_supported_p - #undef TARGET_ASM_POST_CFI_STARTPROC #define TARGET_ASM_POST_CFI_STARTPROC aarch64_post_cfi_startproc -+#if TARGET_AARCH64_MS_ABI == 1 -+#undef TARGET_STRICT_ARGUMENT_NAMING -+#define TARGET_STRICT_ARGUMENT_NAMING \ -+ aarch64_ms_variadic_abi_strict_argument_naming -+#else #undef TARGET_STRICT_ARGUMENT_NAMING - #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true -+#endif +-#define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true ++#define TARGET_STRICT_ARGUMENT_NAMING \ ++ aarch64_variadic_abi_strict_argument_naming #undef TARGET_MODE_EMIT #define TARGET_MODE_EMIT aarch64_mode_emit -- 2.51.1
