https://gcc.gnu.org/g:143396aebf749f8182c77a077cca3b216a7cbebc
commit r16-5199-g143396aebf749f8182c77a077cca3b216a7cbebc Author: Antoni Boucher <[email protected]> Date: Wed Feb 12 17:32:41 2025 -0500 libgccjit: Add the function attributes for setting the ABI gcc/jit/ChangeLog * jit-playback.cc: Support new function attributes. * jit-recording.cc: Support new function attributes. * libgccjit.h: Support new function attributes. gcc/testsuite/ChangeLog: * jit.dg/all-non-failing-tests.h: Mention new test. * jit.dg/test-abi.c: New test. Diff: --- gcc/jit/jit-playback.cc | 32 +++++++++++++++++ gcc/jit/jit-recording.cc | 16 +++++++++ gcc/jit/libgccjit.h | 30 ++++++++++++++++ gcc/testsuite/jit.dg/all-non-failing-tests.h | 3 ++ gcc/testsuite/jit.dg/test-abi.c | 51 ++++++++++++++++++++++++++++ 5 files changed, 132 insertions(+) diff --git a/gcc/jit/jit-playback.cc b/gcc/jit/jit-playback.cc index 00d5e7290ede..75b51e5c9ad8 100644 --- a/gcc/jit/jit-playback.cc +++ b/gcc/jit/jit-playback.cc @@ -580,6 +580,38 @@ const char* fn_attribute_to_string (gcc_jit_fn_attribute attr) return "weak"; case GCC_JIT_FN_ATTRIBUTE_NONNULL: return "nonnull"; + case GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_CALL: + return "cmse_nonsecure_call"; + case GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_ENTRY: + return "cmse_nonsecure_entry"; + case GCC_JIT_FN_ATTRIBUTE_ARM_PCS: + return "pcs"; + case GCC_JIT_FN_ATTRIBUTE_AVR_INTERRUPT: + return "interrupt"; + case GCC_JIT_FN_ATTRIBUTE_AVR_NOBLOCK: + return "noblock"; + case GCC_JIT_FN_ATTRIBUTE_AVR_SIGNAL: + return "signal"; + case GCC_JIT_FN_ATTRIBUTE_GCN_AMDGPU_HSA_KERNEL: + return "amdgpu_hsa_kernel"; + case GCC_JIT_FN_ATTRIBUTE_MSP430_INTERRUPT: + return "interrupt"; + case GCC_JIT_FN_ATTRIBUTE_NVPTX_KERNEL: + return "kernel"; + case GCC_JIT_FN_ATTRIBUTE_RISCV_INTERRUPT: + return "interrupt"; + case GCC_JIT_FN_ATTRIBUTE_X86_FAST_CALL: + return "fastcall"; + case GCC_JIT_FN_ATTRIBUTE_X86_INTERRUPT: + return "interrupt"; + case GCC_JIT_FN_ATTRIBUTE_X86_MS_ABI: + return "ms_abi"; + case GCC_JIT_FN_ATTRIBUTE_X86_STDCALL: + return "stdcall"; + case GCC_JIT_FN_ATTRIBUTE_X86_SYSV_ABI: + return "sysv_abi"; + case GCC_JIT_FN_ATTRIBUTE_X86_THIS_CALL: + return "thiscall"; case GCC_JIT_FN_ATTRIBUTE_MAX: return NULL; } diff --git a/gcc/jit/jit-recording.cc b/gcc/jit/jit-recording.cc index 5c641f690d68..f5ea37d96e9b 100644 --- a/gcc/jit/jit-recording.cc +++ b/gcc/jit/jit-recording.cc @@ -4852,6 +4852,22 @@ static const char * const fn_attribute_reproducer_strings[] = "GCC_JIT_FN_ATTRIBUTE_CONST", "GCC_JIT_FN_ATTRIBUTE_WEAK", "GCC_JIT_FN_ATTRIBUTE_NONNULL", + "GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_CALL", + "GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_ENTRY", + "GCC_JIT_FN_ATTRIBUTE_ARM_PCS", + "GCC_JIT_FN_ATTRIBUTE_AVR_INTERRUPT", + "GCC_JIT_FN_ATTRIBUTE_AVR_NOBLOCK", + "GCC_JIT_FN_ATTRIBUTE_AVR_SIGNAL", + "GCC_JIT_FN_ATTRIBUTE_GCN_AMDGPU_HSA_KERNEL", + "GCC_JIT_FN_ATTRIBUTE_MSP430_INTERRUPT", + "GCC_JIT_FN_ATTRIBUTE_NVPTX_KERNEL", + "GCC_JIT_FN_ATTRIBUTE_RISCV_INTERRUPT", + "GCC_JIT_FN_ATTRIBUTE_X86_FAST_CALL", + "GCC_JIT_FN_ATTRIBUTE_X86_INTERRUPT", + "GCC_JIT_FN_ATTRIBUTE_X86_MS_ABI", + "GCC_JIT_FN_ATTRIBUTE_X86_STDCALL", + "GCC_JIT_FN_ATTRIBUTE_X86_SYSV_ABI", + "GCC_JIT_FN_ATTRIBUTE_X86_THIS_CALL", }; std::string diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h index 1cc5e6a9946c..f9e18b6147e0 100644 --- a/gcc/jit/libgccjit.h +++ b/gcc/jit/libgccjit.h @@ -2139,6 +2139,36 @@ enum gcc_jit_fn_attribute GCC_JIT_FN_ATTRIBUTE_WEAK, GCC_JIT_FN_ATTRIBUTE_NONNULL, + // ARM attributes. + GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_CALL, + GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_ENTRY, + GCC_JIT_FN_ATTRIBUTE_ARM_PCS, + + // AVR attributes. + GCC_JIT_FN_ATTRIBUTE_AVR_INTERRUPT, + GCC_JIT_FN_ATTRIBUTE_AVR_NOBLOCK, + GCC_JIT_FN_ATTRIBUTE_AVR_SIGNAL, + + // AMD GCN attributes. + GCC_JIT_FN_ATTRIBUTE_GCN_AMDGPU_HSA_KERNEL, + + // MSP430 attributes. + GCC_JIT_FN_ATTRIBUTE_MSP430_INTERRUPT, + + // Nvidia PTX attributes. + GCC_JIT_FN_ATTRIBUTE_NVPTX_KERNEL, + + // RISC-V attributes. + GCC_JIT_FN_ATTRIBUTE_RISCV_INTERRUPT, + + // x86 attributes. + GCC_JIT_FN_ATTRIBUTE_X86_FAST_CALL, + GCC_JIT_FN_ATTRIBUTE_X86_INTERRUPT, + GCC_JIT_FN_ATTRIBUTE_X86_MS_ABI, + GCC_JIT_FN_ATTRIBUTE_X86_STDCALL, + GCC_JIT_FN_ATTRIBUTE_X86_SYSV_ABI, + GCC_JIT_FN_ATTRIBUTE_X86_THIS_CALL, + /* Maximum value of this enum, should always be last. */ GCC_JIT_FN_ATTRIBUTE_MAX, }; diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h b/gcc/testsuite/jit.dg/all-non-failing-tests.h index fe9ad1da3f4d..aa9d34346527 100644 --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h @@ -8,6 +8,9 @@ hooks provided by each test case. */ #define COMBINED_TEST +/* test-abi.c: This can't be in the testcases array as it + is target-specific. */ + /* test-accessing-bitfield.c */ #define create_code create_code_accessing_bitfield #define verify_code verify_code_accessing_bitfield diff --git a/gcc/testsuite/jit.dg/test-abi.c b/gcc/testsuite/jit.dg/test-abi.c new file mode 100644 index 000000000000..479fe6923078 --- /dev/null +++ b/gcc/testsuite/jit.dg/test-abi.c @@ -0,0 +1,51 @@ +/* { dg-do compile { target x86_64-*-* } } */ + +#include <stdlib.h> +#include <stdio.h> + +#include "libgccjit.h" + +#define TEST_COMPILING_TO_FILE +#define OUTPUT_KIND GCC_JIT_OUTPUT_KIND_ASSEMBLER +#define OUTPUT_FILENAME "output-of-test-restrict.c.s" +#include "harness.h" + +void +create_code (gcc_jit_context *ctxt, void *user_data) +{ + /* Let's try to inject the equivalent of: +__attribute__((__ms_abi__)) +int t(int x, int y) { + return x * y; +} + */ + gcc_jit_type *int_type = + gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT); + + gcc_jit_param *x = + gcc_jit_context_new_param (ctxt, NULL, int_type, "x"); + gcc_jit_param *y = + gcc_jit_context_new_param (ctxt, NULL, int_type, "y"); + gcc_jit_param *params[2] = {x, y}; + + gcc_jit_function *func_t = + gcc_jit_context_new_function (ctxt, NULL, + GCC_JIT_FUNCTION_EXPORTED, int_type, "t", + 2, params, 0); + gcc_jit_function_add_attribute (func_t, + GCC_JIT_FN_ATTRIBUTE_X86_MS_ABI); + + gcc_jit_block *block = gcc_jit_function_new_block (func_t, NULL); + + gcc_jit_rvalue *result = + gcc_jit_context_new_binary_op ( + ctxt, NULL, GCC_JIT_BINARY_OP_MULT, + int_type, + gcc_jit_param_as_rvalue (x), + gcc_jit_param_as_rvalue (y)); + + gcc_jit_block_end_with_return (block, NULL, result); +} + +/* { dg-final { jit-verify-output-file-was-created "" } } */ +/* { dg-final { jit-verify-assembler-output "movl\\s+%ecx, %eax" } } */
