Skip to content

Commit c8fa082

Browse files
committed
Fix function call handling according to Microsoft Arm64 variadic function call ABI
1 parent 5688a17 commit c8fa082

File tree

9 files changed

+422
-18
lines changed

9 files changed

+422
-18
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: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2485,6 +2485,36 @@ aarch64_general_init_builtins (void)
24852485
handle_arm_acle_h ();
24862486
}
24872487

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

gcc/config/aarch64/aarch64-protos.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,8 @@ 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+
void aarch64_ms_variadic_abi_init_builtins (void);
1113+
11121114
tree aarch64_general_fold_builtin (unsigned int, tree, unsigned int, tree *);
11131115
gimple *aarch64_general_gimple_fold_builtin (unsigned int, gcall *,
11141116
gimple_stmt_iterator *);

0 commit comments

Comments
 (0)