Skip to content

Commit a9a5e86

Browse files
committed
Fix function call handling according to Microsoft Arm64 variadic function call ABI
1 parent 7b6b916 commit a9a5e86

File tree

9 files changed

+465
-17
lines changed

9 files changed

+465
-17
lines changed

gcc/config.gcc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,10 @@ m32c*-*-*)
346346
;;
347347
aarch64*-*-*)
348348
cpu_type=aarch64
349-
extra_headers="arm_fp16.h arm_neon.h arm_bf16.h arm_acle.h arm_sve.h arm_sme.h arm_neon_sve_bridge.h arm_private_fp8.h arm_private_neon_types.h"
349+
extra_headers="arm_fp16.h arm_neon.h arm_bf16.h arm_acle.h arm_sve.h
350+
arm_sme.h arm_neon_sve_bridge.h arm_private_fp8.h
351+
arm_private_neon_types.h
352+
cross-stdarg.h"
350353
c_target_objs="aarch64-c.o"
351354
cxx_target_objs="aarch64-c.o"
352355
d_target_objs="aarch64-d.o"

gcc/config/aarch64/aarch64-builtins.cc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2485,6 +2485,40 @@ aarch64_general_init_builtins (void)
24852485
handle_arm_acle_h ();
24862486
}
24872487

2488+
#if defined (TARGET_AARCH64_MS_ABI)
2489+
2490+
/* Internal method for aarch64_ms_variadic_abi_init_builtins. */
2491+
2492+
void
2493+
aarch64_ms_variadic_abi_init_builtins (void)
2494+
{
2495+
tree ms_va_ref;
2496+
tree fnvoid_va_end_ms;
2497+
tree fnvoid_va_start_ms;
2498+
tree fnvoid_va_copy_ms;
2499+
tree fnattr_ms = NULL_TREE;
2500+
2501+
fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
2502+
ms_va_ref = build_reference_type (ms_va_list_type_node);
2503+
2504+
fnvoid_va_end_ms = build_function_type_list (void_type_node, ms_va_ref,
2505+
NULL_TREE);
2506+
fnvoid_va_start_ms
2507+
= build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
2508+
fnvoid_va_copy_ms
2509+
= build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
2510+
NULL_TREE);
2511+
2512+
add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
2513+
BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
2514+
add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
2515+
BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
2516+
add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
2517+
BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
2518+
}
2519+
2520+
#endif
2521+
24882522
/* Implement TARGET_BUILTIN_DECL for the AARCH64_BUILTIN_GENERAL group. */
24892523
tree
24902524
aarch64_general_builtin_decl (unsigned code, bool)

gcc/config/aarch64/aarch64-protos.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,11 @@ void aarch64_override_options_internal (struct gcc_options *);
11091109

11101110
const char *aarch64_general_mangle_builtin_type (const_tree);
11111111
void aarch64_general_init_builtins (void);
1112+
1113+
#if defined (TARGET_AARCH64_MS_ABI)
1114+
void aarch64_ms_variadic_abi_init_builtins (void);
1115+
#endif
1116+
11121117
tree aarch64_general_fold_builtin (unsigned int, tree, unsigned int, tree *);
11131118
gimple *aarch64_general_gimple_fold_builtin (unsigned int, gcall *,
11141119
gimple_stmt_iterator *);

0 commit comments

Comments
 (0)