@@ -1072,6 +1072,13 @@ esac
# Figure out if we need to enable -foff-stack-trampolines by default.
case ${target} in
+aarch64*-*darwin* | arm64*-*darwin*)
+ if test ${macos_maj} = 11 || test ${macos_maj} = 12; then
+ tm_defines="$tm_defines STACK_USE_CUMULATIVE_ARGS_INIT=1"
+ else
+ tm_defines="$tm_defines STACK_USE_CUMULATIVE_ARGS_INIT=0"
+ fi
+ ;;
*)
tm_defines="$tm_defines STACK_USE_CUMULATIVE_ARGS_INIT=0"
;;
@@ -896,6 +896,7 @@ void aarch64_expand_vector_init (rtx, rtx);
void aarch64_sve_expand_vector_init (rtx, rtx);
void aarch64_init_cumulative_args (CUMULATIVE_ARGS *, const_tree, rtx,
const_tree, unsigned, bool = false);
+void aarch64_init_cumulative_incoming_args (CUMULATIVE_ARGS *, const_tree, rtx);
void aarch64_init_expanders (void);
void aarch64_init_simd_builtins (void);
void aarch64_emit_call_insn (rtx);
@@ -7042,6 +7042,8 @@ aarch64_init_cumulative_args (CUMULATIVE_ARGS *pcum,
pcum->darwinpcs_stack_bytes = 0;
pcum->darwinpcs_sub_word_offset = 0;
pcum->darwinpcs_sub_word_pos = 0;
+ pcum->darwinpcs_n_named = n_named;
+ pcum->darwinpcs_n_args_processed = 0;
pcum->silent_p = silent_p;
pcum->aapcs_vfp_rmode = VOIDmode;
@@ -7072,6 +7074,20 @@ aarch64_init_cumulative_args (CUMULATIVE_ARGS *pcum,
}
}
+void
+aarch64_init_cumulative_incoming_args (CUMULATIVE_ARGS *pcum,
+ const_tree fntype,
+ rtx libname ATTRIBUTE_UNUSED)
+{
+#if !TARGET_MACHO
+ INIT_CUMULATIVE_ARGS (*pcum, fntype, libname, current_function_decl, -1);
+#else
+ int n_named_args = (list_length (TYPE_ARG_TYPES (fntype)));
+
+ aarch64_init_cumulative_args (pcum, fntype, libname, current_function_decl, n_named_args);
+#endif
+}
+
static void
aarch64_function_arg_advance (cumulative_args_t pcum_v,
const function_arg_info &arg)
@@ -7092,6 +7108,7 @@ aarch64_function_arg_advance (cumulative_args_t pcum_v,
pcum->aapcs_stack_size += pcum->aapcs_stack_words;
pcum->aapcs_stack_words = 0;
pcum->aapcs_reg = NULL_RTX;
+ pcum->darwinpcs_n_args_processed++;
}
}
@@ -7147,6 +7164,19 @@ aarch64_function_arg_boundary (machine_mode mode, const_tree type)
#endif
}
+static unsigned int
+aarch64_function_arg_boundary_ca (machine_mode mode, const_tree type,
+ cumulative_args_t ca)
+{
+ CUMULATIVE_ARGS *pcum = get_cumulative_args (ca);
+ bool named_p = pcum->darwinpcs_n_args_processed < pcum->darwinpcs_n_named;
+
+ if (named_p)
+ return aarch64_function_arg_boundary (mode, type);
+ else
+ return MAX (aarch64_function_arg_boundary (mode, type), PARM_BOUNDARY);
+}
+
#if TARGET_MACHO
/* Implement TARGET_FUNCTION_ARG_ROUND_BOUNDARY for darwinpcs which allows
non-standard passing of byte-aligned items [D.2].
@@ -7157,6 +7187,26 @@ aarch64_function_arg_round_boundary (machine_mode, const_tree)
{
return BITS_PER_UNIT;
}
+
+static unsigned int
+aarch64_function_arg_round_boundary_ca (machine_mode mode, const_tree type,
+ cumulative_args_t ca)
+{
+ CUMULATIVE_ARGS *pcum = get_cumulative_args (ca);
+ bool named_p = pcum->darwinpcs_n_args_processed < pcum->darwinpcs_n_named;
+ bool last_named_p = pcum->darwinpcs_n_args_processed + 1 == pcum->darwinpcs_n_named;
+
+ if (named_p)
+ {
+ if (last_named_p)
+ return PARM_BOUNDARY;
+ else
+ return aarch64_function_arg_round_boundary (mode, type);
+ }
+ else
+ return PARM_BOUNDARY;
+}
+
#endif
/* Implement TARGET_GET_RAW_RESULT_MODE and TARGET_GET_RAW_ARG_MODE. */
@@ -26692,9 +26742,15 @@ aarch64_run_selftests (void)
#undef TARGET_FUNCTION_ARG_BOUNDARY
#define TARGET_FUNCTION_ARG_BOUNDARY aarch64_function_arg_boundary
+#undef TARGET_FUNCTION_ARG_BOUNDARY_CA
+#define TARGET_FUNCTION_ARG_BOUNDARY_CA aarch64_function_arg_boundary_ca
+
#if TARGET_MACHO
#undef TARGET_FUNCTION_ARG_ROUND_BOUNDARY
#define TARGET_FUNCTION_ARG_ROUND_BOUNDARY aarch64_function_arg_round_boundary
+
+#undef TARGET_FUNCTION_ARG_ROUND_BOUNDARY_CA
+#define TARGET_FUNCTION_ARG_ROUND_BOUNDARY_CA aarch64_function_arg_round_boundary_ca
#endif
#undef TARGET_FUNCTION_ARG_PADDING
@@ -997,6 +997,8 @@ typedef struct
when placing smaller items for darwinpcs. */
int darwinpcs_sub_word_pos; /* The next byte available within the word for
darwinpcs. */
+ int darwinpcs_n_named; /* Number of named arguments. */
+ int darwinpcs_n_args_processed; /* Number of arguments processed so far. */
bool silent_p; /* True if we should act silently, rather than
raise an error for invalid calls. */
} CUMULATIVE_ARGS;
@@ -1010,6 +1012,9 @@ typedef struct
#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
aarch64_init_cumulative_args (&(CUM), FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS)
+#define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \
+ aarch64_init_cumulative_incoming_args (&(CUM), FNTYPE, LIBNAME)
+
#define FUNCTION_ARG_REGNO_P(REGNO) \
aarch64_function_arg_regno_p(REGNO)